上传者:jdchen
例题:一分钟倒计时器
电路原理图:
参考程序:程序由初始化主程序、外部中断服务程序和定时器中断服务程序组成。
;***************************************************************************
; INT1第一次中断启动倒计时,从60秒开始自动计数减1,在右边两个数码管上显示,
; 当计数到零停止,并发出提示音;
; ITN1第二次中断停止倒计时,显示当前值,ITN1第三次中断开始新的一轮倒计时。
;***************************************************************************
;主程序
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIM1
ORG 0013H
AJMP INT1S
ORG 0030H
MAIN: MOV SP,#0a0H
MOV 7aH,#06H;置显示缓冲区初值
MOV 7bH,#00H
MOV 7cH,#10H
MOV 7dH,#00H
MAIN1: MOV 70H,#60H; 计数器置初值
MOV TMOD,#01H
MOV TH0,#90H
MOV TL0,#58H
SETB IT1
SETB EA
SETB EX1
SETB ET0
MOV R4,#04
MOV R3,#00H
CLR 20H.0
CLR F0
WAIT:ACALL DISPLAY
MOV A,70H
ANL A,#0FH
MOV 7BH,A
MOV A,70H
SWAP A
ANL A,#0FH
MOV 7AH,A
MOV 7DH,R3
JNB F0,WAIT
CLR P3.6
MOV R4,#10
L2: MOV R5,#200
L1: CPL P3.7 ;产生短脉冲
ACALL DLAY
ACALL DLAY
DJNZ R5, L1
DJNZ R4, L2
MOV R4,#10
L4: MOV R5,#200
L3: CPL P3.7
ACALL DLAY
ACALL DLAY
MOV R7,#80
DJNZ R7,$
DJNZ R5, L3
DJNZ R4, L4
SETB P3.7
SETB EA
AJMP MAIN1
; ---------------------------------------------------
DLAY: MOV R7,#100
DL1: NOP
DJNZ R7,DL1
RET
;-----------------INT1中断程序--------------------------
INT1S: PUSH ACC
JB 20H.0,INT11
SETB TR0
SETB 20H.0
MOV 70H,#60H; 计数器置初值
MOV R3,#00H
SETB P3.6
SJMP REINT
INT11:
CLR TR0 ;第2次中断
CLR 20H.0
MOV TH0,#90H
MOV TL0,#58H
CLR P3.6
REINT:
POP ACC
RETI
;-----------------定时器中断程序-------------------------
TIM1: PUSH ACC
MOV TH0,#90H
MOV TL0,#58H
CPL P1.2
DJNZ R4 ,RETT1
MOV R4,#4
MOV A,R3
JNZ TM1
MOV R3,#09
MOV A,70H
ADD A,#99H
DA A
MOV 70H,A
TM1: DJNZ R3,RETT1
MOV A,70H
ORL A,R3
JNZ RETT1
CLR TR0
SETB F0
CLR EA
RETT1: POP ACC
RETI
;------------显示子程序----------------
DISPLAY: MOV DPTR,#TABLE
DISPLAY1: MOV R0,#7AH
MOV R1,#0EFH
NEXTT: MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
MOV A,R1
MOV P2,A
LCALL DAY
INC R0
RL A
MOV R1,A
CJNE R1,#0FEH,NEXTT
RET
DAY:
MOV R6,#4
D1:
MOV R7,#248
DJNZ R7,$
DJNZ R6, D1
RET
TABLE: DB C0H ; 0
DB 0F9H ; 1
DB 0A4H ; 2
DB 0B0H ; 3
DB 99H ; 4
DB 92H ; 5
DB 82H ; 6
DB 0F8H ; 7
DB 80H ; 8
DB 90H ; 9
DB 88H ; A
DB 83H ; B
DB 0C6H ; C
DB 0A1H ; D
DB 86H ; E
DB 8EH ; F
DB 0BFH ; -.
DB 86H ; H
DB 8CH ;P
DB 07FH ; .
DB 0A3H ;o
DB 0FFH ; 全黑
END
参考C程序
------------------------------------------------*/
#include
code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9
unsigned char Dis_Shiwei;//定义十位
unsigned char Dis_Gewei; //定义个位
sbit P37=P3^7;
sbit key=P3^3;
sbit P25=P2^5
sbit P24=P2^4;
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{
While(!key);
TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式1,16位定时
TH0=0xd8;
TL0=0xf0;
IE= 0x82; //打开中断
TR0=1; //打开定时开关
while(1)
{
P0=Dis_Shiwei;//显示十位
P25=0;
delay(300); //短暂延时
P25=1;
P0=Dis_Gewei; //显示个位
P24=0;
delay(300);
P24=1;
}
}
/******************************************************************/
/* 定时器中断函数 */
/******************************************************************/
void tim(void) interrupt 1 using 1
{
static unsigned char second=99,count; //初值99
TH0=0xd8; //重新赋值
TL0=0xf0;
count++;
if (count==100)
{
count=0;
second--;//秒减1
if(second==0)
{ //这里添加定时到0的代码 ,可以是灯电路,继电器吸合等,或者执行一个程序
P37=0;
second=60; //减到0是重新赋值99
}
Dis_Shiwei=tab[second/10];//十位显示值处理
Dis_Gewei=tab[second%10]; //个位显示处理
}
}
调试步骤:
1)下载程序:接好通信线,运行STC程序。请参照“LK-51系列单片机实验、应用学习机使用说明”。
按照使用说明中提示的步骤,分别选择单片机型号、打开待下载的程序文件(.HEX文件)、选择通信口和通信波特率(可选38400);
下载程序,先关电源,点击Down Load/下载框,然后再接通电源(冷启动),在左下框中出现程序下载信息,并提示程序下载成功。
2)运行程序:开机运行程序,显示计数初始值。按下外部中断INT1键,第一次中断启动倒计时,从60秒开始自动计数减1,在右边两个数码管上显示。当计数到零停止,并发出提示音。
在计数过程按下中断INT1键,第二次中断停止倒计时,并显示当前值。第三次中断又开始新的一轮倒计时。
本文来源:https://www.2haoxitong.net/k/doc/9de7d73ffe4733687f21aa6d.html
文档为doc格式