硬件电路简单,我说下软件部分
用一个定时器定时中断做键盘扫描,数码管用动态扫描的方法,数码管显示和按键处理都放在主程序中进行
;汇编程序如下。
;使用T0定时方式1,每隔50ms中断一次,用于修改时间及显示
;使用外部中断0、1,用于控制启动和清零
;========================================================
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP X0_INT
ORG 000BH
AJMP T0_INT
ORG 0013H
AJMP X1_INT
MAIN:
MOV TMOD,#01H ;T0定时方式1
MOV TH0, #(65536-50000) / 256 ;50ms@12MHz
MOV TL0, #(65536-50000) MOD 256;
SETB TR0
SETB ET0 ;开启定时中断
SETB EX0
SETB EX1
SETB EA ;定时器初始化结束,下面循环显示即可
MOV R1, #99H ;0~99计数.
MOV R7, #1 ;50ms计数.
MOV P0, #0C0H
MOV P2, #0C0H
LOOP:
SJMP LOOP
;-----------------------------------------------------------
DELAY: ;延时子程序.
AA4: MOV R4, #0
DJNZ R4, $
DJNZ R4, $
RET
;-----------------------------------------------------------
X0_INT: ;启动/停止
CPL F0
RETI
;-----------------------------------------------------------
X1_INT: ;清零
MOV R1, #0
MOV P0, #0C0H
MOV P2, #0C0H
RETI
;-----------------------------------------------------------
T0_INT: ;50ms中断执行一次.
MOV TL0, #(65536-50000) MOD 256;
MOV TH0, #(65536-50000) / 256 ;50ms@12MHz
DJNZ R7, T0_END ;中断不到20次.
MOV R7, #20
JNB F0, T0_END
MOV A, R1
ADD A, #1
DA A
MOV R1, A
ANL A, #0FH
MOV DPTR, #TAB
MOVC A, @A+DPTR ;查出段码
MOV P2, A
MOV A, R1
SWAP A
ANL A, #0FH
MOVC A, @A+DPTR ;查出段码
MOV P0, A ;显示十位数.
T0_END:
RETI
;-----------------------------------------------------------
TAB:
DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H, 90H
END
;===========================================================
;仿真截图如下:
电路原理图已画好
实现你描述的全部功能
Keil uVision3编译通过,C语言编写,有详细注释
实机调试通过
留个邮箱发给你...
----------------------------
邮件已发......
用AT89C51设计一个2位的LED数码显示作为“秒表”,这应该是一个仿真题,可用两位一体的共阴数码管,用定时器T0定时,得到1秒计时。
//功能:0~99秒的简易秒表设计,两个静态数码管,定时器采用中断方式
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
uchar count=0; //对50ms定时时间进行计数
uchar miao=0; //秒计数器
//函数名:timer_1()
//函数功能:定时器T1的中断函数,T1在工作方式1下每50秒产生中断,执行该中断函数
//形式参数:无
//返回值:无
void timer_1() interrupt 3 //T1的中断类型号为3
{
TH1=(65536-50000)/256; //重新设置T1计数初值高8位
TL1=(65536-50000)%256; //重新设置T1计数初值低8位
count++; //50ms计数器加1
if(count==20) //1s时间到
{
count=0; //50ms计数器清0
miao++; //秒计数器加1
if(miao==100)miao=0; //miao计数到100,则从0开始计数
}
}
bit b=0;
void int_0() interrupt 0
{
if(b == 0){TR1 = 0;b = 1;}
else
{
b = 0;
TR1 = 1;
}
}
void int_1() interrupt 2
{
miao=0;
count = 0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
}
//函数名:disp
//函数功能:将i的值显示在两个静态连接的数码管上
//形式参数:i,取值范围0~99
//返回值:无
void disp(uchar i)
{
uchar led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//定义0~9显示码,共阳极数码管
P1=led[i/10]; //显示i高位
P2=led[i%10]; //显示i地位
}
void main()
{
TMOD=0x10; //设置T1在工作方式1
TH1=(65536-50000)/256; //设置T1计数初值高8位,定时时间50ms
TL1=(65536-50000)%256; //设置T1计数初值低8位
ET1=1; //开放T1中断允许
EX0 = 1;
IT0 = 1;
EX1 = 1;
IT1=1;
EA=1; //开放总中断允许
TR1=1; //启动T1开始计时
while(1)
{
disp(miao); //显示秒计数器值
}
}
单片机课程设计秒表的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:单片机课程设计秒表