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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

分享自寫碼表單片機程序(共陰極數碼管顯示)

[復制鏈接]
跳轉到指定樓層
樓主
ID:407089 發表于 2018-10-9 16:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/*
晶振頻率11.0592MHz

程序修改說明:
第一版程序在開發板上運行時,雖能基本完成功能,但閃爍嚴重,復位后數組還有異常數據等,應是算法問題,此版尋求解決之道。

問題之一:閃爍嚴重
將FormatTimeWithMS(TotalMS)語句從定時器中斷程序中移出,放到mian中,問題得到解決,與預計的FormatTimeWithMS函數占了太大的時間資源不一致。
但發現出現另一問題:最后(右)一位顯示明顯偏亮,運行別的程序時,各位顯示一致,但亮度與前面所述最后一位一致,說明其實是前7位亮度偏暗。
經調試,發現原因為消影語句放置位置不妥,修改位置后,閃爍問題完全解決。

問題之二:保存數據的數據重置后數據異常
經調試,發現原因為數組設置與讀取不正確,修改后正常。
*/

  1. #include <reg52.h>
  2. #include <string.h>

  3. typedef unsigned int u16;
  4. typedef unsigned char u8;

  5. sbit seg_sel = P2^6;
  6. sbit bit_sel = P2^7;
  7. sbit start_key = P3^0;
  8. sbit record_key = P3^1;
  9. sbit reload_key = P3^2;
  10. sbit reset_key = P3^3;

  11. //共陰極數碼管0-9和"-"編碼0x40
  12. unsigned char code seg_table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F,0x40};
  13. //數碼管位碼(數組第1位對應數碼管最左位)
  14. unsigned char code bit_table[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

  15. #define DATA P0

  16. u8 timer;
  17. //初始化顯示數據
  18. u8 TimeFormat[] = {0,0,1,0,0,1,0,0};
  19. //數據記錄數組,5組,每組8個數據
  20. u8 ResultArray[5][8];
  21. u8 ResultMax = 5;
  22.         
  23. u8 i,j,k,z;
  24. unsigned long TotalMS;
  25. u8 minS,minG,secS,secG,msS,msG;
  26. bit IsReload;

  27. void delay(u16 num)
  28. {
  29.         u16 m,n;
  30.         for(m=num; m>0; m--)
  31.                 for(n=113; n>0; n--);
  32. }

  33. //此函數將毫秒數轉換成需要顯示的時間格式(設置數組TimeFormat[])
  34. void FormatTimeWithMS(long tms)
  35. {
  36.         minS = (tms/60000)/10;
  37.         minG = (tms/60000)%10;
  38.         secS = (tms-(minS*10+minG)*60000)/1000/10;
  39.         secG = (tms-(minS*10+minG)*60000)/1000%10;
  40.         msS = (tms%1000)/100;
  41.         msG = (tms%1000)%100/10;

  42.         TimeFormat[0] = minS;
  43.         TimeFormat[1] = minG;
  44.         TimeFormat[3] = secS;
  45.         TimeFormat[4] = secG;
  46.         TimeFormat[6] = msS;
  47.         TimeFormat[7] = msG;
  48. }

  49. void TimeDisplay(void)
  50. {
  51.         i = 0;
  52.         for (j=0; j<8; j++)
  53.         {
  54.                 //移位
  55.                 bit_sel = 1;
  56.                 DATA = bit_table[j];
  57.                 bit_sel = 0;

  58.                 //顯數
  59.                 seg_sel = 1;
  60.                 if ( i==2 | i==5 )
  61.                 {
  62.                         DATA = seg_table[10];
  63.                 }else{
  64.                         DATA = seg_table[TimeFormat[i]];
  65.                         if (!IsReload)
  66.                         {
  67.                                 DATA = seg_table[TimeFormat[i]];
  68.                         }else{
  69.                                 DATA = seg_table[ResultArray[z][i]];
  70.                         }
  71.                 }
  72.                 i++;
  73.                 delay(1);
  74.                
  75.                 //消影
  76.                 DATA = 0x00;
  77.                 seg_sel = 0;
  78.         }
  79. }

  80. void StopTimer(void)
  81. {
  82.         if(TR0){TR0=0;}        
  83.         IsReload = 1;
  84.         TotalMS = 0;
  85.         FormatTimeWithMS(TotalMS);
  86. }

  87. void main(void)
  88. {
  89.         DATA = 0x00;
  90.         P3 = 0xff;
  91.         seg_sel = 0;
  92.         bit_sel = 0;

  93.         TMOD = 0x01;
  94.         //單次溢出時間10ms之初值
  95.         TH0 = 0xdc;
  96.         TL0 = 0x00;
  97.         EA = 1;
  98.         ET0 = 1;

  99.         TotalMS = 0;

  100.         while(1)
  101.         {
  102.                 //計時啟停
  103.                 if (start_key == 0)
  104.                 {
  105.                         delay(10);
  106.                         if (start_key == 0)
  107.                         {
  108.                                 TR0 = ~TR0;
  109.                         }
  110.                         while(!start_key);
  111.                 }
  112.                
  113.                 //記錄時間
  114.                 if (record_key == 0)
  115.                 {
  116.                         delay(10);
  117.                         if (record_key == 0)
  118.                         {
  119.                                 //小于最大記錄時,記錄數據;達到最大值時,停止計時器
  120.                                 if (k < ResultMax)
  121.                                 {
  122.                                         ResultArray[k][0] = minS;
  123.                                         ResultArray[k][1] = minG;
  124.                                         ResultArray[k][2] = 1;
  125.                                         ResultArray[k][3] = secS;
  126.                                         ResultArray[k][4] = secG;
  127.                                         ResultArray[k][5] = 1;
  128.                                         ResultArray[k][6] = msS;
  129.                                         ResultArray[k][7] = msG;
  130.                                         k++;
  131.                                         if (k==ResultMax) if(TR0){TR0=0;}
  132.                                 }
  133.                         }
  134.                         while(!record_key);
  135.                 }
  136.                
  137.                 //回顯被記錄的時間
  138.                 if (reload_key == 0)
  139.                 {
  140.                         delay(10);
  141.                         if (reload_key == 0)
  142.                         {
  143.                                 //如果不是回顯數據,那么z=0(此處加判斷的意義是首次點擊回顯鍵時,數據從第一組開始顯示)
  144.                                 if(!IsReload)
  145.                                 {
  146.                                         z = 0;
  147.                                 }else{
  148.                                         z++;
  149.                                         if( z > (ResultMax-1)){z=0;}
  150.                                 }
  151.                                 StopTimer();
  152.                         }
  153.                         while(!reload_key);
  154.                 }               
  155.                
  156.                 //重置(計時器停止,總顯示時間清0,時間記錄數組清0,回顯數據狀態置0)
  157.                 if (reset_key == 0)
  158.                 {
  159.                         delay(10);
  160.                         if (reset_key == 0)
  161.                         {
  162.                                 StopTimer();
  163.                                 memset(ResultArray,0,sizeof(ResultArray));
  164.                                 IsReload = 0;
  165.                         }
  166.                         while(!reset_key);
  167.                 }

  168.                 //顯示時間
  169.                 FormatTimeWithMS(TotalMS);
  170.                 TimeDisplay();
  171.         }
  172. }

  173. void timer0_service(void) interrupt 1
  174. {
  175.         TH0 = 0xdc;
  176.         TL0 = 0x00;
  177.         //因為是每10ms溢出一次,故總時間累加10ms。
  178.         TotalMS = TotalMS+10;
  179. }
復制代碼


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

使用道具 舉報

沙發
ID:1 發表于 2018-10-10 19:21 | 只看該作者
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

板凳
ID:407089 發表于 2018-11-20 15:36 | 只看該作者
admin 發表于 2018-10-10 19:21
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣

stopwatch.rar (20.15 KB, 下載次數: 10)
謝謝管理!
回復

使用道具 舉報

地板
ID:407089 發表于 2018-11-20 15:37 | 只看該作者
stopwatch.rar (20.15 KB, 下載次數: 7)
附上原理圖及hex文件,方便各位測試。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区在线播放 | 亚洲国产精品久久久久婷婷老年 | 国产一区二区日韩 | 香蕉久久av| 99久久精品国产一区二区三区 | 91中文字幕在线 | 国产欧美日韩在线观看 | 有码在线| jvid精品资源在线观看 | 中文字幕在线网 | 台湾a级理论片在线观看 | 久久www免费人成看片高清 | 久久久久久久亚洲精品 | 亚洲精品乱码久久久久久蜜桃91 | www.黄色在线观看 | 欧美日韩亚洲国产 | 日日操夜夜摸 | 又爽又黄axxx片免费观看 | 亚洲国产精选 | 日韩精品在线一区二区 | 天天色影视综合 | 欧美一区二区在线免费观看 | 久久99久久99久久 | 99国产精品久久久 | yiren22 亚洲综合 | 色橹橹欧美在线观看视频高清 | 成人依人 | 欧美亚洲网站 | 国产一区二区三区视频在线观看 | 亚洲一区二区电影网 | www亚洲精品 | 精品国产欧美在线 | 久久久久se| 国产成人精品一区二 | 作爱视频免费观看 | 欧美在线播放一区 | 日本不卡在线视频 | 欧美一区二区三区久久精品 | av片毛片 | 久久久久久91香蕉国产 | 亚洲成人精品 |