找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2172|回复: 9
收起左侧

单片机控制定时灯亮程序问题

[复制链接]
ID:508684 发表于 2019-4-18 21:40 | 显示全部楼层 |阅读模式
各位老师好,我的这段程序想在设定的时间到达时,P1^7对应的LED 灯亮,但实际测试时灯不亮,能请各位老师帮忙看一下吗,谢谢

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar hour_now,hour_set,min_now,min_set,sec_now,sec_set;
  5. uint time_t;
  6. sbit led7=P1^7;
  7. sbit beep=P2^3;
  8. sbit led0=P1^0;
  9. void delay1ms(uint x)
  10. {  

  11.          TMOD=0X20;
  12.          TR1=1;
  13.          while(x--)
  14.           {      
  15.            TH1=0Xfc;
  16.            TL1=0X18;
  17.            while(!TF1);
  18.            TF1=0;
  19.            time_t++;
  20.                 }
  21.          TR1=0;

  22. }
  23. void dingshi()
  24. {
  25. while(1)
  26. {
  27.         if((hour_now=hour_set)&&(min_now=min_set)&&(sec_now=sec_set))
  28.          
  29.     led7=0;
  30.     while(1)
  31.                 delay1ms(20);
  32.             sec_now++;
  33.     if(sec_now>=60)
  34.           {
  35.                      sec_now=0;
  36.                      min_now++;
  37.                   if(min_now>=60)
  38.                   {  
  39.                               min_now=0;
  40.                               hour_now++;
  41.                           if(hour_now>=24)
  42.                           {
  43.                                        hour_now=0;
  44.          }
  45.        }
  46.      }

  47. }
  48. }
  49. void main()
  50.          {
  51.                  hour_now=23;
  52.      min_now=59;
  53.      sec_now=50;
  54.      hour_set=0;
  55.      min_set=0;
  56.      sec_set=0;      
  57.      while(1)
  58.                 {
  59.                                         dingshi();
  60.                 }
  61.         }
复制代码


回复

使用道具 举报

ID:123289 发表于 2019-4-19 08:36 | 显示全部楼层
你需要补“中断”的课,弄清楚什么是“中断”!
回复

使用道具 举报

ID:164602 发表于 2019-4-19 08:36 | 显示全部楼层
程序问题嘛
你的亮灯只能在开机时判断一次,以后就再也不判断了,怎么会亮呢。
while(1)
{
        if((hour_now=hour_set)&&(min_now=min_set)&&(sec_now=sec_set))
         
    led7=0;//á???μ????e
    while(1)
                delay1ms(20);
进入第二个while后,就再也不会去判断是否亮灯了!

还是上面那部分程序,第二个while后,没有{},则程序就会一直一直一直一直一直......执行delay1ms(20);
时间再也不会增加了。
回复

使用道具 举报

ID:213173 发表于 2019-4-19 08:39 | 显示全部楼层
你的程序错误不少,给你改了,你试试。
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar hour_now,hour_set,min_now,min_set,sec_now,sec_set;
  5. uint time_t;
  6. sbit led7=P1^7;
  7. sbit beep=P2^3;
  8. sbit led0=P1^0;

  9. void Timer0Init()                //50毫秒@12.000MHz
  10. {
  11.         TMOD= 0x01;                //设置定时器模式
  12.         TL0 = 0xB0;                //设置定时初值
  13.         TH0 = 0x3C;                //设置定时初值
  14.         TF0 = 0;                //清除TF0标志
  15.         TR0 = 1;                //定时器0开始计时
  16. }
  17. void dingshi()
  18. {
  19.         uint i;       
  20.         if((hour_now==hour_set)&&(min_now==min_set)&&(sec_now==sec_set))
  21.         {
  22.                 led7=0;
  23.                 TR0 =0;                //关定时器
  24.                 beep=0;                //蜂鸣器响
  25.                 i=50000;
  26.                 while(i--);//延时约0.5秒
  27.                 beep=1;                //蜂鸣器停
  28.         }
  29. }
  30. void main()
  31. {
  32.         hour_now=23;
  33.         min_now=59;
  34.         sec_now=50;
  35.         hour_set=0;
  36.         min_set=0;
  37.         sec_set=0;      
  38.         Timer0Init();
  39.         while(1)
  40.         {
  41.                 if(TF0==1)
  42.                 {
  43.                         TF0=0;
  44.                         time_t++;
  45.                         if(time_t==20)
  46.                         {
  47.                                 time_t=0;
  48.                                 sec_now++;
  49.                                 if(sec_now==60)
  50.                                 {                               
  51.                                         sec_now=0;
  52.                                         min_now++;
  53.                                         if(min_now==60)
  54.                                         {       
  55.                                                 min_now=0;
  56.                                                 hour_now++;
  57.                                                 if(hour_now==24)
  58.                                                         hour_now=0;
  59.                                         }
  60.                                 }
  61.                         }
  62.                 }
  63.                 dingshi();
  64.         }
  65. }
复制代码

评分

参与人数 1黑币 +5 收起 理由
king_zxt + 5

查看全部评分

回复

使用道具 举报

ID:389839 发表于 2019-4-19 10:35 | 显示全部楼层
定时器未初始化,中断标志未清
回复

使用道具 举报

ID:508684 发表于 2019-4-21 12:08 | 显示全部楼层
yzwzfyz 发表于 2019-4-19 08:36
你需要补“中断”的课,弄清楚什么是“中断”!

嗯嗯谢谢老师指导。
回复

使用道具 举报

ID:508684 发表于 2019-4-21 12:09 | 显示全部楼层
HC6800-ES-V2.0 发表于 2019-4-19 08:36
程序问题嘛
你的亮灯只能在开机时判断一次,以后就再也不判断了,怎么会亮呢。
while(1)

嗯嗯明白老师的意思了,谢谢!
回复

使用道具 举报

ID:508684 发表于 2019-4-21 12:11 | 显示全部楼层
wulin 发表于 2019-4-19 08:39
你的程序错误不少,给你改了,你试试。

谢谢老师,程序是对的,格式也很整齐,很感谢老师的指导
回复

使用道具 举报

ID:508684 发表于 2019-4-21 12:11 | 显示全部楼层
uguigu吐故以后 发表于 2019-4-19 10:35
定时器未初始化,中断标志未清

嗯嗯明白了,谢谢你
回复

使用道具 举报

ID:518218 发表于 2019-4-21 22:50 | 显示全部楼层
可以找一下郭天祥的视频资料
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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