找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3141|回复: 1
收起左侧

我做的简易单片机时钟 0-99计数的另一做法 含原理图,代码与仿真

[复制链接]
ID:254333 发表于 2017-12-3 19:38 | 显示全部楼层 |阅读模式
第一次发帖如有不足望指正。这个是我今天制作的.
原理图是用proteus仿真软件做的。存在不足。在定时器那快,计时速度大约快了1倍。所以最后我通过增加循环的方式大致做到1S计时。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.png
也希望有大佬指出我的问题,帮助我,谢谢。
2.png
这是运行起来的图,前两位是分钟,后两位是秒。

0-99计数的另一做法单片机源程序如下:
  1. #include<reg51.h>
  2. sbit key1=P1^5;//开始按键
  3. sbit key2=P1^6;
  4. sbit key3=P1^7;
  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. uchar seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  8. uchar counter=0,second=0,second_1=0,second_0=0,min=0,min_1=0,min_0=0;  

  9. void delay(uint m)
  10.   {
  11.          uint i,j;
  12.          for(i=0;i<m;i++)
  13.                  for(j=0;j<10;j++);
  14.   }
  15.    void display(void)
  16.   {
  17.         P2=seg[second_1];
  18.         P3=0x02;
  19.         delay(20);
  20.         P3=0x00;
  21.         P2=seg[second_0];
  22.         P3=0x01;
  23.         delay(20);
  24.         P3=0x00;
  25.         P2=seg[min_0];
  26.         P3=0x04;
  27.         delay(20);
  28.         P3=0x00;
  29.         P2=seg[min_1];
  30.         P3=0x08;
  31.         delay(20);
  32.         P3=0x00;
  33.     }
  34. void key(void)
  35.   {
  36.    if(key1==0)//判断按键是否被按下
  37.       delay(10);//按键消抖*/
  38.    if(key1==0)//再次判断是否被下
  39.      {
  40.                 EA=1;
  41.                 TR0=1;
  42.        while(!key1)//等待按键释放
  43.             {        
  44.                     display( );
  45.             }
  46.      }
  47.          if(key2==0)//判断按键是否被按下
  48.       delay(10);//按键消抖*/
  49.    if(key2==0)//再次判断是否被下
  50.      {
  51.            display();
  52.            EA=0;
  53.            if(min==60)min=0;
  54.        while(!key2)//等待按键释放
  55.             {        
  56.                     display( );
  57.             }
  58.      }if(key3==0)//判断按键是否被按下
  59.       delay(10);//按键消抖*/
  60.    if(key3==0)//再次判断是否被下
  61.      {
  62.            second=0;
  63.            min=0;
  64.        while(!key3)//等待按键释放
  65.             {        
  66.                     display( );
  67.             }
  68.      }
  69.          }  
  70.                  

  71.   void main( )
  72.   {
  73.         TMOD=0X01;
  74.         TL0=0X3C;
  75.         TH0=0XB0;
  76.         ET0=1;
  77.         
  78.         while(1)
  79.          {
  80.            key();
  81.            min_0=min%10;
  82.            min_1=min/10;
  83.            second_1=second/10;
  84.            second_0=second%10;
  85.            display( );
  86.      }
  87.    }
  88.    void timer()interrupt 1
  89.    {
  90.         ET0=0;
  91.         TL0=0X3C;
  92.         TH0=0XB0;
  93.         counter++;
  94.         if(counter==40){
  95.         counter=0;
  96. ……………………

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

所有资料51hei提供下载:
简易时钟.rar (49.02 KB, 下载次数: 14)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:254333 发表于 2017-12-5 19:31 | 显示全部楼层
发现问题了,文中
TL0=0X3C;
TH0=0XB0;
错误了,应该是
TL0=0XB0;
TH0=0X3C;
所以97行代码最后的counter只需要=20

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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