找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2871|回复: 0
收起左侧

51单片机定时器时钟_8位数码管_Proteus仿真代码

[复制链接]
ID:714407 发表于 2021-11-1 02:15 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif
proteus.png keil.png

单片机源程序如下:
  1. #include <AT89X52.h>       //调用51单片机的头文件
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit LS164_DATA = P3^0; //74LS164数据线
  5. sbit LS164_CLK  = P3^1;  //74LS164时钟线
  6. sbit LS164_MR   = P3^3;   //74LS164使能
  7. sbit HOUR_A     = P1^0;
  8. sbit HOUR_S     = P1^1;
  9. sbit MINUTE_A   = P1^2;
  10. sbit MINUTE_S   = P1^3;
  11. sbit SECOND_A   = P1^4;
  12. sbit SECOND_S   = P1^5;
  13. sbit CLOCK_ON   = P1^6;
  14. sbit CLOCK_OFF  = P1^7;

  15. //---------------------------------------
  16. //数码管字形表,供显示时查询
  17. unsigned char code LED[11]=
  18. {                          //定义表格一定要使用code,这样会做到程序存储区中
  19.     0x3F,                  //"0"的字形表,0B00111111
  20.     0x06,                  //"1"的字形表,0B00000110
  21.     0x5B,                  //"2"的字形表,0B01011011
  22.     0x4F,                  //"3"的字形表,0B01001111
  23.     0x66,                  //"4"的字形表,0B01100110
  24.     0x6D,                  //"5"的字形表,0B01101101
  25.     0x7D,                  //"6"的字形表,0B01111101
  26.     0x07,                  //"7"的字形表,0B00000111
  27.     0x7F,                  //"8"的字形表,0B01111111
  28.     0x6F,                  //"9"的字形表,0B01101111
  29.     0x40,                  //"-",         0B01000000
  30. };

  31. uint miao=0;                //秒
  32. uint fen=15;                        //分
  33. uint shi=12;                    //时
  34. uint n=0;                        //计数
  35. uint i=0;
  36. uint state=0;
  37. uint date[6]={0,0,0,0,0,0};          //定义一个有6个地址的数组,分别存时分秒的个位和十位

  38. //---------------------------------------
  39. //8位数码管相关I/O设置
  40. //P2.0-P2.2为3-8译码器U16的3个输入,P2=0x00 0x01 0x02 0x03最大为 0x07
  41. //可以不用定义三个位,直接写P2=0X即可        
  42. //---------------------------------------
  43. //x为段选数据,y为位选0x00 0x01 0x02 0x03最大为 0x07
  44. void tube_display(uint x,uint y)
  45. {
  46.         P2=y;
  47. //        P0=LED[x];
  48.     LS164_MR=1;
  49.     state=LED[x];
  50.     for(i=0;i<8;i++)  //循环写8位扩展引脚状态
  51.         {
  52.                 LS164_CLK = 0;
  53.                 if(state & 0x80)
  54.                 {
  55.                         LS164_DATA = 1;
  56.                 }
  57.                 else
  58.                 {
  59.                         LS164_DATA = 0;
  60.                 }
  61.                 LS164_CLK = 1;
  62.                 state = state<<1;
  63.         }
  64. }
  65. //延时函数
  66. void delay(uint z)
  67. {
  68.      uint x,y;
  69.          for(x=z;x>0;x--)
  70.           for(y=50;y>0;y--);
  71. }
  72. //定时器初始化
  73. void time_init(void)                                                   //定时器初始化函数
  74. {
  75.     TMOD=0x02;                                                          //选择方式2
  76.         TH0=156;                                                          //重装初值为156    100us
  77.         TL0=156;                                                          //运行值为156
  78.         EA=1;                                                                  //开总中断
  79.         ET0=1;                                                                  //开定时器0中断
  80.         TR0=1;                                                                  //开定时器0
  81. }
  82. //外部中断初始化
  83. void INT0_init(void)                                                   //定时器初始化函数
  84. {
  85.     IT0=1;     //INT0负跳变沿触发
  86.     EX0=1;     //外部中断0使能
  87.     EA=1;      //总中断使能
  88. }
  89. void display(void)
  90. {       
  91.     tube_display(10,0x02);
  92.     delay(1);
  93.     tube_display(10,0x05);
  94.     delay(1);
  95.    
  96.     tube_display(date[0],0x07);
  97.     delay(1);
  98.    
  99.     tube_display(date[1],0x06);
  100.     delay(1);
  101.    
  102.     tube_display(date[2],0x04);
  103.     delay(1);
  104.    
  105.     tube_display(date[3],0x03);
  106.     delay(1);
  107.    
  108.     tube_display(date[4],0x01);
  109.     delay(1);
  110.    
  111.     tube_display(date[5],0x00);
  112.     delay(1);
  113. }
  114. /*************************** main code ******************************/
  115. void main(void)            //主函数,单片机开机后就是从这个函数开始运行
  116. {
  117.     time_init();
  118.     INT0_init();
  119.     while(1)               //死循环,单片机初始化后,将一直运行这个死循环
  120.     {
  121.        display();
  122.     }
  123. }
  124. /********************************************************************/
  125. /*定时器中断*/
  126. void timer() interrupt 1                                          //定时器0中断
  127. {
  128.      n++;
  129.          if(n==10000)                                                                 //当n=10000时,表示1s到了
  130.          {         
  131.              n=0;
  132.              miao++;
  133.                  if(miao==60)
  134.                  {
  135.                      miao=0;
  136.                      fen++;
  137.                          if(fen==60)
  138.                          {
  139.                              fen=0;
  140.                                  shi++;
  141.                                  if(shi==24)
  142.                                  {
  143.                                     shi=0;
  144.                                  }
  145.                          }
  146.                  }
  147.                  date[0]=miao%10;
  148.                  date[1]=miao/10;
  149.                  date[2]=fen%10;
  150.                  date[3]=fen/10;
  151.                  date[4]=shi%10;
  152.                  date[5]=shi/10;
  153.          }
  154. }
  155. /*按键中断*/
  156. void INT0_ISR(void) interrupt 0
  157. {
  158.     EX0=0;
  159.     delay(1);
  160.     if(HOUR_A==0)
  161.     {
  162.         shi++;
  163.         while(HOUR_A==0);
  164.     }
  165.     else if(HOUR_S==0)
  166.     {
  167.         shi--;
  168.         while(HOUR_S==0);
  169.     }
  170.     else if(MINUTE_A==0)
  171.     {
  172.         fen++;
  173.         while(MINUTE_A==0);
  174.     }
  175.     else if(MINUTE_S==0)
  176.     {
  177.         fen--;
  178.         while(MINUTE_S==0);
  179.     }
  180.     else if(SECOND_A==0)
  181.     {
  182.         miao++;
  183.         while(SECOND_A==0);
  184.     }
  185.     else if(SECOND_S==0)
  186.     {
  187.         miao--;
  188.         while(SECOND_S==0);
  189.     }
  190.     else if(CLOCK_ON==0)
  191.     {
  192.         TR0=1;
  193.         while(CLOCK_ON==0);
  194.     }
  195.     else if(CLOCK_OFF==0)
  196.     {
  197.         TR0=0;
  198.         while(CLOCK_OFF==0);
  199.     }
  200.     date[0]=miao%10;
  201.     date[1]=miao/10;
  202.     date[2]=fen%10;
  203.     date[3]=fen/10;
  204.     date[4]=shi%10;
  205.     date[5]=shi/10;
  206.     IE0=0;
  207.     EX0=1;
  208. }
复制代码

Proteus8.8仿真工程文件51hei附件下载:
8Wei_Time.zip (152.58 KB, 下载次数: 71)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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