标题: 单片机00—99秒表的设计报告与Proteus仿真 [打印本页]

作者: 362443451    时间: 2018-12-17 22:35
标题: 单片机00—99秒表的设计报告与Proteus仿真

秒表的设计


设计一个2位的LED数码显示的“秒表”:显示时间为00—99秒,每秒自动加1,另设计一个“开始”键和一个“复位”键。


方案一:

直接用STC89C52芯片加上三个独立按键和两端共阳数码管设计

方案二:

在方案一的基础上加上74LS138动态扫描数码管,使数码管显示更为清晰,这里我们采用方案二进行仿真实验





本系统采用protues仿真,以STC89C52为中心,采用定时器计数原理结合电源电路,晶振电路和少量按键实现了秒表的暂停,开始,复位功能,显示从0到99。

实验中数码管选择错误导致乱码,重新选择后完成实验。

体会到最任何事都要仔细认真一丝不苟学无止境。

《单片机原理与应用  ——基于C51及Protues仿真》  徐爱钧 编著 清华大学出版社

《金沙滩视频教学文件》

实验程序及注释:

  1. #include<reg51.h>

  2. sbit ADDR0 = P1^0;
  3. sbit ADDR1 = P1^1;
  4. sbit ADDR2 = P1^2;
  5. sbit ADDR3 = P1^3;
  6. sbit ENLED = P1^4;

  7. sbit K4 = P2^7;              //设置开始键
  8. sbit K3 = P2^6;                                                        //设置暂停键
  9. sbit K2 = P2^5;                                                        //设置复位键

  10. unsigned char code LedChar[]={
  11.               0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  12.               0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  13.               };                                                                                                                              //数码管显示字符转换表
  14. unsigned char LedBuff[2]={                                                      
  15.               0xFF, 0xFF
  16.               };                                                                                                                              //数码管显示缓冲区,初值0xFF确保启动时都不亮
  17. unsigned char i = 0;                                                                      //定义一个变量用于动态扫描
  18. unsigned int cnt = 0;                                                                      //记录T0中断次数
  19. unsigned char flag1s = 0;                                                        //1秒定时标志

  20. void main()
  21. {
  22.               unsigned char sec = 0;                                                        //记录经过的秒数
  23.             
  24.               ENLED = 0;                                                                                                  //选择控制数码管
  25.               ADDR3 = 1;                                                                                                
  26.               TMOD = 0x01;                                                                                    //设置T0为模式1
  27.               TH0 = 0xF8;                                                                                                  //给T0赋值0xF8CD,定时2ms
  28.               TL0 = 0xCD;
  29.               TR0 = 1;                                                                                                    //启动T0
  30.               EA = 1;                                                                                                                //使能总中断
  31.               ET0 = 1;                                                                                                  //使能T0中断
  32.               P2 = 0xF7;

  33.               while(1)
  34.               {            
  35.                             P0 = 0xFF;                                                                                                     //显示消隐
  36.                    switch(i)                                                                                                     //动态扫描数码管            
  37.                             {
  38.                                           case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0];break;
  39.                                           case 1: ADDR2=0; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[1];break;
  40.                                           default:break;
  41.                             }
  42.                             if(flag1s == 1)                                                                        //判断1秒定时标志
  43.                             {
  44.                                           flag1s = 0;                                                                      //1秒定时标志清零
  45.                                           sec++;                                                                                    //秒计数自加1
  46.                                           LedBuff[0] = LedChar[sec%10];                   //取个位数
  47.                                           LedBuff[1] = LedChar[sec/10%10];                //取十位数
  48.                             }
  49.                             if(K3 == 0) TR0 = 0;                                                          //按下K3,暂停计数
  50.                             if(K4 == 0) TR0 = 1;                                                          //按下K4,开始计数
  51.                             if(K2 == 0)              sec = 0;                                                          //按下K2,复位
  52.               }
  53. }

  54. /*定时器0中断服务函数*/
  55. void InterruptTime0() interrupt 1                           
  56. {
  57.               TH0 = 0xF8;                                                                                       //重新加载初值
  58.               TL0 = 0xCD;
  59.               cnt++;                                                                                                                   //中断次数计数值加1
  60.               if(cnt >= 500)                                                                                       //中断次数500次即1秒
  61.               {
  62.                             cnt = 0;                                                                                       //清零
  63.                             flag1s = 1;                                                                                       //设置为1秒
  64.               }
  65. }</b>
复制代码



全部资料51hei下载地址:

秒表的设计与仿真.zip (209.36 KB, 下载次数: 118)



作者: 帅气的小哥哥    时间: 2021-12-16 10:48
请问里面有原理图吗?
作者: 221212534534df    时间: 2021-12-16 13:44
谁能根据楼主的资料画个PCB吗?





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1