单片机定时器程序

单片机定时器程序,第1张

延时计算公式应该是:

{1 + [1 + (1 + 1 + 2)×TIME1 + 2]×TIME2 + 2}×机器周期

式中的4个1,分别是两条MOV和两条NOP的;

式中的3个2,分别是两条DJNZ和RET的。

即:最后的2,是指令RET的。

计算方法可见:

>

/    名称:8只LED左右来回点亮

说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果

/

#include<reg51h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

//延时

void DelayMS(uint x)

{

uchari;

while(x--)

{

for(i=0;i<120;i++);

}

}

//主程序

void main()

{

uchari;

P2=0x01;

while(1)

{

for(i=0;i<7;i++)

{

P2=_crol_(P2,1);//P2的值向左循环移动

DelayMS(150);

}

for(i=0;i<7;i++)

{

P2=_cror_(P2,1);//P2的值向右循环移动

DelayMS(150);

}

}

}

04  花样流水灯

/    名称:花样流水灯

说明:16只LED分两组按预设的多种花样变换显示

/

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

uchar code Pattern_P0[]=

{

0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,

0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,

0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,

0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,

0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,

0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff

};

uchar code Pattern_P2[]=

{

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,

0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,

0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,

0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,

0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,

0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff

};

//延时

void DelayMS(uint x)

{

uchari;

while(x--)

{

for(i=0;i<120;i++);

}

}

//主程序

void main()

{

uchari;

while(1)

{     //从数组中读取数据送至P0和P2口显示

for(i=0;i<136;i++)

{

P0=Pattern_P0[i];

P2=Pattern_P2[i];

DelayMS(100);

}

}

}

05  LED模拟交通灯

/    名称:LED模拟交通灯

说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮, 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。

/

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P0^0;    //东西向灯

sbit YELLOW_A=P0^1;

sbit GREEN_A=P0^2;

sbit RED_B=P0^3;    //南北向灯

sbit YELLOW_B=P0^4;

sbit GREEN_B=P0^5;

uchar Flash_Count=0,Operation_Type=1; //闪烁次数, *** 作类型变量

//延时

void DelayMS(uint x)

{

uchari;

while(x--)for(i=0;i<120;i++);

}

//交通灯切换

void Traffic_Light()

{

switch(Operation_Type)

{

case1:     //东西向绿灯与南北向红灯亮

RED_A=1;YELLOW_A=1;GREEN_A=0;

RED_B=0;YELLOW_B=1;GREEN_B=1;

DelayMS(2000);

Operation_Type=2;

break;

case2:     //东西向黄灯闪烁,绿灯关闭

DelayMS(300);

YELLOW_A=~YELLOW_A;GREEN_A=1;

if(++Flash_Count!=10)return; //闪烁5次

Flash_Count=0;

Operation_Type=3;

break;

case3:     //东西向红灯,南北向绿灯亮

RED_A=0;YELLOW_A=1;GREEN_A=1;

RED_B=1;YELLOW_B=1;GREEN_B=0;

DelayMS(2000);

Operation_Type=4;

break;

case4:     //南北向黄灯闪烁5次

DelayMS(300);

YELLOW_B=~YELLOW_B;GREEN_B=1;

if(++Flash_Count!=10)return;

Flash_Count=0;

Operation_Type=1;

}

}

//主程序

void main()

{

while(1)Traffic_Light();

}

06  单只数码管循环显示0~9

/    名称:单只数码管循环显示0~9

说明:主程序中的循环语句反复将0~9的段码送至P0口,使数字0~9循环显示

/

#include<reg51h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};

//延时

void DelayMS(uint x)

{

uchart;

while(x--)for(t=0;t<120;t++);

}

//主程序

void main()

{

uchari=0;

P0=0x00;

while(1)

{/ for(;i<11;i++){ P0=~DSY_CODE[i]; DelayMS(300);}  //注:另一方案 /

P0=~DSY_CODE[i];

i=(i+1)%10;

DelayMS(300);

}

}

首先四中模式的前三种,t0和t1完全相同。而模式3只适合定时器t0,t0在该模式下被拆成两个独立的8位计数器th0,tl0,其中tl0可以为8为定时器或计数器,并且使用原来t0的一些控制位和引脚,它们是:c、—t、gate、tr0,,—int0和tf0该模式下的th0,此时只可用作简单的内部定时器功能,它借用原来定时计数器t1的控制位tr1和益处标准tf1,同时占用了t1的中断源。T0:定时模式0:TMOD=0X00;定时模式1:TMOD=0x01,;定时模式2:TMOD=0x02,:定时模式3:TMOD=0x03;TMOD寄存器从高到底:GATE|C/-T|M1|M0|GATE|C/-T|M1|M0高四位控制定时器t1,底四位控制定时器t0其中M0、M1是控制工作模式的,C/-T是控制定时还是计数的、GATE是选通控制。这些都是基本的东西,如果你是刚开学,建议你买本教材看看。

; 电子定时器的设计;

;MCU: AT892051 ;

;MCU-crystal: 12M ;

;Version: 01 ;

;Last Updata: 2007-6-14 ;

;Author: zhaojun ;

;Description: ;

;定时器T0、T1溢出周期为50MS,T0为秒计数用 ;

;S2为功能键、S3为方式选择键 ;

;P1口为字符输出口,采用共阳显示管 ;

;P32~P35为位选,P17为报警发音,P37为被控继电器 ;

;;

;

; 伪定义 ;

;

SL EQU 30H ; SL存放秒的个位数

SH EQU 31H ; SH存放秒的十位数

ML EQU 32H ; ML存放分的个位数

MH EQU 33H ; MH存放分的十位数

HL EQU 34H ; HL存放时的个位数

HH EQU 35H ; HH存放时的十位数

;

L0 EQU 36H ; L0~L3:显示数据存储器

L1 EQU 37H

L2 EQU 38H

L3 EQU 39H

DSPLYP EQU 3AH ; 显示数据指针(DISPLAY-POINT)

PLYTS EQU 3BH ; 显示次数计数器(DISPLAY-TIMES)

;

LPLMOD BIT 39H ; 低两位显示方式(LOW-PLAY-MOD)

HPLMOD BIT 3AH ; 高两位显示方式(HIGH-PLAY-MOD)

BRIGHT BIT 3BH ; DISPLAY子程序参数:亮灭指示位

;

TCOUNT EQU 3CH ; 时间计数器(TIME-COUNT)

;

ADDRES EQU 3DH ; 加1子程序参数

MAX EQU 3EH ; 加1子程序参数

IFDEC BIT 20H ; BCD加法子程序参数

;

R_MOD EQU 3FH ; 响铃方式参数

;

LED4 BIT 30H ; 发光管状态位

BELL BIT P17 ; 蜂鸣器

SWITCH BIT P37 ; 继电器

FKEY BIT P30 ; 功能键 (S1)

MKEY BIT P31 ; 修改键 (S2)

;

WORKIN BIT 38H ; 工作状态指示位

;

;

; 中断入口 ;

;

ORG 0000H

START: LJMP MAIN ; 0000H 引向主程序

LJMP ERR ; 0003H

NOP

NOP

LJMP ERR ; 引向出错处理程序

LJMP PGT0 ; 000BH 引向中断处理程序PGT0

NOP

NOP

LJMP ERR ; 引向出错处理程序

LJMP ERR ; 0013H INT1

NOP

NOP

LJMP ERR

LJMP ERR ; 001BH T1

NOP

NOP

LJMP ERR

LJMP ERR ; 0023H

NOP

NOP

LJMP ERR

LJMP ERR ; 002BH

NOP

NOP

;

;

; 主程序 ;

;

MAIN: MOV IE,#00H ; 关中断

MOV SP,#57H ; 设置堆栈指针

MOV PSW,#00H ; 选用寄存器组0

MOV TMOD,#11H ; 设定中断工作方式为T0和T1

;

MOV A,56H

CJNE A,#0AAH,CSTART ; 判上电复位标志,无标志转冷启动

MOV A,57H

CJNE A,#55H,CSTART ; 无标志转冷启动

AJMP HSTART ; 有上电复位标志转热启动

NOP

NOP

LJMP ERR ; 软件陷阱,引向出错处理程序

CSTART: MOV P1,#0FFH ; 冷启动,全面初始化

MOV P3,#0FFH

MOV TCON,#00H ; 计时停止

MOV TL0,#0B0H ; 赋中断T0初值

MOV TH0,#3CH

MOV TCOUNT,#0AH ; 赋定时器初值

MOV R5,#00H ; R5为一空单元(备用)

MOV R4,#00H ; R4 为工作模式选择寄存器

MOV SL,#00H ; 定时单元清零

MOV SH,#00H ; 秒

MOV ML,#00H ;

MOV MH,#00H ; 分

MOV HL,#00H ;

MOV HH,#00H ; 时

MOV PLYTS,#64H ; 赋显示次数初值为100次

MOV DSPLYP,#L0 ; 显示指针指向显存单元

MOV L0,#0AH ; 送显示数据"-----"

MOV L1,#0AH

MOV L2,#0AH

MOV L3,#04H

SETB LED4 ; LED4为数码管之间的发光二极管

SETB LPLMOD ; 设定显示方式为闪烁

SETB HPLMOD ;

SETB BRIGHT ; 允许显示

CLR WORKIN ; 清工作标志 , 待命

AJMP SETUP ; 转开始工作

NOP

NOP

LJMP ERR ; 软件陷阱

HSTART: MOV SCON,#00H ; 有上电标志,热启动,清串行口控制寄存器

MOV IP,#00H ; 清中断优先控制寄存器

SETB FKEY ; 重设按键

SETB MKEY

SETB EA ; 开中断

AJMP BEGIN ; 转向继续工作

NOP

NOP

LJMP ERR ; 软件陷阱

SETUP: SETB EA ; 开中断

;

MAIN1: ACALL DISPLY ; 调用显示

JB FKEY,JUDGE ; 按键扫描

ACALL KEYDLY ; 延时消抖动

JB FKEY,JUDGE ; 无键按下转向判断是否到点

CLR ET0 ; 功能键被按下,则

CLR TR0 ; 暂停计时

ACALL MENU ; 调用菜单设置程序

BEGIN: SETB WORKIN ; 置工作标志位,开始工作

SETB ET0 ; 开中断

SETB TR0 ; 开始计时

MOV A,R4 ; 移入工作模式选择

RL A ; 指针放大

MOV DPTR,#M_TAB

JMP @A+DPTR ; 根据工作模式跳转到相应程序段

M_TAB: AJMP WORK1

AJMP WORK2

AJMP WORK3

AJMP WORK4

NOP

NOP

LJMP ERR ; 软件陷阱

WORK1: ;

WORK2: CLR SWITCH ; 工作方式1和2:开继电器

AJMP MAIN2

NOP

NOP

LJMP ERR ; 软件陷阱

WORK3: ;

WORK4: SETB SWITCH ; 工作方式3和4:不开继电器

MAIN2: CLR BELL ; 蜂鸣器短鸣一声,以示开始工作

ACALL DL05S

SETB BELL

JUDGE: JNB WORKIN,MAIN1 ; 判断是否在定时之中

MOV A,SL ; 判断秒是否为零

JNZ MAIN1

MOV A,SH ; 判断秒是否为零

JNZ MAIN1

MOV A,ML ; 判断分是否为零

JNZ MAIN1

MOV A,MH ; 判断分是否为零

JNZ MAIN1

MOV A,HL ; 判断时是否为零

JNZ MAIN1

MOV A,HH ; 判断时是否为零

JNZ MAIN1 ; 若时分秒全为零则

CLR ET0 ; 停止计时

CLR TR0 ;

ACALL ACTION ; 调用到点工作子程序

AJMP MAIN ; 返回

NOP

NOP

LJMP ERR ; 软件陷阱

;

;

; 倒计时程序 ;

;

PGT0: CLR EA ; 关中断

PUSH ACC ; 保护现场

PUSH PSW

PUSH DPL

PUSH DPH

MOV PSW,#08H ; 选用寄存器组1

CLR TR0 ; 暂停计时

MOV A,#0B7H ; 中断同步修正

ADD A,TL0

MOV TL0,A

MOV A,#3CH

ADD A,TH0

MOV TH0,A

SETB TR0 ; 恢复计时

DEC TCOUNT ; 定时器T0每50 000毫秒溢出一次,则

MOV A,TCOUNT ; 溢出10次为05秒

JNZ OUTT0 ; 判断是否到半秒

MOV TCOUNT,#0AH ;

CPL LED4 ; 若到半秒LED取反

JNB LED4,OUTT0 ; LED每闪烁一次是一秒

MOV R0,#SH ; 移入秒位的地址

SETB IFDEC ; BCD子程序参数,使其做减法

ACALL ADDBCD ; 调用BCD子程序, 秒减1

CJNE R3,#99H,OUTT0 ; 判断秒要否借位

MOV SH,#05H ; 要借位则

MOV SL,#09H ; 送数据59(否则显示99)

MOV R0,#MH ; 移入分位的地址

ACALL ADDBCD ; 分减1

CJNE R3,#99H,OUTT0 ; 判断分要否借位

MOV MH,#05H

MOV ML,#09H

MOV R0,#HH

ACALL ADDBCD

OUTT0: POP DPH ; 恢复现场

POP DPL

POP PSW

POP ACC

SETB EA

RETI ; 中断返回

NOP

NOP

LJMP ERR ; 软件陷阱

;

;

;

; BCD子程序(加1或减1 ) ;

;

ADDBCD: MOV A,@R0 ; 移入被 *** 作数的高位

DEC R0 ; 指针减一

SWAP A

ORL A,@R0 ; 移入被 *** 作数的低位

MOV B,#01H ; B寄存器送立即数#01H

MOV C,IFDEC ; 若减法标志位为1,则

MOV B3,C ;

MOV B4,C ; B寄存器的值被改为#99H

MOV B7,C ;

ADD A,B ; 对一个压缩的BCD码加#99H等于对其减一

DA A ; BCD码调整

MOV R3,A ; 暂存结果

ANL A,#0FH ; 取低位码

MOV @R0,A ; 存数

MOV A,R3 ; 取回结果

INC R0 ; 指针加一

SWAP A ; 交换

ANL A,#0FH ; 取结果数的高位

MOV @R0,A ; 存数

RET

NOP

NOP

LJMP ERR ; 软件陷阱

;

;

; 加1程序 ;

;

ADDONE: MOV R0,ADDRES ; 移入被加数单元的地址

CLR IFDEC ; 设定BCD子程序做加法

ACALL ADDBCD ; 调用BCD子程序

CLR C ; 判断被加数是否大于

MOV A,R3 ; 最大值"MAX"

CJNE A,MAX,JGOVER

JGOVER: JC ENDADO

CLR A ; 若大于"MAX",则清零

MOV @R0,A

DEC R0

MOV @R0,A

ENDADO: RET

NOP

NOP

LJMP ERR ; 软件陷阱

;

;

; 调时快进程序 ;

;

QUICK: CLR LPLMOD ; 设定显示方式不闪烁

CLR HPLMOD

ACALL ADDONE ; 调用加1子程序

MOV L0,R4 ; 将工作模式选择数移入显存

INC L0 ; 加1转化成显示值

ACALL KEYDLY ; 延时

ACALL DL100

JNB MKEY,QUICK ; 判断键是否松开

SETB LPLMOD ; 若松开则恢复闪烁显示方式

CJNE R6,#02H,ENDQUK

SETB HPLMOD

CLR LPLMOD

ENDQUK: RET

NOP

NOP

LJMP ERR ; 软件陷阱

;

;

;

; 功能菜单程序 ;

;

MENU: MOV R6,#00H ; 初始化; R6 计功能键按键次数

MOV ADDRES,#05H ; 将 R5 的地址送入,以便于改变 R4 的值

MOV MAX, #04H ; 定义工作模式选择寄存器R4 的最大值

MOV DSPLYP,#L0 ; 定义显示指针指向显存

SETB LPLMOD ; 设定低两位数闪烁

CLR HPLMOD

MOV L0,R4 ; 送显示数据"F-0X"

INC L0

MOV L1,#00H

MOV L2,#0BH

MOV L3,#00H

SETB LED4

;

WAITFK: ACALL DISPLY ; 等待F键释放

JNB FKEY,WAITFK

MENU1: ACALL DISPLY

JB MKEY,JGFKEY ; M键扫描

ACALL KEYDLY ; 延时消抖动

JB MKEY,JGFKEY ; 未按下则转F键扫描

CJNE R6,#00H,NEXT1 ;

MOV SL,#00H ; 若中途改变定时方式,则清除原计时数据

MOV SH,#00H

MOV ML,#00H

MOV MH,#00H

MOV HL,#00H

MOV HH,#00H

NEXT1: MOV R2,#00H ; R2用于判断按键时间是否超过05秒

NEXT2: ACALL ADDONE ; 调用加1程序

MOV L0,R4 ; 移入工作方式选择数

INC L0

;

WAITMK: ACALL DISPLY ; 等待M键释放

INC R2 ; R2自增一

CLR C

CJNE R2,#0C8H,JGQUIC ; 若R2大于等于200则调用快进子程序

JGQUIC: JC WATMK1

ACALL QUICK

WATMK1: JNB MKEY,WAITMK ; R2小于200则等待M键释放

;

JGFKEY: JB FKEY,MENU1 ; 功能(F)键扫描

ACALL KEYDLY ; 延时消抖动

JB FKEY,MENU1 ; 键未按下则转修改(M)键扫描

INC R6 ; F键按键次数加1

MOV A,R6 ; 移入按键次数

RL A ; 指针放大

MOV DPTR,#FUNTAB

JMP @A+DPTR ; 根据按键次数跳转到相应的程序段

FUNTAB: AJMP WAITFK

AJMP SETLOW

AJMP SETHI

AJMP ENDMEN

NOP

NOP

AJMP ENDMEN

;STWKMD: ; 工作模式设定,不需另外改变菜单

;

SETLOW: MOV MAX,#60H ; 设置低位(秒位或分位)

MOV A,R4 ; 移入工作模式选择数

RL A ; 指针放大

MOV DPTR,#FTAB1

JMP @A+DPTR ; 根据工作模式选择数跳转到相应的程序段

FTAB1: AJMP SETSS

AJMP SETM60

AJMP SETSS

AJMP SETM60

NOP

NOP

AJMP WAITFK

SETSS: MOV DSPLYP,#SL ; 设定显示区域为MM:SS

MOV ADDRES,#SH

AJMP WAITFK

SETM60: MOV DSPLYP,#ML ; 设定显示区域为HH:MM

MOV ADDRES,#MH

AJMP WAITFK

;

SETHI: CLR LPLMOD ; 设置高位(分位或时位)

SETB HPLMOD ; 高两位数码管闪烁

MOV MAX,#31H ; 最大数为30

MOV A,R4 ; 移入工作模式选择数

RL A ; 指针放大

MOV DPTR,#FTAB2 ; 移入表首地址

JMP @A+DPTR ; 根据工作模式选择数跳转到相应的程序段

FTAB2: AJMP SETM30

AJMP SETHH

AJMP SETM30

AJMP SETHH

NOP

NOP

AJMP WAITFK ; 返回等待键释放

SETM30: MOV ADDRES,#MH ; 移入分位的地址

AJMP WAITFK ; 转向等待键释放

SETHH: MOV ADDRES,#HH ; 移入时位的地址

AJMP WAITFK ; 转向等待键释放

;

ENDMEN: CLR HPLMOD ; 恢复不闪烁显示方式

RET

NOP

NOP

LJMP ERR ; 软件陷阱

;

;

; 到点工作程序 ;

;

ACTION: MOV L0,R4 ; 移入工作模式选择数

INC L0 ; 送显示数"F-0X"

MOV L1,#00H

MOV L2,#0BH

MOV L3,#00H

SETB LED4

MOV DSPLYP,#L0 ; 指针指向显存

SETB LPLMOD ; 设定显示方式不闪烁

SETB HPLMOD

MOV A,R4 ; 移入工作模式选择数

RL A ;

MOV DPTR,#A_TAB

JMP @A+DPTR ; 根据工作模式选择数跳转

A_TAB: AJMP ACTF1 ; 工作模式一

AJMP ACTF1 ; 工作模式二

AJMP ACTF3 ; 工作模式三

AJMP ACTF3 ; 工作模式四

NOP

NOP

LJMP ERR ; 软件陷阱

ACTF1: SETB SWITCH ; 工作模式一(或二): 关继电器

MOV R_MOD,#82H ; 响铃模式参数#82H

MOV R2,#96H ; 响铃次数参数#96H

ACTF11: ACALL RING ; 调用响铃子程序

JNB MKEY,ENDACT ; 等待键按下

JNB FKEY,ENDACT ; 有键按下则结束响铃

DJNZ R2, ACTF11 ; 次数未满继续响铃

MOV R_MOD,#0FFH ; 参数#0FF使响铃无效

AJMP ACTF11 ; 无键按下返回

NOP

NOP

LJMP ERR ; 软件陷阱

ACTF3: CLR SWITCH ; 工作模式三(或四): 开继电器

CLR BELL ; 蜂鸣器短鸣一声

ACALL DL1S

SETB BELL

MOV R_MOD,#0FFH ; 响铃模式参数#0FFH

MOV R2,#96H ; 响铃时间参数#96H

ACTF31: ACALL RING ; 调用响铃子程序

JNB MKEY,ENDACT ; 等待键按下

JNB FKEY,ENDACT ; 有键按下则结束

DJNZ R2,ACTF31 ; 次数未满继续

MOV R2,#96H ; 重新赋值

CLR BELL ; 短鸣一声(说明: 响铃模式参数#0FFH使

ACALL DL100 ; 响铃程序无效,仅起延时作用,

SETB BELL ; 每延时一段时间短鸣一声,以

AJMP ACTF31 ; 提醒使用者继电器仍在工作)

NOP

NOP

LJMP ERR ; 软件陷阱

ENDACT: SETB SWITCH ; 关继电器

AWAITF: ACALL DISPLY ; 调用显示

JNB FKEY,AWAITF ; 等待键释放

AWAITM: ACALL DISPLY ; 调用显示

JNB MKEY,AWAITM ; 等待键释放

RET

NOP

NOP

LJMP ERR ; 软件陷阱

;

;

; 响铃程序 ;

;

RING: MOV R5,#18H ; R5为循环控制变量

RING1: JNB MKEY,R_EXIT ; 键扫描

JNB FKEY,R_EXIT ; 有键按下则退出

MOV A,R_MOD ; 移入响铃模式参数

MOV C,ACC7 ; 根据响铃模式参数改变响铃

MOV BELL,C

RL A

MOV R_MOD,A

ACALL DL100 ; 延时

DJNZ R5,RING1 ; 循环次数控制

R_EXIT: SETB BELL ; 关闭响铃

RET

NOP

NOP

LJMP ERR ; 软件陷阱

;

;

; 显示程序 ;

;

DISPLY: PUSH ACC ; 数据压栈保护

PUSH PSW

MOV PSW,#10H ; 选用寄存器组2

MOV R0,DSPLYP ; 移入显示指针

MOV R2,#0FDH ; R2寄存的是数码管选通数

MOV A,PLYTS ; 移入显示循环控制量

JNZ PLAY ; 不为0则转PLAY

MOV PLYTS,#64H ; 否则从新赋值

CPL BRIGHT ; 亮灭指示位取反

PLAY: DEC PLYTS ; 显示循环控制量减1

JNB LPLMOD,PLAYL ; 低两位数码管不闪则"PLAYL"

JB BRIGHT,PLAYL ; 亮灭指示为1也"PLAYL"

ACALL NOPLAY ; 否则灭灯延时

AJMP PLAY1 ; 转显示高位数码管

NOP

NOP

LJMP ERR ; 软件陷阱

;用来显示低位

PLAYL: ORL P1,#7FH ; 清原显示数据

ORL P3,#3CH ; 清原选通数据

MOV A,R2 ; 移入数码管位选数

RL A ; 换一位

ANL P3,A ; 选通低位的个位数码管

MOV R2,A ; 暂存位选数

MOV A,@R0 ; 移入显示数值

MOV DPTR,#TABLE1 ; 移入表首地址

MOVC A,@A+DPTR ; 查表

ANL P1,A ; 送显示数据

ACALL DL1MS ; 延时

INC R0 ; 指向低位的十位数

JB P33,PLAYL ; 显示低位的十位数

;

PLAY1: JNB HPLMOD,PLAYH ; 高两位数码管不闪则"PLAYH"

JB BRIGHT,PLAYH ; 亮灭指示为1也"PLAYH"

ACALL NOPLAY ; 否则灭灯延时

AJMP OUTPLY ; 转结束

NOP

NOP

LJMP ERR ; 软件陷阱

;

;用来显示高位

PLAYH: ORL P1,#7FH ; 清原显示数据

ORL P3,#3CH ; 清原选通数据

ANL P3,#0EFH ; 选通高位的个位数数码管

MOV A,@R0 ; 移入显示数值

MOV DPTR,#TABLE1 ; 移入表首地址

MOVC A,@A+DPTR ; 查表

ANL P1,A ; 送显示数据

ACALL DL1MS ; 延时

INC R0 ; 指向高位的十位数

; ; 显示高位的十位数

ORL P1,#7FH ; 清原显示数据

ORL P3,#3CH ; 清原选通数据

ANL P3,#0DFH ; 选通高位的十位数

MOV A,@R0 ; 移入显示数值

MOV C,LED4 ; 指针放大+小灯状态

RLC A ;

MOV DPTR,#TABLE2 ; 移入表首地址

MOVC A,@A+DPTR ; 查表

ANL P1,A ; 送显示数据

ACALL DL1MS ; 延时

;

OUTPLY: POP PSW ; 恢复数据

POP ACC

RET

NOP

NOP

LJMP ERR ; 软件陷阱

;

TABLE1: DB 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0BFH, 8EH,0FFH

; "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "F", " "

;

TABLE2: DB 0FFH, 0DFH, 0F9H, 0D9H, 0A4H, 84H, 0B0H, 90H, 0BFH, 09FH

; " ", " :", "1 ", "1:", "2 ", "2:", "3 ", "3:", "- ", "-:"

;

;

;

;

; 无显示(灭灯)程序 ;

;

NOPLAY: ORL P1,#7FH ; 清显示数据

ORL P3,#3CH ; 清选通数据

INC R0 ; 指针自增2

INC R0

ACALL DL1MS ; 延时

RET

NOP

NOP

LJMP ERR ; 软件陷阱

;

;

; 延时程序 ;

;

DL1MS: MOV R3,#0F9H ; 延时 1250US 只为DISPLY所调用

DL1MS1: NOP

NOP

NOP

DJNZ R3,DL1MS1

RET

NOP

NOP

LJMP ERR ; 软件陷阱

;

KEYDLY: CLR BELL ; 按键消抖动专用延时程序,

ACALL DISPLY ; 在消除抖动的同时发出按键提示音

SETB BELL

RET

NOP

NOP

LJMP ERR ; 软件陷阱

;

DL50MS: MOV R7,#0AH ; 50毫秒延时程序

DL50M1: ACALL DISPLY ; 每调用一次显示程序5MS

DJNZ R7,DL50M1 ; 调用10次

RET

NOP

NOP

LJMP ERR ; 软件陷阱

;

DL100: ACALL DL50MS ; 延时100毫秒

ACALL DL50MS

RET

NOP

NOP

LJMP ERR ; 软件陷阱

;

DL05S: ACALL DL100 ; 延时05秒

ACALL DL100

ACALL DL100

ACALL DL100

ACALL DL100

RET

NOP

NOP

LJMP ERR ; 软件陷阱

;

DL1S: ACALL DL05S ; 延时1秒

ACALL DL05S

RET

NOP

NOP

LJMP ERR ; 软件陷阱

;

;

; ERR(出错处理) 程序 ;

;

ERR: CLR EA ; 关中断

MOV DPTR,#ERR1 ; 准备返回地址

PUSH DPL ; 压栈

PUSH DPH ;

RETI ; 中断返回

ERR1: MOV 56H,#0AAH ; 建立上电标志(出错标志)

MOV 57H,#55H

MOV A,#00H ; 准备返回地址

PUSH ACC ; 压栈

PUSH ACC

RETI ; 中断返回

NOP

NOP

LJMP ERR ; 软件陷阱

;

ORG 07FAH

NOP

NOP

NOP

LJMP ERR ; 软件陷阱

END ; 程序结束

如果是100ms中断一次,那么晶振需要用6MHz

#include<reg51h>

#define uchar unsigned char

uchar t1,sec1,dscan=0,dis[3]={0,0,0};

uchar table={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void t0isr() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

t1++;

if(t1>=20)

{

t1=0;

sec1++;

dis[0]=sec1%10;

dis[1]=sec1%100/10;

dis[2]=sec1/100;

}

}

void t1isr() interrupt 3

{

TH1=(65536-5000)/256;

TL1=(65536-5000)%256;

P2=1<<dscan;

P0=table[dis[dscan]];

}

main()

{

TMOD=0x11;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TH1=(65536-5000)/256;

TL1=(65536-5000)%256;

TR0=1;

ET0=1;

TR1=1;

ET1=1;

EA=1;

t1=0;

sec1=0;

while(1);

}

#include <reg51h>

#define uchar unsigned char

sbit OUT=P2^1;

void InitTimer0( )

{

TMOD = 0x01;

TH0 = (65536-1500)/256;

TL0= (65536-1500)%256; //15ms中断一次

EA = 1;

ET0 = 1;

TR0 = 1;

}

void main( )

{

InitTimer0();

while(1);

}

void Timer1Interrupt( ) interrupt 1

{

TH1 = (65536-1500)/256;

TL1 = (65536-1500)%256;

OUT= !OUT;

}

硬件特征

(1)单片机的体积比较小, 内部芯片作为计算机系统,其结构简单,但是功能完善,使用起来十分方便,可以模块化应用。

(2)单片机有着较高的集成度,可靠性比较强,即使单片机处于长时间的工作也不会存在故障问题。

(3) 单片机在应用时低电压、低能耗,是人们在日常生活中的首要选择, 为生产与研发提供便利。

(4)单片机对数据的处理能力和运算能力较强,可以在各种环境中应用,且有着较强的控制能力。

百度百科-单片机

以上就是关于单片机定时器程序全部的内容,包括:单片机定时器程序、单片机实验利用定时器控制八个LED灯每隔1S每四个为一组轮流点亮、编写8051单片机定时器的初始化程序 (1)T0作为定时,定时时间为10ms (2)T1作等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9288940.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存