闹钟设置哪里有问题!望高手帮忙解决

[复制链接]
3798|19
 楼主| funfactory 发表于 2011-6-5 15:59 | 显示全部楼层 |阅读模式
本帖最后由 funfactory 于 2011-6-11 17:14 编辑

问题闹钟设置程序
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. unsigned char code dispcode[]={  
  5. 0x3f,  /*0*/
  6. 0x06,  /*1*/
  7. 0x5b,  /*2*/
  8. 0x4f,  /*3*/
  9. 0x66,  /*4*/
  10. 0x6d,  /*5*/
  11. 0x7d,  /*6*/
  12. 0x07,  /*7*/
  13. 0x7f,  /*8*/
  14. 0x6f,  /*9*/
  15. 0x40,  /* */};

  16. unsigned char dispbuf[8]={0,0,10,0,0,10,0,0};
  17. unsigned char clok_dispbuf[8]={0,0,10,0,0,10,0,0};
  18. unsigned char dispbitcnt=0;
  19. unsigned char second = 57;
  20. unsigned char minite = 58;
  21. unsigned char hour = 11;
  22. unsigned int tcnt;
  23. unsigned char mstcnt;
  24. unsigned char i,j,k,flag,a,b,c,n;
  25. uchar clok_second=0;
  26. uchar clok_minite=0;
  27. uchar clok_hour=0;
  28. uchar clock_set;


  29. sbit ksec=P0^0;
  30. sbit kmin=P0^1;
  31. sbit khour=P0^2;
  32. sbit kalrm = P0^3;
  33. sbit fmq = P2^7;
  34. sbit led = P0^7;




  35. void init()   
  36. {
  37.         TMOD=0X11;
  38.         TH0=(65536-50000)/256;                //50ms
  39.         TL0=(65536-50000)%256;
  40.         TH1=(65536-1000)/256;                //1ms
  41.         TL1=(65536-1000)%256;
  42.         ET0=1;         ET1=1;
  43.         TR0=1;         TR1=1;
  44.         EA=1;
  45. }

  46. void delay(uint z)
  47. {
  48.         uint i, j;
  49.         for (i=z; i>0;i--)
  50.                 for (j=110; j>0; j--);
  51. }

  52. void buzzer(uint h)
  53. {
  54.         for (k=h; k>0; k--)
  55.         {       
  56.                 fmq = ~fmq;
  57.                 delay(1);
  58.         }
  59. }


  60. void key_set()
  61. {
  62.         if(ksec==0)
  63.     {
  64.       for(i=5;i>0;i--)
  65.       for(j=248;j>0;j--);
  66.       if(ksec==0)
  67.       {
  68.                   buzzer(850);
  69.           second++;
  70.           if(second==60)
  71.           {
  72.              second=0;
  73.            }
  74.           dispbuf[0]=second%10;
  75.           dispbuf[1]=second/10;
  76.           while(ksec==0);
  77.         }
  78.       }
  79.       if(kmin==0)
  80.       {
  81.           for(i=5;i>0;i--)
  82.           for(j=248;j>0;j--);
  83.           if(kmin==0)
  84.             {
  85.                           buzzer(850);
  86.               minite++;
  87.               if(minite==60)
  88.                 {
  89.                   minite=0;
  90.                 }
  91.               dispbuf[3]=minite%10;
  92.               dispbuf[4]=minite/10;
  93.               while(kmin==0);
  94.             }
  95.         }
  96.       if(khour==0)
  97.       {
  98.           for(i=5;i>0;i--)
  99.           for(j=248;j>0;j--);
  100.           if(khour==0)
  101.            {
  102.                           buzzer(850);
  103.               hour++;
  104.               if(hour==24)
  105.                 {
  106.                   hour=0;
  107.                 }
  108.                                 dispbuf[6]=hour%10;
  109.                                 dispbuf[7]=hour/10;

  110.               while(khour==0);
  111.             }
  112.        }
  113. if (clock_set == 1)
  114. {
  115.         if(ksec==0)
  116.     {
  117.       for(i=5;i>0;i--)
  118.       for(j=248;j>0;j--);
  119.       if(ksec==0)
  120.       {
  121.                   buzzer(850);
  122.           clok_second++;
  123.           if(clok_second==60)
  124.           {
  125.              clok_second=0;
  126.            }
  127.           clok_dispbuf[0]=clok_second%10;
  128.           clok_dispbuf[1]=clok_second/10;
  129.           while(ksec==0);
  130.         }
  131.       }
  132.       if(kmin==0)
  133.       {
  134.           for(i=5;i>0;i--)
  135.           for(j=248;j>0;j--);
  136.           if(kmin==0)
  137.             {
  138.                           buzzer(850);
  139.               clok_minite++;
  140.               if(minite==60)
  141.                 {
  142.                   clok_minite=0;
  143.                 }
  144.               clok_dispbuf[3]=clok_minite%10;
  145.               clok_dispbuf[4]=clok_minite/10;
  146.               while(kmin==0);
  147.             }
  148.         }
  149.       if(khour==0)
  150.       {
  151.           for(i=5;i>0;i--)
  152.           for(j=248;j>0;j--);
  153.           if(khour==0)
  154.            {
  155.                           buzzer(850);
  156.               clok_hour++;
  157.               if(clok_hour==24)
  158.                 {
  159.                   clok_hour=0;
  160.                 }
  161.                                 clok_dispbuf[6]=clok_hour%10;
  162.                                 clok_dispbuf[7]=clok_hour/10;
  163.               while(khour==0);
  164.             }
  165.        }
  166.         }                  
  167. }

  168. void alarm_set()
  169. {
  170.         if (kalrm == 0)
  171.         {
  172.           for(i=5;i>0;i--)
  173.           for(j=248;j>0;j--);
  174.                 //delay(10);
  175.                 if (kalrm == 0)
  176.                 {
  177.                         buzzer(850);        //蜂鸣器按键音       
  178.                         clock_set++;                //闹钟设置标志位
  179.                        
  180.                         if (clock_set == 1)
  181.                         {
  182.                                 led = 0;                //设置时led灯亮
  183.                                 key_set();                //按键控制时间的加减

  184.                         }
  185.                         if (clock_set == 2)
  186.                         {
  187.                                 clock_set = 0;
  188.                                 led = 1;
  189.                         }
  190.                                        
  191.                 }
  192.                
  193.         }
  194. }


  195. void main(void)
  196. {
  197.         init();
  198.         while(1)
  199.     {


  200.                 key_set();
  201.                 alarm_set();
  202.                 if ((second==clok_second)&&(minite==clok_minite)&(&hour==clok_hour)&&(clock_set==0))
  203.                 {
  204.                         for (n=100; n>0; n--)
  205.                         {
  206.                                 buzzer(5000);
  207.                         }
  208.                 }
  209.                 if ((second==0)&&(minite==0))                //整点报时
  210.                 {
  211.                   buzzer(3000);       
  212.                 }
  213.     }
  214. }
  215. void t0(void) interrupt 1  //
  216. {
  217.         TH0=(65536-50000)/256;
  218.         TL0=(65536-50000)%256;
  219.         tcnt++;
  220.   if(tcnt==20)
  221.     {
  222.       tcnt=0;
  223.       second++;
  224.       if(second==60)
  225.         {
  226.           second=0;
  227.           minite++;
  228.           if(minite==60)
  229.             {
  230.               minite=0;
  231.               hour++;
  232.               if(hour==24)
  233.                 {
  234.                   hour=0;
  235.                 }
  236.             }
  237.         }
  238.       dispbuf[0]=second%10;
  239.       dispbuf[1]=second/10;
  240.       dispbuf[3]=minite%10;
  241.       dispbuf[4]=minite/10;
  242.       dispbuf[6]=hour%10;
  243.       dispbuf[7]=hour/10;
  244.     }
  245. }


  246. void timer1() interrupt 3      //扫面显示
  247. {
  248.         TH1=(65536-1000)/256;
  249.         TL1=(65536-1000)%256;
  250.         //dispbitcnt++;

  251.         if (clock_set == 1)
  252.         {
  253.                 P3=~(0x01<<dispbitcnt);
  254.                 P1=dispcode[clok_dispbuf[dispbitcnt]];
  255.         }
  256.         else
  257.         P3=~(0x01<<dispbitcnt);
  258.         P1=dispcode[dispbuf[dispbitcnt]];

  259.         if(dispbitcnt++==8)
  260.         {
  261.                 dispbitcnt=0;
  262.         }

  263. }

评分

参与人数 1威望 +1 收起 理由
mscj20072380 + 1

查看全部评分

 楼主| funfactory 发表于 2011-6-5 16:00 | 显示全部楼层
本帖最后由 funfactory 于 2011-6-11 18:09 编辑

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| funfactory 发表于 2011-6-11 19:12 | 显示全部楼层
难道就要这样一沉到底了??
邪恶猛男 发表于 2011-6-11 20:37 | 显示全部楼层
我来看下
邪恶猛男 发表于 2011-6-11 20:39 | 显示全部楼层
参数下问题嘛!这代码完全看会伤神的,好针对性.我等你
 楼主| funfactory 发表于 2011-6-12 09:59 | 显示全部楼层

  1. void alarm_set()
  2. {
  3.         if (kalrm == 0)
  4.         {
  5.           for(i=5;i>0;i--)
  6.           for(j=248;j>0;j--);
  7.                 //delay(10);
  8.                 if (kalrm == 0)
  9.                 {
  10.                         buzzer(850);        //蜂鸣器按键音       
  11.                         clock_set++;                //闹钟设置标志位
  12.                        
  13.                         if (clock_set == 1)
  14.                         {
  15.                                 led = 0;                //设置时led灯亮
  16.                                 key_set();                //按键控制时间的加减

  17.                         }
  18.                         if (clock_set == 2)
  19.                         {
  20.                                 clock_set = 0;
  21.                                 led = 1;
  22.                         }
  23.                                        
  24.                 }
  25.                
  26.         }
  27. }
做的实物与仿真问题都出现在这里,按下按纽kalrm,clock_set闹钟的标志位为1,理论上应该指示灯会亮起,数码管应该显示全为0。但是现象是指示灯闪几下,数码管也没有任何变化!
 楼主| funfactory 发表于 2011-6-12 10:02 | 显示全部楼层
5# 邪恶猛男
实在看不出问题在哪里了!
幸苦了,这代码谁看着都累,嘿嘿!
邪恶猛男 发表于 2011-6-12 11:05 | 显示全部楼层
kalrm ==1;的状态在那里
邪恶猛男 发表于 2011-6-12 11:06 | 显示全部楼层
if (kalrm == 0)??

        {

          for(i=5;i>0;i--)

          for(j=248;j>0;j--);

                //delay(10);

                if (kalrm == 0)   ??
邪恶猛男 发表于 2011-6-12 11:07 | 显示全部楼层
上面是去抖动? 你是低表示按键有动作?
邪恶猛男 发表于 2011-6-12 11:09 | 显示全部楼层
个人觉得你这个抖动估计处理不是很好
          for(i=5;i>0;i--)

          for(j=248;j>0;j--);
这个时间你能控制好?
邪恶猛男 发表于 2011-6-12 11:23 | 显示全部楼层
clock_set++;                //闹钟设置标志位

你这个                        if (clock_set == 1)

                        if (clock_set == 2)
你这个有BUG如果出现 ==3 一直到255情况你都处理不了
 楼主| funfactory 发表于 2011-6-12 18:00 | 显示全部楼层
本帖最后由 funfactory 于 2011-6-12 18:14 编辑

10# 邪恶猛男
是代表消抖!低电平起作用!低电平后
clock_set++
消抖应该没问题!试了很多中方法,这个最不错了!
mscj20072380 发表于 2011-6-12 18:02 | 显示全部楼层
没看出来
 楼主| funfactory 发表于 2011-6-12 18:22 | 显示全部楼层

  1.                         if (clock_set == 1)
  2.                         {
  3.                                 led = 0;                //设置时led灯亮
  4.                                 key_set();                //按键控制时间的加减

  5.                         }
  6.                         if (clock_set == 2)
  7.                         {
  8.                                 clock_set = 0;      //clock_set不会大于3吧,这里清0了,难道这样写不严密
  9.                                 led = 1;
  10.                         }
 楼主| funfactory 发表于 2011-6-12 19:08 | 显示全部楼层
本帖最后由 funfactory 于 2011-6-29 14:17 编辑

[local]1[/local]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| funfactory 发表于 2011-6-12 19:43 | 显示全部楼层
楼上是c文件和仿真图
 楼主| funfactory 发表于 2011-6-13 18:52 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| funfactory 发表于 2011-7-9 15:19 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lc13659669235 发表于 2011-7-9 15:33 | 显示全部楼层
额 ,看不懂程序,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

66

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部