单片机秒表程序
MIAO EQU 50H;定义秒值存放在50H单元
SMIAO EQU 51H;定义十位秒值存放在51H单元
GMIAO EQU 52H;定义个位秒值存放在52H单元
ORG 0000H
LJMP START
ORG 000BH;定时器T0中断入口地址
LJMP T0FW;跳转到T0服务程序
ORG 0030H
START: MOV P2,#00H;控制所有数码管都不显示
MOV R0,#20;用R0来记录50ms中断的个数,20次50ms为1s
MOV MIAO,#0;初始化秒值为0
MOV SMIAO,#0C0H;给十位秒值送0的显示码,在开机时显示0
MOV GMIAO,#0C0H;给个位秒值送0的显示码,在开机时显示0
MOV TMOD,#01H;设定T0工作于方式1,定时方式
MOV TH0,#3CH;设定T0定时50ms的初值
MOV TL0,#0B0H
SETB EA;允许中断
SETB ET0;允许T0中断
SETB TR0;启动定时器T0
;循环显示
LOOP: MOV P0,SMIAO;给数码管送smiao的显示码
SETB P2.0;控制第1位数码管显示smiao的值
LCALL DELAY;延时保留显示状态
CLR P2.0;消影(清除显示)
MOV P0,GMIAO;给数码管送gmiao的显示码
SETB P2.1;控制第2位数码管显示gmiao的值
LCALL DELAY;延时保留显示状态
CLR P2.1;消影(清除显示)
LJMP LOOP
;T0的中断服务程序
T0FW: MOV TH0,#3CH;重装定时器T0定时50ms初值
MOV TL0,#0B0H
DJNZ R0,FH;判断20次50ms时间是否到,如果没有到,直接返回
MOV R0,#20;如果1s时间到,把计数值重新装入R0,为下一个1s做准备
INC MIAO;1s时间到,给秒值加1
MOV A,MIAO;判断秒值是否到60
CJNE A,#60,CALC;如果没有到60s,转移到
MOV MIAO,#0;如果到了60s,强制将秒值设为0
;十位和个位的拆分计算程序
CALC: MOV A,MIAO;将秒值除10,商即为十位,余数即为个位
MOV B,#10
DIV AB;商在A中,余数在B中,即十位在A中,个位在B中
MOV DPTR,#TABLE;查表查出十位秒值对应在显示码
MOVC A,@A+DPTR
MOV SMIAO,A
MOV A,B;查表查出个位秒值对应在显示码
MOVC A,@A+DPTR
MOV GMIAO,A
FH: RETI
;共阳数码管的显示码
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DELAY: MOV R7,#1 DEL3: MOV R6,#1
DEL2: MOV R5,#126 DEL1: DJNZ R5,DEL1
DJNZ R6,DEL2
DJNZ R7,DEL3
RET
END
#include #define uchar unsigned char
#define uint unsigned int
sbit led0=P1^0;
void delay(uint x);
void main()
{
while(1)
{
led0=0;
delay(500);
led0=1;
delay(500);
}
}
void delay(uint x) {
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
#include #include //循环移动的头文件 #define uchar unsigned char//无符号字符型 相当于8位存储单元(Byte) 0~255
#define uint unsigned int//无符号整型 相当于16位存储单元(2Byte) 0~65535
void delay(uint x); void main()
{
P1 = 0xfe;
while(1)
{
delay(500);
P1=_crol_(P1,1);
}
}
void delay(uint x) {
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--); }