找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机做的一个定时器

[复制链接]
ID:202865 发表于 2017-11-4 16:17 | 显示全部楼层 |阅读模式
用AT89C52芯片作为主控芯片实现计时/定时的功能,使用单片机内置的定时器以中断的方式产生以秒为单位的时间信号,产生的时间数据通过计算分成四位在数码管上以逐位扫描的方式显示出来,由于扫描速度足够快,因此看上去四位数字是同时显示的,另外还用了七个io口对应七个功能按键,按下去时可以拉低引脚电平,通过检测电平变化来判断按键是否被按下,七个按键可以实现时间的调整以及计时暂停继续清零等功能。
QQ截图20171104161601.png QQ截图20171104161638.png
  1. #include<reg52.h>
  2. sbit w1 = P3 ^ 6;
  3. sbit w2 = P1 ^ 5;
  4. sbit w3 = P1 ^ 4;
  5. sbit w4 = P1 ^ 3;
  6. sbit a = P3 ^ 5;
  7. sbit b = P1 ^ 2;
  8. sbit c = P1 ^ 7;
  9. sbit d = P3 ^ 2;
  10. sbit e = P3 ^ 3;
  11. sbit f = P3 ^ 4;
  12. sbit g = P1 ^ 6;
  13. sbit h = P3 ^ 1;
  14. sbit set = P2 ^ 5;
  15. sbit stop = P2 ^ 7;
  16. sbit clear = P2 ^ 6;
  17. sbit up = P2 ^ 2;
  18. sbit down = P2 ^ 1;
  19. sbit right = P2 ^ 3;
  20. sbit left = P2 ^ 0;        
  21. sbit led = P3 ^ 7;                //各io口设置
  22. bit settime = 0;                        //是否进入时间设定模式的判断变量
  23. bit pause = 0;                                //是否暂停的标志变量
  24. int time = 3599;                        //时间数据,初始值为59:59
  25. unsigned char num;                        //定时器中断次数记录变量
  26. unsigned char bj1 = 0, bj2 = 0, bj3 = 1,bj4=0;           //标记变量
  27. void xianshi( int i ) {                //数码管位选函数,显示0~9
  28.         switch ( i ) {
  29.                 case 0:
  30.                         a = b = c = d = e = f = g = h = 0;
  31.                         a = b = c = e = d = f = 1;
  32.                         break;
  33.                 case 1:
  34.                         a = b = c = d = e = f = g = h = 0;
  35.                         b = c = 1;
  36.                         break;
  37.                 case 2:
  38.                         a = b = c = d = e = f = g = h = 0;
  39.                         a = b = g = e = d = 1;
  40.                         break;
  41.                 case 3:
  42.                         a = b = c = d = e = f = g = h = 0;
  43.                         a = b = g = c = d = 1;
  44.                         break;
  45.                 case 4:
  46.                         a = b = c = d = e = f = g = h = 0;
  47.                         f = g = b = c = 1;
  48.                         break;
  49.                 case 5:
  50.                         a = b = c = d = e = f = g = h = 0;
  51.                         a = f = g = c = d = 1;
  52.                         break;
  53.                 case 6:
  54.                         a = b = c = d = e = f = g = h = 0;
  55.                         a = f = e = g = c = d = 1;
  56.                         break;
  57.                 case 7:
  58.                         a = b = c = d = e = f = g = h = 0;
  59.                         a = b = c = 1;
  60.                         break;
  61.                 case 8:
  62.                         a = b = c = d = e = f = g = h = 0;
  63.                         a = b = c = d = e = f = g = 1;
  64.                         break;
  65.                 case 9:
  66.                         a = b = c = d = e = f = g = h = 0;
  67.                         a = b = c = d = g = f = 1;
  68.                         break;
  69.         }
  70. }
  71. void delay( int i )         //延时函数大概延时ims
  72. {
  73.         int j;
  74.         for ( i; i >= 0; i-- ) {
  75.                 for ( j = 110; j >= 0; j-- );
  76.         }
  77. }
  78. void zijiang( void )         //数码管自检函数
  79. {
  80.         int i;
  81.         w1 = w2 = w3 = w4 = 0;
  82.         a = b = c = d = e = f = g = h = 1;
  83.         delay( 800 );
  84.         a = b = c = d = e = f = g = h = 0;
  85.         for ( i = 0; i <= 9; i++ ) {
  86.                 w1 = w2 = w3 = w4 = 0;
  87.                 xianshi( i );
  88.                 delay( 500 );
  89.         }
  90.         w1 = w2 = w3 = w4 = 1;
  91.         bj3 = 0;
  92. }
  93. void display( int i )                   //数码管时间显示函数
  94. {
  95.         int w, x, y, z;
  96.         w = ( ( i / 60 ) / 10 );
  97.         x = ( ( i / 60 ) % 10 );
  98.         y = ( ( i % 60 ) / 10 );
  99.         z = ( ( i % 60 ) % 10 );
  100.         w1 = w2 = w3 = w4 = 1;
  101.         w1 = 0;
  102.         xianshi( w );
  103.         delay( 5 );
  104.         w1 = 1;
  105.         w2 = 0;
  106.         xianshi( z );
  107.         delay( 5 );
  108.         w2 = 1;
  109.         w3 = 0;
  110.         xianshi( x );
  111.         delay( 5 );
  112.         w3 = 1;
  113.         w4 = 0;
  114.         xianshi( y );
  115.         delay( 5 );
  116.         w4 = 1;
  117. }
  118. void setdisplay( int i,int j )                   //设置时间时数码管时间显示函数,带有闪烁功能
  119. {
  120.         int w, x, y, z;
  121.         w = ( ( i / 60 ) / 10 );
  122.         x = ( ( i / 60 ) % 10 );
  123.         y = ( ( i % 60 ) / 10 );
  124.         z = ( ( i % 60 ) % 10 );
  125.         w1 = w2 = w3 = w4 = 1;
  126.         w1 = 0;
  127.         if(j==1)
  128.         {
  129.                 bj4++;
  130.                 if(bj4>=50)
  131.                 {
  132.                         w1=1;
  133.                         if(bj4>=100)
  134.                         bj4=0;
  135.                 }
  136.         }
  137.         xianshi( w );
  138.         delay( 5 );
  139.         w1 = 1;
  140.         w2 = 0;
  141.         if(j==4)
  142.         {
  143.                 bj4++;
  144.                 if(bj4>=50)
  145.                 {
  146.                         w2=1;
  147.                         if(bj4>=100)
  148.                         bj4=0;
  149.                 }
  150.         }
  151.         xianshi( z );
  152.         delay( 5 );
  153.         w2 = 1;
  154.         w3 = 0;
  155.         if(j==2)
  156.         {
  157.                 bj4++;
  158.                 if(bj4>=50)
  159.                 {
  160.                         w3=1;
  161.                         if(bj4>=100)
  162.                         bj4=0;
  163.                 }
  164.         }
  165.         xianshi( x );
  166.         delay( 5 );
  167.         w3 = 1;
  168.         w4 = 0;
  169.         if(j==3)
  170.         {
  171.                 bj4++;
  172.                 if(bj4>=50)
  173.                 {
  174.                         w4=1;
  175.                         if(bj4>=100)
  176.                         bj4=0;
  177.                 }
  178.         }
  179.         xianshi( y );
  180.         delay( 5 );
  181.         w4 = 1;
  182. }
  183. void T0_time()interrupt 1            //中断产生时间信号
  184. {
  185.         TH0 = 59;
  186.         TL0 = 114;                        //重装初值
  187.         num++;
  188. }
  189. void main()
  190. {
  191.         int j = 1;
  192.         w1 = w2 = w3 = w4 = 1;
  193.         TH0 = 59;
  194.         TL0 = 146;                                  //定时器设置及装填初值
  195.         EA = 1;
  196.         ET0 = 1;
  197.         led=0;
  198.         while ( 1 )
  199.         {
  200.                 if ( bj3 == 1 )
  201.                         zijiang();                                //自检函数,只运行一次
  202.                 while(bj2==1)
  203.                 {
  204.                 if ( set == 0 )                         //设置函数,按下设置键进入函数
  205.                 {
  206.                         delay( 10 );
  207.                         if ( set == 0 )
  208.                         {
  209.                                 while(!set);                //按键防抖,并且防止按一次重复多次
  210.                                 settime = 1;
  211.                         }
  212.                 }
  213.                 if ( settime == 1 )
  214.                 {
  215.                         setdisplay( time,j );
  216.                         if ( right == 0 )                         //时间设置右移
  217.                         {
  218.                                 delay( 10 );
  219.                                 if ( right == 0 )
  220.                                 {
  221.                                         while ( !right );
  222.                                         j++;
  223.                                         if ( j == 5 )
  224.                                                 j = 1;
  225.                                 }
  226.                         }
  227.                         setdisplay( time,j );
  228.                         if ( left == 0 )                         //时间设置左移
  229.                         {
  230.                                 delay( 10 );
  231.                                 if ( left == 0 )
  232.                                 {
  233.                                         while ( !left );
  234.                                         j--;
  235.                                         if ( j == 0 )
  236.                                                 j = 4;
  237.                                 }
  238.                         }
  239.                         setdisplay( time,j );
  240.                         if ( up == 0 )                                 //时间加
  241.                                 delay( 10 );
  242.                                 {
  243.                                 if ( up == 0 )
  244.                                 {
  245.                                         while ( !up );
  246.                                         switch ( j )
  247.                                         {
  248.                                                 case 1:
  249.                                                         time = time + 600;
  250.                                                         if ( ( time / 600 ) > 5 )
  251.                                                                 time = time - 3600;
  252.                                                         break;
  253.                                                 case 2:
  254.                                                         time = time + 60;
  255.                                                         if ( ( ( time / 60 ) % 10 ) == 0 )
  256.                                                                 time = time - 600;
  257.                                                         break;
  258.                                                 case 3:
  259.                                                         time = time + 10;
  260.                                                         if ( ( ( time % 60 ) / 10 ) > 5 )
  261.                                                                 time = time - 60;
  262.                                                         break;
  263.                                                 case 4:
  264.                                                         time++;
  265.                                                         if ( ( ( time % 60 ) / 10 ) == 0 )
  266.                                                                 time = time - 10;
  267.                                                         break;
  268.                                         }
  269.                                 }
  270.                         }
  271.                         setdisplay( time,j );
  272.                         if ( down == 0 )                         //时间减
  273.                         {
  274.                                 delay( 10 );
  275.                                 if ( down == 0 )
  276.                                 {
  277.                                         while ( !down );
  278.                                         switch ( j )
  279.                                         {
  280.                                                 case 1:
  281.                                                         if ( time / 600 == 0 )
  282.                                                                 time = time + 3600;
  283.                                                         time = time - 600;
  284.                                                         break;
  285.                                                 case 2:
  286.                                                         if ( ( ( time / 60 ) % 10 ) == 0 )
  287.                                                                 time = time + 600;
  288.                                                         time = time - 60;
  289.                                                         break;
  290.                                                 case 3:
  291.                                                         if ( ( ( time % 60 ) / 10 ) == 0 )
  292.                                                                 time = time + 60;
  293.                                                         time = time - 10;
  294.                                                         break;
  295.                                                 case 4:
  296.                                                         if ( ( ( time % 60 ) % 10 ) == 0 )
  297.                                                                 time = time + 10;
  298.                                                         time--;
  299.                                                         break;
  300.                                         }
  301.                                 }
  302.                         }
  303.                         setdisplay( time,j );
  304.                         if ( stop == 0 )                           //开始按钮,按下开始计时
  305.                         {
  306.                                 delay( 10 );
  307.                                 if ( stop == 0 )
  308.                                         while ( !stop );
  309.                                 bj2 = 0;
  310.                         }
  311.                         if ( clear == 0 )                           //清零按钮,按下时间清零
  312.                         {
  313.                                 delay( 10 );
  314.                                 if ( clear == 0 )
  315.                                 {
  316.                                         while ( !clear );
  317.                                         time = 0;
  318.                                 }
  319.                         }
  320.                 }
  321.                 }
  322.                 while ( bj2 == 0 )                                         //计时部分从59:59开始倒计时
  323.                 {
  324.                         TR0 = 1;
  325.                         display( time );
  326.                         if ( num >= 160 )
  327.                         {
  328.                                 num = 0;
  329.                                 time--;
  330.                         }
  331.                         if(time==0)                                          //判断即使是否结束
  332.                         led=1;
  333.                         TR0=0;
  334.                         if ( set == 0 )                           //设置按钮,按下进入设置模式
  335.                         {                 
  336.                                 delay(10);
  337.                                 if ( set == 0 )
  338.                                 {
  339.                                         while ( !set );
  340.                                         bj2 = 1;
  341.                                         TR0 = 0;
  342.                                 }
  343.                         }
  344.                         if ( stop == 0 )                         //暂停/开始按钮,按下暂停或者开始计时
  345.                         {
  346.                                 delay( 10 );
  347.                                 if ( stop == 0 )
  348.                                 {        while(!stop);

  349.                                         bj2=1-bj2;
  350.                                 }
  351.                         }
  352.                         if ( bj2 == 0 )
  353.                                 TR0 = 1;
  354.                         else
  355.                                 TR0 = 0;
  356.                 }
  357.         }
  358. }
复制代码



评分

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

查看全部评分

回复

使用道具 举报

ID:741893 发表于 2020-4-30 17:57 | 显示全部楼层
colon expected at start of line是什么意思
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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