标题: 我做的简易单片机时钟 0-99计数的另一做法 含原理图,代码与仿真 [打印本页]

作者: icandoit    时间: 2017-12-3 19:38
标题: 我做的简易单片机时钟 0-99计数的另一做法 含原理图,代码与仿真
第一次发帖如有不足望指正。这个是我今天制作的.
原理图是用proteus仿真软件做的。存在不足。在定时器那快,计时速度大约快了1倍。所以最后我通过增加循环的方式大致做到1S计时。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

也希望有大佬指出我的问题,帮助我,谢谢。

这是运行起来的图,前两位是分钟,后两位是秒。

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黑下载附件…………
复制代码


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




作者: icandoit    时间: 2017-12-5 19:31
发现问题了,文中
TL0=0X3C;
TH0=0XB0;
错误了,应该是
TL0=0XB0;
TH0=0X3C;
所以97行代码最后的counter只需要=20




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