找回密码
 立即注册

QQ登录

只需一步,快速开始

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

可显示分秒的51单片机定时器秒表仿真(矩阵键盘输入+8位数码管)C语言源程序

[复制链接]
跳转到指定楼层
楼主
这是我上个月做的单片机电路图及proteus仿真图用了一星期的时间
附件里有proteus仿真电路图和文件单片机源代码
都是自己原创的,没有错误,还带注释,方便理解,方便使用
可以显示分秒,运用定时器设计的一款秒表仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>
  2. #define u8 unsigned char
  3. #define u16 unsigned int
  4. /******端口定义******/
  5. #define DATA P0
  6. sbit seg_sel = P1^4;
  7. sbit bit_sel = P1^5;
  8. sbit start = P3^2;
  9. sbit store = P3^3;
  10. sbit diskey = P3^4;
  11. sbit reset = P3^5;
  12. /*********变量定义********/
  13. u16 tem_ms;
  14. u8 n_ten_ms,n_sec,n_min;
  15. u8 run_flag;   //当run_flag为1,代表开始计数
  16. u8 code seg_tab[]=
  17. {
  18.         0xc0,0xf9,0xa4,0xb0,
  19.         0x99,0x92,0x82,0xf8,
  20.         0x80,0x90,0x88,0x83,
  21.         0xc6,0xa1,0x86,0x8e
  22. };
  23. u8 code bit_tab[]=
  24. {
  25.         0x01,0x02,0x04,0x08,
  26.         0x10,0x20,0x40,0x80
  27. };
  28. u8 temp_buf[5][3];
  29. u8 arr_pt;
  30. void delay(u16 x)
  31. {
  32.         u16 i,j;
  33.         for(i=x;i>0;i--)
  34.         for(j=110;j>0;j--);
  35. }
  36. void display_led(u8 which_bit,u8 which_number)
  37. {
  38.         bit_sel = 1;
  39.         DATA = bit_tab[which_bit];
  40.         bit_sel = 0;
  41.         seg_sel = 1;
  42.         DATA = seg_tab[which_number];
  43.         seg_sel = 0;
  44.         
  45. }
  46. void display(u8 which_bit,which_number)
  47. {
  48.         u8 x,y;
  49.         x = which_number/10;  // 分离十位
  50.         y = which_number%10;   //分离个位
  51.         if(which_bit == 1)
  52.         {
  53.                 display_led(7,y);
  54.                 delay(2);
  55.                 display_led(6,x);
  56.                 delay(2);
  57.         }
  58.         if(which_bit ==2)
  59.         {
  60.                 display_led(4,y);
  61.                 delay(2);
  62.                 display_led(3,x);
  63.                 delay(2);
  64.         }
  65.         if(which_bit ==3)
  66.         {
  67.                 display_led(1,y);
  68.                 delay(2);
  69.                 display_led(0,x);
  70.                 delay(2);
  71.         }

  72. }
  73. void reflash(void)
  74. {
  75.                 display(1,n_ten_ms);
  76.                 delay(2);
  77.                 display(2,n_sec);
  78.                 delay(2);
  79.                 display(3,n_min);
  80.                 delay(2);
  81. }
  82. int main(void)
  83. {
  84.         TMOD = 0x01;         //设置定时/计数器T0
  85.         TH0 = (65535-10000)/256;
  86.         TL0 = (65535-10000)%256;
  87.         EA = 1;                   //开放总中断
  88.         ET0 = 1;          //开放定时器0的溢出中断
  89.         //TR0 = 1;         //开始定时
  90.         while(1)
  91.         {
  92.                 if(start == 0)
  93.                 {
  94.                         delay(10);
  95.                         if(start ==0)
  96.                         {
  97.                                 run_flag = ~run_flag;        
  98.                         } while(!start);
  99.                 }
  100.                 if(reset == 0&&run_flag ==0)
  101.                 {
  102.                         delay(10);
  103.                         if(reset == 0)
  104.                         {
  105.                                 n_ten_ms = 0;
  106.                             n_sec =0;
  107.                                 n_min = 0;
  108.                         }  while(!reset);
  109.                 }
  110.                 if(store == 0)
  111.                 {
  112.                         delay(10);
  113.                         if(store ==0)
  114.                         {
  115.                                 if((arr_pt>=0)&&arr_pt<5)
  116.                                 {
  117.                                         temp_buf[arr_pt][0]= n_ten_ms;
  118.                                         temp_buf[arr_pt][1]= n_sec;
  119.                                         temp_buf[arr_pt][2]= n_min;
  120.                                         arr_pt++;
  121.                                 }

  122.                         }  while(!store);

  123.                 }
  124.                 if(run_flag)
  125.                 {
  126.                         TR0 = 1;
  127.                 }
  128.                 else if(!run_flag)
  129.                 {
  130.                         TR0 = 0;
  131.                         if(diskey ==0)
  132.                         {
  133.                                 delay(5);
  134.                                 if(diskey == 0)
  135.                                 {
  136.                                         arr_pt --;
  137.                                         n_ten_ms = temp_buf[arr_pt][0];
  138.                                         n_sec = temp_buf[arr_pt][1];
  139.                                         n_min = temp_buf[arr_pt][2];
  140.                                 }  while(!diskey);
  141.                         }
  142.                 }
  143.                 reflash();
  144.         }        
  145. }
  146. ……………………

  147. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
mabiao_diy.zip (84.49 KB, 下载次数: 79)


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

使用道具 举报

沙发
ID:324967 发表于 2018-5-8 19:01 | 只看该作者
proteus文件里边找不到能打开的
回复

使用道具 举报

板凳
ID:342728 发表于 2018-6-3 22:59 | 只看该作者
有接线方式吗?
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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