单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1481|回复: 2
打印 上一主题 下一主题
收起左侧

51单片机秒表计时器仿真

[复制链接]
跳转到指定楼层
楼主
功能:计时器相当于秒表,有四个按键分别是开始,存储,回显和复位。
器件:at89c51、两个74H573、排阻、数码管、led、电阻等。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int  u16;
  4. #define duan P0
  5. #define wei P2
  6. /*******端口定义*******/
  7. sbit deng=P1^0;
  8. sbit seg_sel=P1^4;
  9. sbit bit_sel=P1^5;
  10. sbit start=P3^2;
  11. sbit store=P3^3;
  12. sbit diskey=P3^4;
  13. sbit reset=P3^5;
  14. /*******变量定义*******/
  15. u16 tem_ms;
  16. u8 temp_buf[5][3];
  17. u8 arr_pt;
  18. u8 run_flag;//为1开始计数
  19. u8 n_ten_ms,n_sec,n_min;
  20. u8 code seg_table[]={0xc0,0xf9,0xa4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};        //段选
  21. u8 code bit_table[]={0x01,0x02,0x04,0x08,
  22.                                          0x10,0x20,0x40,0x80         //位选         0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xbf}
  23.                     };
  24. void delay(u16 num)
  25. {
  26.    u16 x,y;
  27.    for(x=num;x>0;x--)
  28.      for(y=110;y>0;y--);        
  29. }
  30. void display_led(u8 which_bit,u8 which_number)
  31. {
  32.         bit_sel=1;
  33.         wei=bit_table[which_bit];
  34.         bit_sel=0;
  35.         seg_sel=1;
  36.         duan=seg_table[which_number];
  37.         seg_sel=0;
  38. }
  39.         void display(u8 which_bit,u8 which_number)
  40. {
  41.         u8 x,y;
  42.         x=which_number/10;//分离十位
  43.     y=which_number%10;//分离个位
  44.         display_led(5,16);
  45.     delay(2);
  46.     display_led(2,16);
  47.     delay(2);
  48.         if(which_bit==1)
  49.         {
  50.                 display_led(6,y);
  51.         delay(2);
  52.                 display_led(7,x);
  53.         delay(2);
  54.                
  55.         }
  56.    if(which_bit==2)
  57.         {
  58.                 display_led(4,y);
  59.         delay(2);
  60.                 display_led(3,x);
  61.         delay(2);
  62.                
  63.         }
  64.    if(which_bit==3)
  65.         {
  66.                 display_led(1,y);
  67.         delay(2);
  68.                 display_led(0,x);
  69.         delay(2);
  70.                
  71.         }
  72. }
  73. void reflash(void)
  74. {
  75.     display(1,n_ten_ms);
  76.         display(2,n_sec);
  77.         display(3,n_min);
  78. }
  79. int main(void)
  80. {
  81.         TMOD=0x01;
  82.         TH0=(65535-10000)/256;
  83.     TL0=(65535-10000)%256;
  84.         EA=1;
  85.     ET0=1;//开放定时器0的溢出中断
  86.         //TR0=1;
  87.         while(1)
  88.         {
  89.                 if(start==0)//开始程序
  90.                 {
  91.                     deng=0;
  92.                         delay(5);
  93.                         if(start==0)
  94.                         {
  95.                                 run_flag=~run_flag;
  96.                         }while(!start);
  97.                 }
  98.                 if(reset==0)//复位程序
  99.                 {
  100.                     deng=1;
  101.                         delay(5);
  102.                         if(reset==0)
  103.                         {
  104.                                 n_ten_ms = 0;
  105.                                 n_sec = 0;
  106.                                 n_min = 0;
  107.                         }while(!reset);
  108.                        
  109.                 }
  110.                 if(store==0)//存储程序
  111.                 {
  112.                         delay(5);
  113.                         if(store==0)
  114.                         {
  115.                                 if((arr_pt>=0)&&(arr_pt<5))
  116.                                         temp_buf[arr_pt][0]=n_ten_ms;
  117.                         temp_buf[arr_pt][1]=n_sec;
  118.                                         temp_buf[arr_pt][2]=n_min;
  119.                                 arr_pt++;
  120.                         }while(!store);       
  121.                 }
  122.                         if(run_flag)//运行模式标志位
  123.                         {
  124.                                 TR0=1;//开始计数
  125.                         }
  126.                        
  127.                         else if(!run_flag)
  128.                         {
  129.                                 TR0=0;
  130.                                 if(diskey==0)//回显程序
  131.                                 {
  132.                                         delay(5);
  133.                                         if(diskey==0)
  134.                                         {
  135.                                                 arr_pt--;
  136.                                                 n_ten_ms= temp_buf[arr_pt][0];
  137.                                 n_sec= temp_buf[arr_pt][1];
  138.                                                 n_min= temp_buf[arr_pt][2];
  139.                                         }while(!diskey);
  140.                                 }
  141.                         }
  142.                 reflash();       
  143.         }

  144. }
  145. void t0_server(void) interrupt 1//中断服务函数
  146. {
  147.         TH0=(65535-10000)/256;
  148.     TL0=(65535-10000)%256;
  149.         n_ten_ms++;
  150.         if(n_ten_ms>=80)
  151.                 {
  152.                         n_ten_ms=0;
  153.             n_sec++;
  154.                         if(n_sec>=60)
  155.                         {
  156.                                 n_sec=0;
  157.                                 n_min++;
  158.                                 if(n_min>=60)
  159.                                         n_min=0;
  160.                         }

  161.                 }
  162. }
复制代码

所有资料51hei提供下载:
计时器.rar (75.4 KB, 下载次数: 38)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
yydjh 发表于 2018-12-28 12:47 | 只看该作者
很不错
回复

使用道具 举报

板凳
榆林上校 发表于 2019-1-24 16:21 | 只看该作者
有时间做一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51hei电子论坛2群 联系QQ:125739409;技术交流QQ群219535678

Powered by 单片机教程网

快速回复 返回顶部 返回列表