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

標(biāo)題: 基于51單片機(jī)的數(shù)字電子時(shí)鐘異常顯示 [打印本頁]

作者: xunuo    時(shí)間: 2019-2-15 14:59
標(biāo)題: 基于51單片機(jī)的數(shù)字電子時(shí)鐘異常顯示
我基于51設(shè)計(jì)了一個(gè)數(shù)字電子時(shí)鐘,但不知道哪里出錯(cuò)了,導(dǎo)致仿真顯示時(shí)顯示很離譜,想請(qǐng)教下各位是程序里哪里出問題導(dǎo)致的。

代碼如下
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define u8 unsigned char
  4. #define u16 unsigned int

  5. sbit K1 = P1^4;
  6. sbit K2 = P1^5;
  7. sbit K3 = P1^6;
  8. sbit K4 = P1^7;
  9. u8 discode[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //數(shù)碼管段碼
  10. u8 data2[6] = {0};                                                           //定義時(shí)分秒的十位和個(gè)位
  11. u8 data1[3] = {0};                                                           //保存時(shí)分秒的數(shù)據(jù)
  12. u8 count = 0;                                                                //中斷次數(shù)

  13. void delayms(u8 ms)
  14. {
  15.         u8 i;

  16.         while(ms--)
  17.         {
  18.                 for(i = 0; i < 120; i++)
  19.                         ;
  20.         }
  21. }

  22. void process(void)                                                           //數(shù)據(jù)處理函數(shù),分別分離其十位和個(gè)位
  23. {
  24.         data2[0] = data1[0] / 10;
  25.         data2[1] = data1[1] % 10;
  26.         data2[2] = data1[2] / 10;
  27.         data2[3] = data1[3] % 10;
  28.         data2[4] = data1[4] / 10;
  29.         data2[5] = data1[5] % 10;
  30. }

  31. void display(void)                                                                                                                         //數(shù)據(jù)顯示函數(shù)
  32. {
  33.         u8 i = 0xdf, j;
  34.                                                                                                                                                          
  35.         for(j = 0; j < 6; j++)                                                                                                         
  36.         {
  37.                 P0 = discode[data2[j]];
  38.                 P2 = i;
  39.                 i = (i >> 1) | 0x20;
  40.                 delayms(2);
  41.         }
  42. }

  43. void timer0(void) interrupt 1 using 1                                                                                //定時(shí)中斷函數(shù),定時(shí)50ms
  44. {
  45.         count++;
  46.         if(count == 20)
  47.         {
  48.                 count = 0;
  49.                 data1[2]++;
  50.                 if(data1[2] == 60)
  51.                 {
  52.                         data1[2] = 0;
  53.                         data1[1]++;
  54.                         if(data1[1] == 60)
  55.                         {
  56.                                 data1[1] = 0;
  57.                                 data1[0]++;
  58.                                 if(data1[0] == 24)
  59.                                         data1[0] = 0;
  60.                         }
  61.                 }
  62.         }
  63.         TH0 = (65536 - 50000) / 256;
  64.         TL0 = (65536 - 50000) % 256;        
  65. }

  66. u8 keyscan(void)                                                           //按鍵掃描函數(shù),讀取按鍵狀態(tài)
  67. {
  68.         u8 key = 0x00;                                                         //保存按鍵狀態(tài)碼

  69.         key |= K4;                                                                                                                           //讀取K4建狀態(tài)
  70.         key <<= 1;                                                             //左移一位,為讀取K3做準(zhǔn)備
  71.         key |= K3;
  72.         key <<= 1;
  73.         key |= K2;
  74.         key <<= 1;
  75.         key |= K1;
  76.         
  77.         return (key);
  78. }

  79. void horse(u8 i)                                                           //根據(jù)不同按鍵執(zhí)行相應(yīng)功能
  80. {
  81.         switch(i)
  82.         {
  83.                 case 0x0e:
  84.                         data1[0]++;
  85.                         if(data1[0] == 24) data1[0] = 0; break;
  86.                 case 0x0d:
  87.                         data1[0]--;
  88.                         if(data1[0] == 255) data1[0] = 23; break;
  89.                 case 0x0b:
  90.                         data1[1]++;
  91.                         if(data1[1] == 60) data1[1] = 0; break;
  92.                 case 0x07:
  93.                         data1[1]--;
  94.                         if(data1[1] == 255) data1[1] = 59; break;
  95.         }
  96. }

  97. void keyproc(void)                                                                                                                   //按鍵掃描及處理函數(shù)
  98. {                                                                                                                                                   
  99.         u8 key1;

  100.         key1 = keyscan();                                                                          //掃描按鍵返回鍵碼給key1
  101.         if(key1 != 0x0f)
  102.         {
  103.                 delayms(10);
  104.                 key1 = keyscan();
  105.                 if(key1 != 0x0f)                                                                                                   //如果不等于表示確實(shí)有按鍵按下
  106.                 {
  107.                         while(keyscan() != 0x0f)                                                                           //等待按鍵釋放
  108.                                 display();
  109.                         horse(key1);                                                   //釋放后等待按鍵處理
  110.                 }
  111.         }
  112. }

  113. void main(void)
  114. {
  115.         TMOD = 0x01;
  116.         EA = 1;
  117.         ET0 = 1;
  118.         TH0 = (65536 - 50000) / 256;
  119.         TL0 = (65536 - 50000) % 256;
  120.         TR0 = 1;

  121.         while(1)
  122.         {
  123.                 keyproc();                                                         //案件處理
  124.                 process();                                                                                                                   //數(shù)據(jù)處理
  125.                 display();                                                                                                                   //顯示數(shù)據(jù)
  126.         }
  127. }
復(fù)制代碼

proteus仿真結(jié)果如下,出現(xiàn)六個(gè)八后數(shù)碼管便不再改變了。

QQ瀏覽器截圖20190215145442.png (171.86 KB, 下載次數(shù): 20)

QQ瀏覽器截圖20190215145442.png

數(shù)字電子時(shí)鐘.zip

89.91 KB, 下載次數(shù): 17

此為程序+仿真文件


作者: wulin    時(shí)間: 2019-2-15 22:54
你的程序問題多多,給你改了,仿真正常,你自己對(duì)照查找問題。




  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. sbit K1 = P1^4;
  6. sbit K2 = P1^5;
  7. sbit K3 = P1^6;
  8. sbit K4 = P1^7;
  9. u8 code discode[]={//共陽數(shù)碼管段碼"0~f-."
  10.                 0xc0,0xf9,0xa4,0xb0,
  11.                 0x99,0x92,0x82,0xf8,
  12.                 0x80,0x90,0x88,0x83,
  13.                 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
  14. u8 code data1[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位碼
  15. //u8 code data1[8]={~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80};//三極管反向位碼
  16. u8 data2[8]; //定義時(shí)分秒的十位和個(gè)位
  17. u8 shi,fen,miao;//時(shí)分秒變量
  18. u16 count = 0;//中斷次數(shù)
  19. u8 num;//鍵值變量

  20. void process(void) //數(shù)據(jù)處理函數(shù),分別分離其十位和個(gè)位
  21. {
  22.         data2[0] = shi / 10;
  23.         data2[1] = shi % 10;
  24.         data2[2] = 16;
  25.         data2[3] = fen / 10;
  26.         data2[4] = fen % 10;
  27.         data2[5] = 16;
  28.         data2[6] = miao / 10;
  29.         data2[7] = miao % 10;
  30. }

  31. void display(void) //顯示程序                                                                                                                        //數(shù)據(jù)顯示函數(shù)
  32. {
  33.         static u8 i=0;
  34.         P0 = 0xff;
  35.         P2=data1[i];
  36.         P0 = discode[data2[i]];
  37.         i++;
  38.         if(i==8)
  39.                 i=0;
  40. }

  41. void horse()//根據(jù)不同按鍵執(zhí)行相應(yīng)功能
  42. {
  43.         switch(num)
  44.         {
  45.                 case 0xe0:
  46.                 shi++;
  47.                 if(shi == 24) shi = 0; break;
  48.                 case 0xd0:
  49.                 shi--;
  50.                 if(shi == 255) shi = 23; break;
  51.                 case 0xb0:
  52.                 fen++;
  53.                 if(fen == 60) fen = 0; break;
  54.                 case 0x70:
  55.                 fen--;
  56.                 if(fen == 255) fen = 59; break;
  57.         }
  58. }

  59. void keyproc(void)  //按鍵掃描及處理函數(shù)
  60. {                                                                                                                                                   
  61.         static bit sign=0;                        //按鍵自鎖標(biāo)志
  62.         static u16 count1=0;                //消抖計(jì)數(shù)變量        
  63.         u8 key;  //保存按鍵狀態(tài)碼        
  64.         key=P1&0xf0;
  65.         if(key!=0xf0)
  66.         {
  67.                 count1++;                                //消抖計(jì)數(shù)
  68.                 if((count1>=500)&&(sign==0))//100~1000,根據(jù)主循環(huán)周期調(diào)整約10~20ms
  69.                 {
  70.                         sign=1;                        //按鍵自鎖標(biāo)志置1
  71.                         num=key;
  72.                         horse();
  73.                 }
  74.         }
  75.         else                                                //鍵抬起
  76.         {
  77.                 sign=0;                                        //按鍵自鎖標(biāo)志清0
  78.                 count1=0;                                //消抖計(jì)數(shù)清0
  79.         }
  80. }

  81. void main(void)
  82. {
  83.         TMOD = 0x01;
  84.         TH0 = (65536 - 1000) / 256;
  85.         TL0 = (65536 - 1000) % 256;
  86.         TR0 = 1;
  87.         EA = 1;
  88.         ET0 = 1;
  89.         while(1)
  90.         {
  91.                 keyproc(); //按鍵處理
  92.                 process();  //數(shù)據(jù)處理
  93. //                display();        //顯示數(shù)據(jù)
  94.         }
  95. }
  96. void timer0(void) interrupt 1 using 1  //定時(shí)中斷函數(shù)1ms
  97. {
  98.         TH0 = (65536 - 1000) / 256;
  99.         TL0 = (65536 - 1000) % 256;
  100.         count++;
  101.         if(count == 1000)
  102.         {
  103.                 count = 0;
  104.                 miao++;
  105.                 if(miao == 60)
  106.                 {
  107.                         miao = 0;
  108.                         fen++;
  109.                         if(fen == 60)
  110.                         {
  111.                                 fen = 0;
  112.                                 shi++;
  113.                                 if(shi == 24)
  114.                                 shi = 0;
  115.                         }
  116.                 }
  117.         }
  118.         display();        //顯示數(shù)據(jù)
  119. }
復(fù)制代碼



作者: wc86110    時(shí)間: 2019-2-15 23:38
從貼圖上看是位驅(qū)動(dòng)問題
作者: xunuo    時(shí)間: 2019-2-20 15:41
wulin 發(fā)表于 2019-2-15 22:54
你的程序問題多多,給你改了,仿真正常,你自己對(duì)照查找問題。

哇,謝謝您的指導(dǎo)




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久不卡| 91精品国产乱码久久蜜臀 | 精品欧美色视频网站在线观看 | 一区二区三区在线 | 97在线超碰| 在线日韩| aaaaaaa片毛片免费观看 | 色综合色综合网色综合 | 爽爽免费视频 | 久久久一二三区 | 午夜影视 | 日本中文在线 | 亚洲视频一区在线播放 | 欧美自拍第一页 | 欧美aaaaaaaaaa | 91中文在线观看 | 操人视频在线观看 | 最新国产精品视频 | 日韩高清黄色 | 国产精品日韩欧美一区二区 | 精品中文字幕在线 | 国产91中文 | 日本淫视频 | 久久不卡 | 一区视频在线 | 成人免费看黄网站在线观看 | 在线观看亚 | 欧美日韩电影一区二区 | 久久国产欧美日韩精品 | 亚洲激精日韩激精欧美精品 | 在线看无码的免费网站 | 91亚洲国产 | 午夜精品久久久久久久久久久久 | 中文字幕精品视频 | 久久精品国产免费看久久精品 | 久久日韩精品 | 久久91av| 中文字幕在线二区 | 黄色av一区| 国产精品久久久久久 | 视频一区二区三区在线观看 |