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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1852|回復(fù): 1
收起左側(cè)

我的單片機(jī)DS1302時(shí)鐘,和數(shù)模轉(zhuǎn)換的程序

[復(fù)制鏈接]
ID:216965 發(fā)表于 2018-6-16 16:04 | 顯示全部樓層 |閱讀模式
上個(gè)月剛做的關(guān)于Ds1302時(shí)鐘和數(shù)模轉(zhuǎn)換的設(shè)計(jì),
檢測(cè)電池電壓,自我供電的 包含源碼和工程。

單片機(jī)源程序如下:
  1. /*
  2. *******************************************************************************
  3. *
  4. * 文件名:main.c
  5. 用DS1302實(shí)現(xiàn)簡(jiǎn)易電子鐘
  6. *         用液晶顯示日期時(shí)間,并可通過(guò)按鍵校時(shí)
  7. *******************************************************************************
  8. */

  9. #include <reg52.h>

  10. struct sTime {  //日期時(shí)間結(jié)構(gòu)體定義
  11.     unsigned int  year;
  12.     unsigned char mon;
  13.     unsigned char day;
  14.     unsigned char hour;
  15.     unsigned char min;
  16.     unsigned char sec;
  17.     unsigned char week;
  18. };

  19. bit flag300ms = 1;       //300ms定時(shí)標(biāo)志
  20. bit flag200ms = 1;  //200ms定時(shí)標(biāo)志
  21. unsigned char T0RH = 0;  //T0重載值的高字節(jié)
  22. unsigned char T0RL = 0;  //T0重載值的低字節(jié)
  23. struct sTime bufTime;  //日期時(shí)間緩沖區(qū)
  24. unsigned char setIndex = 0;  //時(shí)間設(shè)置索引

  25. void ConfigTimer0(unsigned int ms);
  26. unsigned char GetADCValue(unsigned char chn);
  27. void ValueToString(unsigned char *str, unsigned char val);
  28. extern void I2CStart();
  29. extern void I2CStop();
  30. extern unsigned char I2CReadACK();
  31. extern unsigned char I2CReadNAK();
  32. extern bit I2CWrite(unsigned char dat);
  33. extern void InitLcd1602();
  34. extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  35. void ConfigTimer0(unsigned int ms);
  36. void RefreshTimeShow();
  37. extern void InitDS1302();
  38. extern void GetRealTime(struct sTime *time);
  39. extern void SetRealTime(struct sTime *time);
  40. extern void KeyScan();
  41. extern void KeyDriver();
  42. extern void InitLcd1602();
  43. extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  44. extern void LcdSetCursor(unsigned char x, unsigned char y);
  45. extern void LcdOpenCursor();
  46. extern void LcdCloseCursor();

  47. void main()
  48. {
  49.     unsigned char psec=0xAA;  //秒備份,初值A(chǔ)A確保首次讀取時(shí)間后會(huì)刷新顯示
  50.         unsigned char val;
  51.     unsigned char str[10];

  52.     EA = 1;           //開(kāi)總中斷
  53.     ConfigTimer0(1);  //T0定時(shí)1ms
  54.     InitDS1302();     //初始化實(shí)時(shí)時(shí)鐘
  55.     InitLcd1602();    //初始化液晶
  56.    
  57.     //初始化屏幕上固定不變的內(nèi)容
  58.     LcdShowStr(0, 0, "20  -  -  ");
  59.     LcdShowStr(1, 1, "  :  :  ");
  60.         LcdShowStr(11, 0, "Vol");  //顯示通道指示
  61.    
  62.     while (1)
  63.     {
  64.         KeyDriver();  //調(diào)用按鍵驅(qū)動(dòng)
  65.         if (flag200ms && (setIndex == 0))
  66.         {                             //每隔200ms且未處于設(shè)置狀態(tài)時(shí),
  67.             flag200ms = 0;
  68.             GetRealTime(&bufTime);    //獲取當(dāng)前時(shí)間
  69.             if (psec != bufTime.sec)  //檢測(cè)到時(shí)間有變化時(shí)刷新顯示
  70.             {
  71.                 RefreshTimeShow();
  72.                 psec = bufTime.sec;   //用當(dāng)前值更新上次秒數(shù)
  73.             }
  74.         }
  75.                 if (flag300ms)
  76.         {
  77.             flag300ms = 0;
  78.             //顯示通道0的電壓
  79.             val = GetADCValue(0);     //獲取ADC通道0的轉(zhuǎn)換值
  80.             ValueToString(str, val);  //轉(zhuǎn)為字符串格式的電壓值
  81.             LcdShowStr(11, 1, str);    //顯示到液晶上
  82.             //顯示通道1的電壓
  83.             /*val = GetADCValue(1);
  84.             ValueToString(str, val);
  85.             LcdShowStr(6, 1, str);
  86.             //顯示通道3的電壓
  87.             val = GetADCValue(3);
  88.             ValueToString(str, val);
  89.             LcdShowStr(12, 1, str);           */
  90.         }
  91.     }
  92. }
  93. /* 將一個(gè)BCD碼字節(jié)顯示到屏幕上,(x,y)-屏幕起始坐標(biāo),bcd-待顯示BCD碼 */
  94. void ShowBcdByte(unsigned char x, unsigned char y, unsigned char bcd)
  95. {
  96.     unsigned char str[4];
  97.    
  98.     str[0] = (bcd >> 4) + '0';
  99.     str[1] = (bcd&0x0F) + '0';
  100.     str[2] = '\0';
  101.     LcdShowStr(x, y, str);
  102. }
  103. /* 刷新日期時(shí)間的顯示 */
  104. void RefreshTimeShow()
  105. {
  106.     ShowBcdByte(2,  0, bufTime.year);
  107.     ShowBcdByte(5,  0, bufTime.mon);
  108.     ShowBcdByte(8, 0, bufTime.day);
  109.     ShowBcdByte(1,  1, bufTime.hour);
  110.     ShowBcdByte(4,  1, bufTime.min);
  111.     ShowBcdByte(7, 1, bufTime.sec);
  112. }
  113. /* 刷新當(dāng)前設(shè)置位的光標(biāo)指示 */
  114. void RefreshSetShow()
  115. {
  116.     switch (setIndex)
  117.     {
  118.         case 1:  LcdSetCursor(2,  0); break;
  119.         case 2:  LcdSetCursor(3,  0); break;
  120.         case 3:  LcdSetCursor(5,  0); break;
  121.         case 4:  LcdSetCursor(6,  0); break;
  122.         case 5:  LcdSetCursor(8, 0); break;
  123.         case 6:  LcdSetCursor(9, 0); break;
  124.         case 7:  LcdSetCursor(1,  1); break;
  125.         case 8:  LcdSetCursor(2,  1); break;
  126.         case 9:  LcdSetCursor(4,  1); break;
  127.         case 10: LcdSetCursor(5,  1); break;
  128.         case 11: LcdSetCursor(7, 1); break;
  129.         case 12: LcdSetCursor(8, 1); break;
  130.         default:  break;
  131.     }
  132. }
  133. /* 遞增一個(gè)BCD碼的高位 */
  134. unsigned char IncBcdHigh(unsigned char bcd)
  135. {
  136.     if ((bcd&0xF0) < 0x90)
  137.         bcd += 0x10;
  138.     else
  139.         bcd &= 0x0F;
  140.    
  141.     return bcd;
  142. }
  143. /* 遞增一個(gè)BCD碼的低位 */
  144. unsigned char IncBcdLow(unsigned char bcd)
  145. {
  146.     if ((bcd&0x0F) < 0x09)
  147.         bcd += 0x01;
  148.     else
  149.         bcd &= 0xF0;
  150.    
  151.     return bcd;
  152. }
  153. /* 遞減一個(gè)BCD碼的高位 */
  154. unsigned char DecBcdHigh(unsigned char bcd)
  155. {
  156.     if ((bcd&0xF0) > 0x00)
  157.         bcd -= 0x10;
  158.     else
  159.         bcd |= 0x90;
  160.    
  161.     return bcd;
  162. }
  163. /* 遞減一個(gè)BCD碼的低位 */
  164. unsigned char DecBcdLow(unsigned char bcd)
  165. {
  166.     if ((bcd&0x0F) > 0x00)
  167.         bcd -= 0x01;
  168.     else
  169.         bcd |= 0x09;
  170.    
  171.     return bcd;
  172. }
  173. /* 遞增時(shí)間當(dāng)前設(shè)置位的值 */
  174. void IncSetTime()
  175. {
  176.     switch (setIndex)
  177.     {
  178.         case 1:  bufTime.year = IncBcdHigh(bufTime.year); break;
  179.         case 2:  bufTime.year = IncBcdLow(bufTime.year);  break;
  180.         case 3:  bufTime.mon  = IncBcdHigh(bufTime.mon);  break;
  181.         case 4:  bufTime.mon  = IncBcdLow(bufTime.mon);   break;
  182.         case 5:  bufTime.day  = IncBcdHigh(bufTime.day);  break;
  183.         case 6:  bufTime.day  = IncBcdLow(bufTime.day);   break;
  184.         case 7:  bufTime.hour = IncBcdHigh(bufTime.hour); break;
  185.         case 8:  bufTime.hour = IncBcdLow(bufTime.hour);  break;
  186.         case 9:  bufTime.min  = IncBcdHigh(bufTime.min);  break;
  187.         case 10: bufTime.min  = IncBcdLow(bufTime.min);   break;
  188.         case 11: bufTime.sec  = IncBcdHigh(bufTime.sec);  break;
  189.         case 12: bufTime.sec  = IncBcdLow(bufTime.sec);   break;
  190.         default:  break;
  191.     }
  192.     RefreshTimeShow();
  193.     RefreshSetShow();
  194. }
  195. /* 遞減時(shí)間當(dāng)前設(shè)置位的值 */
  196. void DecSetTime()
  197. {
  198.     switch (setIndex)
  199.     {
  200.         case 1:  bufTime.year = DecBcdHigh(bufTime.year); break;
  201.         case 2:  bufTime.year = DecBcdLow(bufTime.year);  break;
  202.         case 3:  bufTime.mon  = DecBcdHigh(bufTime.mon);  break;
  203.         case 4:  bufTime.mon  = DecBcdLow(bufTime.mon);   break;
  204.         case 5:  bufTime.day  = DecBcdHigh(bufTime.day);  break;
  205.         case 6:  bufTime.day  = DecBcdLow(bufTime.day);   break;
  206.         case 7:  bufTime.hour = DecBcdHigh(bufTime.hour); break;
  207.         case 8:  bufTime.hour = DecBcdLow(bufTime.hour);  break;
  208.         case 9:  bufTime.min  = DecBcdHigh(bufTime.min);  break;
  209.         case 10: bufTime.min  = DecBcdLow(bufTime.min);   break;
  210.         case 11: bufTime.sec  = DecBcdHigh(bufTime.sec);  break;
  211.         case 12: bufTime.sec  = DecBcdLow(bufTime.sec);   break;
  212.         default:  break;
  213.     }
  214.     RefreshTimeShow();
  215.     RefreshSetShow();
  216. }
  217. /* 右移時(shí)間設(shè)置位 */
  218. void RightShiftTimeSet()
  219. {
  220.     if (setIndex != 0)
  221.     {
  222.         if (setIndex < 12)
  223.             setIndex++;
  224.         else
  225.             setIndex = 1;
  226.         RefreshSetShow();
  227.     }
  228. }
  229. /* 左移時(shí)間設(shè)置位 */
  230. void LeftShiftTimeSet()
  231. {
  232.     if (setIndex != 0)
  233.     {
  234.         if (setIndex > 1)
  235.             setIndex--;
  236.         else
  237.             setIndex = 12;
  238.         RefreshSetShow();
  239.     }
  240. }
  241. /* 進(jìn)入時(shí)間設(shè)置狀態(tài) */
  242. void EnterTimeSet()
  243. {
  244.     setIndex = 2;       //把設(shè)置索引設(shè)置為2,即可進(jìn)入設(shè)置狀態(tài)
  245.     LeftShiftTimeSet(); //再利用現(xiàn)成的左移操作移到位置1并完成顯示刷新
  246.     LcdOpenCursor();    //打開(kāi)光標(biāo)閃爍效果
  247. }
  248. /* 退出時(shí)間設(shè)置狀態(tài),save-是否保存當(dāng)前設(shè)置的時(shí)間值 */
  249. void ExitTimeSet(bit save)
  250. {
  251.     setIndex = 0;     //把設(shè)置索引設(shè)置為0,即可退出設(shè)置狀態(tài)
  252.     if (save)         //需保存時(shí)即把當(dāng)前設(shè)置時(shí)間寫入DS1302
  253.     {
  254.         SetRealTime(&bufTime);
  255.     }
  256.     LcdCloseCursor(); //關(guān)閉光標(biāo)顯示
  257. }
  258. /* 按鍵動(dòng)作函數(shù),根據(jù)鍵碼執(zhí)行相應(yīng)的操作,keycode-按鍵鍵碼 */
  259. void KeyAction(unsigned char keycode)
  260. {
  261.     if  ((keycode>='0') && (keycode<='9'))  //本例中不響應(yīng)字符鍵
  262.     {
  263.     }
  264.     else if (keycode == 0x26)  //向上鍵,遞增當(dāng)前設(shè)置位的值
  265.     {
  266.         IncSetTime();
  267.     }
  268.     else if (keycode == 0x28)  //向下鍵,遞減當(dāng)前設(shè)置位的值
  269.     {
  270.         DecSetTime();
  271.     }
  272.     else if (keycode == 0x25)  //向左鍵,向左切換設(shè)置位
  273.     {
  274.         LeftShiftTimeSet();
  275.     }
  276.     else if (keycode == 0x27)  //向右鍵,向右切換設(shè)置位
  277.     {
  278.         RightShiftTimeSet();
  279.     }
  280.     else if (keycode == 0x0D)  //回車鍵,進(jìn)入設(shè)置模式/啟用當(dāng)前設(shè)置值
  281.     {
  282.         if (setIndex == 0)  //不處于設(shè)置狀態(tài)時(shí),進(jìn)入設(shè)置狀態(tài)
  283.         {
  284.             EnterTimeSet();
  285.         }
  286.         else                //已處于設(shè)置狀態(tài)時(shí),保存時(shí)間并退出設(shè)置狀態(tài)
  287.         {
  288.             ExitTimeSet(1);
  289.         }
  290.     }
  291.     else if (keycode == 0x1B)  //Esc鍵,取消當(dāng)前設(shè)置
  292.     {
  293.         ExitTimeSet(0);
  294.     }
  295. }
  296. /* 讀取當(dāng)前的ADC轉(zhuǎn)換值,chn-ADC通道號(hào)0~3 */
  297. unsigned char GetADCValue(unsigned char chn)
  298. {
  299.     unsigned char val;
  300.    
  301.     I2CStart();
  302.     if (!I2CWrite(0x48<<1))  //尋址PCF8591,如未應(yīng)答,則停止操作并返回0
  303.     {
  304.         I2CStop();
  305.         return 0;
  306.     }
  307.     I2CWrite(0x40|chn);        //寫入控制字節(jié),選擇轉(zhuǎn)換通道
  308.     I2CStart();
  309.     I2CWrite((0x48<<1)|0x01);  //尋址PCF8591,指定后續(xù)為讀操作   
  310.     I2CReadACK();              //先空讀一個(gè)字節(jié),提供采樣轉(zhuǎn)換時(shí)間
  311.     val = I2CReadNAK();        //讀取剛剛轉(zhuǎn)換完的值
  312.     I2CStop();
  313.    
  314.     return val;
  315. }
  316. /* ADC轉(zhuǎn)換值轉(zhuǎn)為實(shí)際電壓值的字符串形式,str-字符串指針,val-AD轉(zhuǎn)換值 */
  317. void ValueToString(unsigned char *str, unsigned char val)
  318. {
  319.     //電壓值=轉(zhuǎn)換結(jié)果*2.5V/255,式中的25隱含了一位十進(jìn)制小數(shù)
  320.     val = (val*50) / 255;
  321.     str[0] = (val/10) + '0';  //整數(shù)位字符
  322.     str[1] = '.';             //小數(shù)點(diǎn)
  323.     str[2] = (val%10) + '0';  //小數(shù)位字符
  324.     str[3] = 'V';             //電壓?jiǎn)挝?br />
  325.     str[4] = '\0';            //結(jié)束符
  326. }
  327. ……………………

  328. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
kechuang1.zip (83.42 KB, 下載次數(shù): 6)
回復(fù)

使用道具 舉報(bào)

ID:352962 發(fā)表于 2018-6-16 20:02 | 顯示全部樓層
很贊的 ,感謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 青青久久| 综合色播 | 精品欧美乱码久久久久久1区2区 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 蜜桃一区二区三区 | 国产精品免费在线 | 成人免费看片又大又黄 | japan25hdxxxx日本 做a的各种视频 | 日日夜夜天天 | 国产高清一区二区 | 国产美女在线精品免费 | 中文字幕在线观看视频一区 | 精品久久九九 | 日韩一区二区在线视频 | 国产一区欧美一区 | 国产乱xxav| 免费在线看黄视频 | 成人在线视频网址 | 久久久久久久久久一区二区 | 亚洲精品视频在线看 | 无人区国产成人久久三区 | 激情五月综合 | 日韩中文字幕一区二区 | 一区二区三区四区免费在线观看 | 97精品国产| 中文字幕在线一区二区三区 | 黄色国产视频 | 天天操妹子 | 亚洲风情在线观看 | 亚洲综合电影 | 欧美日韩成人网 | 国产成人在线一区二区 | 黄色av网站免费看 | 91精品久久久久 | 欧美性一区二区三区 | 一区二区三区欧美 | 99久久久无码国产精品 | 正在播放国产精品 | 剑来高清在线观看 | 国产精品污www一区二区三区 | 天天射视频|