找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10485|回复: 5
收起左侧

数码管前三位显示一个跑表,从000到999之间以1%秒速度运行

[复制链接]
ID:196103 发表于 2017-5-3 16:46 | 显示全部楼层 |阅读模式
学习单片机的作业题源码+PROTEUS仿真,欢迎下载。  
数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,
    当按下一个独立键盘时跑表停止,松开手后跑表继续运行。
    (用定时器设计表)。用另外三个独立键盘实现按下第一个时计时停
    按下第二个时计时开始,按下第三个是计数值清零从头开始。
0.png 0.png

单片机源程序:
  1. /**************************************************
  2.                                 数码管前三位显示一个跑表,从000到
  3.                                 999之间以1%秒速度运行,当按下一个
  4.                                 独立键盘时跑表停止,松开手后跑表
  5.                                 继续运行。(用定时器设计表).
  6.                         
  7. **************************************************/
  8. #include <reg52.h>

  9. #define uchar unsigned char
  10. #define uint unsigned int

  11. uint bai,shi,ge,xx;
  12. uchar a;
  13. sbit du=P2^6;
  14. sbit we=P2^7;
  15. sbit k1=P3^4;
  16. sbit k2=P3^5;
  17. sbit k3=P3^6;
  18. sbit k4=P3^7;
  19. uchar code table[]={
  20. 0x3f,0x06,0x5b,0x4f,
  21. 0x66,0x6d,0x7d,0x07,
  22. 0x7f,0x6f,0x77,0x7c,
  23. 0x39,0x5e,0x79,0x71,
  24. 0x76,0x79,0x38,0x3f};

  25. /*****************************

  26.                                         T0定时器10ms

  27. ******************************/
  28. void ding()
  29. {
  30.         TMOD=0x01;
  31.         TH0=(65536-9216)/256;
  32.         TL0=(65536-9216)%256;
  33.         EA=1;
  34.         ET0=1;
  35.         TR0=1;
  36. }
  37. /*****************************
  38.                                                         
  39.                                         初始化函数

  40. ******************************/
  41. void chushihua()
  42. {
  43.         xx=0;
  44.         du=1;
  45.         P0=0xff;
  46.         du=0;
  47.         we=1;
  48.         P0=0xf8;
  49.         we=0;        
  50. }

  51. /*********************************
  52.                                        
  53.                         延时函数

  54. *********************************/
  55. void delayms(uint x)
  56. {
  57. uint i,j;
  58.     for(i=x;i>0;i--)
  59.     for(j=110;j>0;j--);
  60. }

  61. /**********************************************

  62.                                                         显示函数

  63. **********************************************/
  64. void xianshi(uchar b,uchar s,uchar g)
  65. {
  66.         bai=xx/100;//百位运算
  67.         shi=xx%100/10;//十位运算
  68.         ge=xx%10;//个位运算
  69.         
  70.         we=1;
  71.         P0=0xfe;
  72.         we=0;
  73.         du=1;
  74.         P0=table[b];
  75.         du=0;
  76.         P0=0xff;//防止位未选数码管隐约亮
  77.         delayms(5);
  78.         
  79.         we=1;
  80.         P0=0xfd;
  81.         we=0;
  82.         du=1;
  83.         P0=table[s];
  84.         du=0;
  85.         P0=0xff;
  86.         delayms(5);
  87.         
  88.         we=1;
  89.         P0=0xfb;
  90.         we=0;
  91.         du=1;
  92.         P0=table[g];
  93.         du=0;
  94.         P0=0xff;
  95.         delayms(5);
  96. }

  97. /*******************************

  98.           键盘扫描函数

  99. ********************************/
  100. void keyscan()
  101. {
  102.                 if(k1==0)
  103.                 {
  104.                         delayms(10);
  105.                         if(k1==0)                        
  106.                                 TR0=0;                                
  107.                         do
  108.                                 {
  109.                                         xianshi(bai,shi,ge);
  110.                                 }
  111.                                 while(!k1);
  112.                         
  113.                                 TH0=(65536-9216)/256;
  114.                                 TL0=(65536-9216)%256;//松开按键后定时器重装初值
  115.                                 TR0=1;                                
  116.                 }
  117.                
  118.                
  119.                
  120.           if(k2==0)
  121.                         {
  122.                                 delayms(10);
  123.                                 if(k2==0);        
  124.                                         {
  125.                                    while(!k2)
  126.                                           {
  127.                                                   TR0=0;
  128.                                                         do
  129.                                                         {
  130.                                                    xianshi(bai,shi,ge);
  131.                                       }
  132.                                                         while(TR0==1);
  133.                                           }
  134.                                   }               
  135.                         }
  136.                         
  137.                         
  138.                         if(k3==0)
  139.                         {
  140.                                 delayms(10);
  141.                                 if(k3==0)
  142.                                 {        
  143.                                   while(!k3)
  144.                                         {                                                
  145.                                                 TH0=(65536-9216)/256;
  146.                                                 TL0=(65536-9216)%256;
  147.                                                 TR0=1;
  148.                                         }
  149.                           }        
  150.                         }
  151.                         if(TR0==0)
  152.                         {        
  153.                                         if(k4==0)
  154.                                         {
  155.                                                 delayms(10);
  156.                                                 if(k4==0)
  157.                                                 {        
  158.                                                         while(!k4)
  159.                                                         {                                                
  160.                                                                 xx=0;
  161.                                                         }
  162.                                                 }        
  163.                                         }
  164.                   }
  165. }
  166. /********************************
  167.          
  168.                                                 主函数

  169. ********************************/
  170. void main()
  171. {
  172.         ding();
  173.         chushihua();
  174.         while(1)
  175.          {        
  176.                   keyscan();
  177.                         xianshi(bai,shi,ge);


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

下载:
数码管跑秒.rar (123.74 KB, 下载次数: 48)
回复

使用道具 举报

ID:340061 发表于 2018-5-28 19:54 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:296837 发表于 2018-6-4 16:51 | 显示全部楼层
可以啊,这个思路是不是可以做一些其他的改进,可以回去试试。
回复

使用道具 举报

ID:420518 发表于 2018-11-4 15:12 | 显示全部楼层
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula = P2^6;
sbit wela = P2^7;
sbit key1 = P3^0;
sbit key2 = P3^1;
sbit key3 = P3^2;
sbit key4 = P3^3;

uchar tt,num,bai,shi,ge;
uchar code table[] = {
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71
};
void init();
void keys();
void delay(uint z);
void display(uchar bai,uchar shi,uchar ge);


void main(){
        init();
        while(1);       
}


void init(){
        TMOD = 0x01;       
        TH0 = (65536 - 1000)/256;
        TL0 = (65536 - 1000)%256;       
        EA = 1;
        ET0 = 1;
        TR0 = 1;
        num = 0;
        tt = 0;
        bai = 0;
        shi = 0;
        ge = 0;
        wela = 1;
        P0 = 0xf8;
        wela = 0;
        P0 = 0xff;
        dula = 1;
        P0 = 0x3f;
        dula = 0;
        delay(5);
}



void time0() interrupt 1 {
        TH0 = (65536 - 1000)/256;
        TL0 = (65536 - 1000)%256;
        tt++;
               
        if(tt == 1) {  
                num++;
                if(num == 99)
                        bai++;
                if(bai == 10){bai = 0;}
                if(num == 100){
                        num = 0;
                }
                tt = 0;
            shi = num/10;
            ge = num%10;  
                display(bai,shi,ge);
                keys();       
        }  
}



void keys(){
   if(key1 == 0){
                delay(5);
                if(key1 == 0){     
                        TR0 = 0;
                        while(!key1)
                                display(bai,shi,ge);
                        delay(5);
                        if(key1 == 1){TR0 = 1;}
                        }
                }
        if(key2 == 0){
                delay(5);
                if(key2 == 0){
                        TR0 = 0;
                        while(!key2)
                                display(bai,shi,ge);
                        delay(5);
                        while(!key2);       
                                //display(bai,shi,ge);
                        while(key2!=0&&key3!=0)
                                display(bai,shi,ge);       
                }
        }
        if(key3 == 0){
                delay(5);
                if(key3 == 0){                          
                        display(bai,shi,ge);       
                        num = shi * 10 + ge;
                        TR0 = 1;
                        while(!key3)
                                display(bai,shi,ge);               
                        delay(5);
                        while(!key3);
                }
        }       

        if(key4 == 0){
                delay(5);
                if(key4 == 0){
                wela = 1;
                P0 = 0xf8;
                wela = 0;
                P0 = 0xff;
                dula = 1;
                P0 = 0x3f;
                dula = 0;
                delay(5);
                num = -1;
                bai = 0;
                while(!key4);
                delay(5);
                while(!key4);
                }
        }
}



void display(uchar bai,uchar shi,uchar ge){
        dula = 1;
        P0 = table[bai];
        dula = 0;       
        P0 = 0xff;
        wela = 1;
        P0 = 0xfe;
        wela = 0;
        delay(5);

        dula = 1;
        P0 = table[shi];
        dula = 0;       
        P0 = 0xff;
        wela = 1;
        P0 = 0xfd;
        wela = 0;
        delay(5);

        dula = 1;
        P0 = table[ge];
        dula = 0;       
        P0 = 0xff;
        wela = 1;
        P0 = 0xfb;
        wela = 0;
        delay(5);       
}  



void delay(uint z){
        uint x,y;
        for(x = z;x > 0;x--)
                for(y = 110; y > 0;y--);
}
回复

使用道具 举报

ID:399179 发表于 2018-11-4 18:20 来自手机 | 显示全部楼层
怎么做一个可预置计数器?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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