秒表的设计
设计一个2位的LED数码显示的“秒表”:显示时间为00—99秒,每秒自动加1,另设计一个“开始”键和一个“复位”键。
方案一: 直接用STC89C52芯片加上三个独立按键和两端共阳数码管设计 方案二: 在方案一的基础上加上74LS138动态扫描数码管,使数码管显示更为清晰,这里我们采用方案二进行仿真实验
本系统采用protues仿真,以STC89C52为中心,采用定时器计数原理结合电源电路,晶振电路和少量按键实现了秒表的暂停,开始,复位功能,显示从0到99。 实验中数码管选择错误导致乱码,重新选择后完成实验。 体会到最任何事都要仔细认真一丝不苟学无止境。 《单片机原理与应用 ——基于C51及Protues仿真》 徐爱钧 编著 清华大学出版社 《金沙滩视频教学文件》 实验程序及注释: - #include<reg51.h>
-
- sbit ADDR0 = P1^0;
- sbit ADDR1 = P1^1;
- sbit ADDR2 = P1^2;
- sbit ADDR3 = P1^3;
- sbit ENLED = P1^4;
-
- sbit K4 = P2^7; //设置开始键
- sbit K3 = P2^6; //设置暂停键
- sbit K2 = P2^5; //设置复位键
-
- unsigned char code LedChar[]={
- 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
- 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
- }; //数码管显示字符转换表
- unsigned char LedBuff[2]={
- 0xFF, 0xFF
- }; //数码管显示缓冲区,初值0xFF确保启动时都不亮
- unsigned char i = 0; //定义一个变量用于动态扫描
- unsigned int cnt = 0; //记录T0中断次数
- unsigned char flag1s = 0; //1秒定时标志
-
- void main()
- {
- unsigned char sec = 0; //记录经过的秒数
-
- ENLED = 0; //选择控制数码管
- ADDR3 = 1;
- TMOD = 0x01; //设置T0为模式1
- TH0 = 0xF8; //给T0赋值0xF8CD,定时2ms
- TL0 = 0xCD;
- TR0 = 1; //启动T0
- EA = 1; //使能总中断
- ET0 = 1; //使能T0中断
- P2 = 0xF7;
-
- while(1)
- {
- P0 = 0xFF; //显示消隐
- switch(i) //动态扫描数码管
- {
- case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0];break;
- case 1: ADDR2=0; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[1];break;
- default:break;
- }
- if(flag1s == 1) //判断1秒定时标志
- {
- flag1s = 0; //1秒定时标志清零
- sec++; //秒计数自加1
- LedBuff[0] = LedChar[sec%10]; //取个位数
- LedBuff[1] = LedChar[sec/10%10]; //取十位数
- }
- if(K3 == 0) TR0 = 0; //按下K3,暂停计数
- if(K4 == 0) TR0 = 1; //按下K4,开始计数
- if(K2 == 0) sec = 0; //按下K2,复位
- }
- }
-
- /*定时器0中断服务函数*/
- void InterruptTime0() interrupt 1
- {
- TH0 = 0xF8; //重新加载初值
- TL0 = 0xCD;
- cnt++; //中断次数计数值加1
- if(cnt >= 500) //中断次数500次即1秒
- {
- cnt = 0; //清零
- flag1s = 1; //设置为1秒
- }
- }</b>
复制代码
全部资料51hei下载地址:
秒表的设计与仿真.zip
(209.36 KB, 下载次数: 118)
|