久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2082|回復: 11
打印 上一主題 下一主題
收起左側

單片機簡易時鐘程序錯誤

[復制鏈接]
跳轉到指定樓層
樓主
這是什么原因啊?


單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. void Delayms(uint x);
  6. sbit L=P2^0;
  7. sbit LA=P2^1;
  8. sbit LB=P2^2;
  9. void Display();
  10. sbit key1=P3^3;
  11. sbit key2=P3^4;
  12. sbit key3=P3^5;

  13. /*位碼*/uchar tablew[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
  14. /*位選*/uchar shu[8]={0};
  15. /*共陰極*/
  16. uchar table6[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  17. uint aa,bb,cc,dd;
  18. void main()
  19. {
  20. TMOD=0x01;//設置工作方式
  21. TH0=0x3c;//設置定時器高八位
  22. TL0=0xb0;//設置定時器低八位
  23. ET0=1;//打開定時器T0的中斷開關
  24. TR0=1;//啟動定時器T0工作
  25. EA=0;//打開總中斷開關

  26. while(1)
  27.         {
  28.      uchar mshi,mge,fshi,fge,sshi,sge;
  29.      if(key1==0)
  30.      {
  31.                 EA=1;
  32.      }
  33.      else if(key2==0)
  34.          {
  35.           EA=0;
  36.          }
  37.      else if(key3==0)
  38.      {
  39.       bb=0;cc=0;dd=0;
  40.       }
  41.       else;
  42. mshi=bb/10;
  43. mge=bb%10;
  44. if(bb>59)
  45. {
  46. bb=0;
  47. cc++;
  48. }
  49. fshi=cc/10;
  50. fge=cc%10;
  51. if(cc>59)
  52. {
  53. cc=0;
  54. dd++;
  55. }
  56. sshi=dd/10;
  57. sge=dd%10;
  58. if(dd>23)
  59. {
  60. dd=0;
  61. }

  62. shu[7]=table6[mge];
  63. shu[6]=table6[mshi];
  64. shu[5]=0x40;
  65. shu[4]=table6[fge];
  66. shu[3]=table6[fshi];
  67. shu[2]=0x40;
  68. shu[1]=table6[sge];
  69. shu[0]=table6[sshi];
  70. Display();
  71. }
  72. }
  73. void int0_0() interrupt 1
  74. {
  75. TH0=0x3C;
  76. TL0=0xb0;
  77. aa++;//1ms加一次
  78. if(aa>1000)
  79. {
  80. aa=0;
  81. bb++;//1S加一次
  82. }

  83. }
  84. void Display()
  85. {
  86. uint i;
  87. for(i=0;i<8;i++)
  88. {
  89. P2=tablew[i];
  90. P0=shu[i];
  91. Delayms(1);
  92. }
  93. }
  94. void Delayms(uint x)
  95. {
  96. uchar j;
  97. while(x--)
  98.         {
  99.                 for(j=0;j<125;j++);
  100.         }
  101. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2023-7-4 08:08 | 只看該作者
數碼管位驅動代碼與硬件不符及其他變量聲明處理不當。給你改了。



  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit L=P2^0;
  6. sbit LA=P2^1;
  7. sbit LB=P2^2;
  8. void Display();
  9. sbit key1=P3^3;
  10. sbit key2=P3^4;
  11. sbit key3=P3^5;

  12. /*位碼*///uchar tablew[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
  13. /*位選*/uchar shu[8]={0,0,0x40,0,0,0x40,0,0};
  14. /*共陰極*/
  15. uchar table6[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  16. uchar Key_value,flag;
  17. uint  Time;
  18. char  shi,fen,sec;
  19. uchar num,latch;

  20. void main()
  21. {
  22.         TMOD=0x01;//設置工作方式
  23.         TH0=0xF8;//設置定時器高八位@12MHz 2ms
  24.         TL0=0x30;//設置定時器低八位@12MHz 2ms
  25.         ET0=1;//打開定時器T0的中斷開關
  26.         TR0=1;//啟動定時器T0工作
  27.         EA=1;//打開總中斷開關

  28.         while(1)
  29.         {
  30.                 if(flag==1)//周期2ms
  31.                 {
  32.                         flag=0;//清中斷標志

  33.                         //按鍵掃描
  34.                         if(!key1||!key2||!key3)
  35.                         {
  36.                                 if(++num>=10 && latch==0)//消抖
  37.                                 {
  38.                                         latch=1; //鎖存
  39.                                         if(!key1)//設置
  40.                                         {
  41.                                                 Key_value=++Key_value%4;
  42.                                         }
  43.                                         if(!key2)//增加
  44.                                         {
  45.                                                 if(Key_value==1)shi=++shi%24;
  46.                                                 if(Key_value==2)fen=++fen%60;
  47.                                                 if(Key_value==3)sec=++sec%60;
  48.                                         }
  49.                                         if(!key3)//減小
  50.                                         {
  51.                                                 if(Key_value==1){if(--shi<0)shi=23;}
  52.                                                 if(Key_value==2){if(--fen<0)fen=59;}
  53.                                                 if(Key_value==3){if(--sec<0)sec=59;}
  54.                                         }
  55.                                 }
  56.                         }
  57.                         else //松手
  58.                         {
  59.                                 num=0;   //清0
  60.                                 latch=0; //清0
  61.                         }

  62.                         //計時
  63.                         if(Key_value==0)//非設置狀態
  64.                         {
  65.                                 if(++Time>=500)//秒
  66.                                 {
  67.                                         Time=0;
  68.                                         if(++sec>=60)//分
  69.                                         {
  70.                                                 sec=0;
  71.                                                 if(++fen>=60)//時
  72.                                                 {
  73.                                                         fen=0;
  74.                                                         shi=++shi%24;
  75.                                                 }
  76.                                         }
  77.                                 }
  78.                         }

  79.                         //數據處理
  80.                         shu[7]=table6[shi/10];
  81.                         if(Key_value==1)
  82.                                 shu[6]=table6[shi%10]|0x80;//加點
  83.                         else shu[6]=table6[shi%10];
  84.                         shu[4]=table6[fen/10];
  85.                         if(Key_value==2)
  86.                                 shu[3]=table6[fen%10]|0x80;//加點
  87.                         else shu[3]=table6[fen%10];
  88.                         shu[1]=table6[sec/10];
  89.                         if(Key_value==3)
  90.                                 shu[0]=table6[sec%10]|0x80;//加點
  91.                         else shu[0]=table6[sec%10];

  92.                         //數碼管動態顯示
  93.                         Display();
  94.                 }
  95.         }
  96. }

  97. void int0_0() interrupt 1
  98. {
  99.         TH0=0xf8;//@12MHz 2ms
  100.         TL0=0x30;//@12MHz 2ms
  101.         flag=1;//中斷標志
  102. }

  103. void Display()
  104. {
  105.         static uchar i;
  106.         P0=0x00;//段消隱
  107.         P2&=0xf8;//清位碼
  108.         P2|=~i;//送位碼
  109.         P0=shu[i];//送段碼
  110.         i=++i%8;//循環計數
  111. }

復制代碼



回復

使用道具 舉報

板凳
ID:1080935 發表于 2023-7-4 08:19 | 只看該作者
仿真中數碼管需要消隱處理,就是送段碼前全部熄滅,送完段碼打開對應的管子。
回復

使用道具 舉報

地板
ID:332444 發表于 2023-7-4 08:49 | 只看該作者
變量聲明寫在主循環外,按鍵要有消抖,數碼管要消隱,如果P2送位值那么就不用定義去138的3個引腳.
回復

使用道具 舉報

5#
ID:140489 發表于 2023-7-4 09:04 | 只看該作者
TR0=1;//啟動定時器T0工作
EA=0;//打開總中斷開關

EA=1;//才能 打開總中斷開關
回復

使用道具 舉報

6#
ID:161164 發表于 2023-7-4 09:15 | 只看該作者
缺了一個HC138芯片
把P20~P22的3位信號轉為8位位選信號
回復

使用道具 舉報

7#
ID:712097 發表于 2023-7-4 11:44 | 只看該作者
問題比較多,大概列出來:
1、位碼錯誤2、送段碼前沒有清零
3、共陰數碼管需要加驅動,單片機IO負載能力不足
4、段碼加了245IC就不用上拉電阻。
5、我貼出來的代碼隨便寫的,好多可以精簡,請自行優化。

單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. void Delayms(uint x);
  6. sbit L=P2^0;
  7. sbit LA=P2^1;
  8. sbit LB=P2^2;
  9. void Display();
  10. sbit key1=P3^3;
  11. sbit key2=P3^4;
  12. sbit key3=P3^5;

  13. /*位碼*/uchar tablew[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  14. uint mshi,mge,fshi,fge,sshi,sge;
  15. /*共陰極*/
  16. uchar table6[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 };
  17. //{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  18. uint aa,bb,cc,dd;

  19. //void Timer0_Init(void)                //1毫秒@12.000MHz
  20. //{
  21. //        //AUXR |= 0x80;                        //定時器時鐘1T模式
  22. //        TMOD = 0x01;                        //設置定時器模式
  23. //        TL0 = (65536-1000)&0xFF;                        //設置定時初始值
  24. //        TH0 = (65536-1000)>>8;                                //設置定時初始值
  25. //        IE=0x82;
  26. //        TR0=1;
  27. //        EA=1;
  28. //}

  29. void main()
  30. {
  31.         
  32.         
  33. TMOD=0x01;//設置工作方式
  34. TH0=0xFC;//設置定時器高八位
  35. TL0=0x18;//設置定時器低八位
  36. ET0=1;//打開定時器T0的中斷開關
  37. TR0=1;//啟動定時器T0工作
  38. EA=1;//打開總中斷開關

  39.         //Timer0_Init();

  40. while(1)
  41. {
  42.      
  43.      if(key1==0)
  44.      {
  45.                 EA=1;
  46.      }
  47.      else if(key2==0)
  48.          {
  49.           EA=0;
  50.          }
  51.      else if(key3==0)
  52.      {
  53.       bb=0;cc=0;dd=0;
  54.       }


  55. Display();
  56. }
  57. }
  58. void int0_0() interrupt 1
  59. {
  60. TH0=0xFC;
  61. TL0=0x18;
  62. aa++;//1ms加一次
  63. if(aa>1000)
  64. {
  65. aa=0;
  66. bb++;//1S加一次
  67. }
  68. mshi=bb/10;
  69. mge=bb%10;
  70. if(bb>59)
  71. {
  72. bb=0;
  73. cc++;
  74. }
  75. fshi=cc/10;
  76. fge=cc%10;
  77. if(cc>59)
  78. {
  79. cc=0;
  80. dd++;
  81. }
  82. sshi=dd/10;
  83. sge=dd%10;
  84. if(dd>23)
  85. {
  86. dd=0;
  87. }

  88. }
  89. void Display()
  90. {
  91. uchar i;
  92. for(i=0;i<8;i++)
  93. {
  94. P0=0x00;
  95. P2=tablew[7-i];///位碼
  96. switch(i)
  97. {
  98.         case 0:
  99.                 P0=table6[mge];break;
  100.         case 1:
  101.                 P0=table6[mshi];break;
  102.         case 2:
  103.                 P0=table6[10];break;
  104.         case 3:
  105.                 P0=table6[fge];break;
  106.         case 4:
  107.                 P0=table6[fshi];break;
  108.         case 5:
  109.                 P0=table6[10];break;
  110.         case 6:
  111.                 P0=table6[sge];break;
  112.         case 7:
  113.                 P0=table6[sshi];break;
  114.         default:
  115.                 P0=0x00;
  116. }        
  117.         
  118. Delayms(1);
  119. }
  120. }
  121. void Delayms(uint x)
  122. {
  123. uchar j;
  124. while(x--)
  125.         {
  126.                 for(j=0;j<125;j++);
  127.         }
  128. }

復制代碼





評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:1086252 發表于 2023-7-4 21:02 | 只看該作者
chxelc 發表于 2023-7-4 11:44
問題比較多,大概列出來:
1、位碼錯誤2、送段碼前沒有清零
3、共陰數碼管需要加驅動,單片機IO負載能力 ...

你好,謝謝你給我解答問題,就是這個程序為什么按鈕不能實現三個按鍵,啟動,停止,復位功能
回復

使用道具 舉報

9#
ID:1086252 發表于 2023-7-4 21:03 | 只看該作者
wulin 發表于 2023-7-4 08:08
數碼管位驅動代碼與硬件不符及其他變量聲明處理不當。給你改了。

你好,謝謝你的解答,請問三個按鍵啟動,暫停,復位功能怎么實現呢
回復

使用道具 舉報

10#
ID:1086252 發表于 2023-7-4 23:45 | 只看該作者
chxelc 發表于 2023-7-4 11:44
問題比較多,大概列出來:
1、位碼錯誤2、送段碼前沒有清零
3、共陰數碼管需要加驅動,單片機IO負載能力 ...

你好,謝謝你的回復,請問如何實現按鍵啟動,暫停,復位功能
回復

使用道具 舉報

11#
ID:712097 發表于 2023-7-5 07:58 | 只看該作者
孫銘陽 發表于 2023-7-4 21:02
你好,謝謝你給我解答問題,就是這個程序為什么按鈕不能實現三個按鍵,啟動,停止,復位功能

參考我給你的代碼,
把41行EA=1;注釋掉,這樣上電就不會自動走時了。
把第58行bb=0;cc=0;dd=0;后面加上一句EA=1;,這樣復位后時間又繼續可以走了。

經過上述改動,按鍵從上到下啟動、暫停、復位都可以用了。
回復

使用道具 舉報

12#
ID:213173 發表于 2023-7-5 09:55 | 只看該作者
孫銘陽 發表于 2023-7-4 21:03
你好,謝謝你的解答,請問三個按鍵啟動,暫停,復位功能怎么實現呢

按鍵啟動,暫停,復位只適用于秒表或倒計時,一個按鍵即可。時鐘必須有調時功能。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日本韩国一区二区三区 | 成年人国产在线观看 | 日韩三级在线观看 | 人人亚洲 | 亚洲国产高清高潮精品美女 | 99热热精品 | 亚洲人成在线播放 | 日韩2020狼一二三 | 日韩在线免费 | 免费一级毛片 | 欧美一级黄色片免费观看 | 日韩电影一区二区三区 | 久久精品综合网 | 中文字幕亚洲一区 | 日本免费在线 | 精品在线一区二区三区 | 亚洲精品成人av久久 | 国产a区 | 中文字幕在线观看视频一区 | av网站免费看| 91免费在线看 | 四色永久 | 亚洲精品一二区 | 精品国产一区二区三区性色av | 亚洲成人免费观看 | 99re在线免费视频 | 日本精品一区二区三区在线观看视频 | 中文字幕在线一区 | 天堂久久天堂综合色 | 午夜资源| 国产高清一二三区 | 日韩精品一区二区三区视频播放 | 一区二区三区在线播放视频 | 成人婷婷 | 久久精选 | 天天爱天天操 | 狠狠的干狠狠的操 | 亚州成人 | 99re6热在线精品视频播放 | 久久精品播放 | 免费不卡av |