|
花了幾個(gè)星期制作了一個(gè)電子鬧鐘,能顯示自定義字符。三個(gè)按鍵調(diào)整時(shí)間和鬧鐘,主要是程序調(diào)試
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (53.92 KB, 下載次數(shù): 69)
下載附件
2018-11-13 16:51 上傳
0.png (54.99 KB, 下載次數(shù): 49)
下載附件
2018-11-13 16:51 上傳
0.png (8.8 KB, 下載次數(shù): 67)
下載附件
2018-11-13 16:51 上傳
單片機(jī)源代碼:
- #define _MAIN_C
- #include "config.h"
- #include "Lcd1602.h"
- #include "keyboard.h"
- #include "DS1302.h"
- #include "DS18B20.h"
- #include "Time.h"
- #include "main.h"
- bit flag2s = 0; //2s定時(shí)標(biāo)志位
- bit flag200ms = 0; //200ms定時(shí)標(biāo)志
- uint8 T0RH = 0; //T0重載值的高字節(jié)
- uint8 T0RL = 0; //T0重載值的低字節(jié)
- enum eStaSystem staSystem = E_NORMAL; //系統(tǒng)運(yùn)行狀態(tài)
- uint8 code table[]={0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x0E,0x00,0x00,0x1F,0x00,0x00,
- 0x00,0x00,0x0E,0x00,0x0E,0x00,0x1F,0x00,
- 0x00,0x1F,0x15,0x15,0x1B,0x11,0x1F,0x00,
- 0x00,0x1E,0x08,0x1E,0x0A,0x0A,0x0A,0x1F,
- 0x00,0x04,0x00,0x1F,0x0A,0x11,0x11,0x00,
- 0x00,0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,
- 0x00,0x04,0x0E,0x0E,0x0E,0x1F,0x00,0x0E };
- void main()
- {
- uint8 ledsj=0;
- EA = 1; //開總中斷
- ConfigTimer0(1); //配置T0定時(shí)1ms
- InitDS1302(); //初始化實(shí)時(shí)時(shí)鐘模塊
- InitLcd1602(); //初始化液晶模塊
- LED=0;
- WriteROM();
- Start18B20(); //啟動(dòng)首次溫度轉(zhuǎn)換
- LcdShowStr(2, 0,"Zhao Wen jie");
- LcdShowStr(0, 1,"Qichuangnaozhong");
- while (!flag2s); //上電后延時(shí)2秒
- flag2s = 0;
- LcdClearScreen(); //液晶清屏
- RefreshDate(1); //立即刷新日期顯示
- RefreshTemp(1); //立即刷新溫度顯示
- RefreshTime(); //刷新當(dāng)前時(shí)間
-
- while (1) //進(jìn)入主循環(huán)
- {
- KeyDriver(); //執(zhí)行按鍵驅(qū)動(dòng)
-
- if (flag200ms) //每隔200ms執(zhí)行以下分支
- {
- flag200ms = 0;
-
-
- if (staSystem == E_NORMAL) //正常運(yùn)行時(shí)刷新日期顯示
- {
- AlarmMonitor(); //監(jiān)控鬧鐘
- if(key==0)
- {
- if(bakekey==0)
- {
- LcdClearScreen(); //液晶清
- RefreshDate(1); //立即刷新日期顯示
- RefreshTemp(1); //立即刷新溫度顯示
- bakekey=1;
- }
- if(bakekey==1)
- {
- RefreshTime(); //刷新當(dāng)前時(shí)間
- RefreshDate(0); //立即刷新日期
- }
- else
- {
- ;;
- }
- }
- else
- {
- LcdClearScreen(); //液晶清屏
- RefreshAlarm();
- }
-
- }
- }
- if (flag2s) //每隔2s執(zhí)行以下分支
- {
- flag2s = 0;
- if (staSystem == E_NORMAL) //正常運(yùn)行時(shí)刷新日期顯示
- {
- ledsj++;
- if(ledsj>=30)
- {
- ledsj=0;
- LED=1;
- }
-
- RefreshTemp(0);
- }
- }
- }
- }
- /* 溫度刷新函數(shù),讀取當(dāng)前溫度并根據(jù)需要刷新液晶顯示,
- ** ops-刷新選項(xiàng):為0時(shí)只當(dāng)溫度變化才刷新,非0則立即刷新 */
- void RefreshTemp(uint8 ops)
- {
- int16 temp;
- uint8 pdata str[8];
- static int16 backup = 0;
-
- Get18B20Temp(&temp); //獲取當(dāng)前溫度值16bit
- Start18B20(); //啟動(dòng)下一次轉(zhuǎn)換
- temp >>= 4; //舍棄4bit小數(shù)位
- if ((backup!=temp) || (ops!=0)) //按需要刷新液晶顯示
- {
- if((temp>>7)&0x1f)
- {
- LcdShowChar(12, 1, '-');
- temp=(uint8)temp<<5;
- temp=~(temp)+1;
- }
- str[0] = (temp/10) + '0'; //十位轉(zhuǎn)為ASCII碼
- str[1] = (temp%10) + '0'; //個(gè)位轉(zhuǎn)為ASCII碼
- str[2] = 'C';
- str[3] = '\0'; //字符串結(jié)束符
- LcdShowStr(13, 1, str); //顯示到液晶上
- backup = temp; //刷新上次溫度值
- }
- }
- /* 配置并啟動(dòng)T0,ms-T0定時(shí)時(shí)間 */
- void ConfigTimer0(uint16 ms)
- {
- uint32 tmp;
-
- tmp = (SYS_MCLK*ms)/1000; //計(jì)算所需的計(jì)數(shù)值
- tmp = 65536 - tmp; //計(jì)算定時(shí)器重載值
- tmp = tmp + 33; //補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差
- T0RH = (uint8)(tmp>>8); //定時(shí)器重載值拆分為高低字節(jié)
- T0RL = (uint8)tmp;
- TMOD &= 0xF0; //清零T0的控制位
- TMOD |= 0x01; //配置T0為模式1
- TH0 = T0RH; //加載T0重載值
- TL0 = T0RL;
- ET0 = 1; //使能T0中斷
- TR0 = 1; //啟動(dòng)T0
- }
- /* T0中斷服務(wù)函數(shù),實(shí)現(xiàn)系統(tǒng)定時(shí)和按鍵掃描 */
- void InterruptTimer0() interrupt 1
- {
- static uint8 tmr2s = 0;
- static uint8 tmr200ms = 0;
-
- TH0 = T0RH; //重新加載重載值
- TL0 = T0RL;
- tmr200ms++; //定時(shí)200ms
- if (tmr200ms >= 200)
- {
- tmr200ms = 0;
- flag200ms = 1;
- tmr2s++; //定時(shí)2s
- if (tmr2s >= 10)
- {
- tmr2s = 0;
- flag2s = 1;
- }
- }
- KeyScan(); //執(zhí)行按鍵掃描
- }
- void WriteROM()
- {
- uint8 i=0;
- LcdWriteCmd(0x40);
- for(i=0;i<64;i++)
- {
- LcdWriteDat(table[i]);
- }
- }
- 其他子程序在附件中。
復(fù)制代碼
全部資料51hei下載地址:
電路圖.rar
(2.89 MB, 下載次數(shù): 106)
2018-11-13 16:29 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
c.rar
(107.45 KB, 下載次數(shù): 102)
2018-11-13 16:25 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|