|
用20引腳的小單片機(jī),驅(qū)動1302時鐘芯片,和小屏12864顯示時間和計(jì)數(shù)信息。
由于只有2K ROM空間,所以程序比較簡單,沒有調(diào)時間,按鍵采用外部中斷和定時器控制防連續(xù)計(jì)數(shù)
按一下外部中斷1,單次數(shù)值 +1,按一下外部中斷2,單次清0,積++,
制作出來的實(shí)物圖如下:
單片機(jī)源程序如下:
- /****************************************************************
- 通用頭文件
- ****************************************************************/
- #include <STC12C2052.H>
- #include <intrins.h>
- #include <DS1302.H>
- #include<time0.H>
- #include<STC12C2052EEPROM.H>
- #include <LCDMINI12864.H>
- //uchar x;
- //#include<KEY.H>
- /****************************************************************
- 硬件接口定義
- ****************************************************************/
- /*DS1302IO接口 請用3P杜邦線與對應(yīng)的P1口鏈接*/
- //sbit TSCLK = P1^0; //DS1302時鐘引腳
- //sbit TIO = P1^1; //DS1302數(shù)據(jù)引腳
- //sbit TRST = P1^2; //DS1302使能引腳
- /*4位獨(dú)立按鍵引腳*/
- //sbit KEY_S2 = P3^0; //S2獨(dú)立按鍵
- //sbit KEY_S3 = P3^1; //S3獨(dú)立按鍵
- //sbit KEY_S4 = P3^2; //S4獨(dú)立按鍵
- //sbit KEY_S5 = P3^3; //S5獨(dú)立按鍵
- /*數(shù)碼管*/
- //sbit WE = P2^7; //數(shù)碼管位選
- //sbit DU = P2^6; //數(shù)碼管段選
- /*DS18B20溫度傳感器引腳*/
- //sbit DS18B20_IO = P2^2; //DS18B20通信引腳
- /*5V有源蜂鳴器引腳*/
- //sbit BUZZER = P2^3; //蜂鳴器引腳
- sbit BEEP = P3^4 ; //蜂鳴器
- void LCDMINI12864_EEPROM_DIS()
- {
-
- // 計(jì)數(shù)值 單
- strEEPROM_Z1[0] = (EEPROM_Z1/100) + '!'; //十位轉(zhuǎn)為ASCII碼
- strEEPROM_Z1[1] = ' '; //十位轉(zhuǎn)為ASCII碼
- strEEPROM_Z1[2] = (EEPROM_Z1% 100/10) + '!'; //十位轉(zhuǎn)為ASCII碼
- strEEPROM_Z1[3] = ' '; //十位轉(zhuǎn)為ASCII碼
- strEEPROM_Z1[4] = (EEPROM_Z1% 10) + '!'; //十位轉(zhuǎn)為ASCII碼
- strEEPROM_Z1[5] = '\0'; //字符串結(jié)束符
- Disp_String_8x16( 7, 59, strEEPROM_Z1);//顯示溫度
- // 計(jì)數(shù)值 總
- strEEPROM_Z2[0] = (EEPROM_Z2/100) + '!'; //十位轉(zhuǎn)為ASCII碼
- strEEPROM_Z2[1] = (EEPROM_Z2% 100/10) + '!'; //十位轉(zhuǎn)為ASCII碼
- strEEPROM_Z2[2] = (EEPROM_Z2% 10) + '!'; //十位轉(zhuǎn)為ASCII碼
- strEEPROM_Z2[3] = '\0'; //字符串結(jié)束符
- Disp_String_8x16( 5, 28, strEEPROM_Z2);//顯示溫度
-
-
- }
- void main()
- {
-
- InitLcd();//mini12864初始化
- LcdCls( 1, 1, 128, 64); //清屏指定區(qū)域
- LCDMINI12864_GUDING(); //液晶顯示固定不變的信息
- // inital_1302(); // 時鐘初始化
- P1M0=0; P1M1=0XE0; // DS1302推挽輸出,因?yàn)闆]接上拉電阻 ,信號不穩(wěn)定
- time0init(); //定時器0 初始化
- EEPROM_Z1= dcx(0x2000); // 開機(jī)讀取EEPROM區(qū) 總值
- EEPROM_Z2= dcx(0x2001); // 開機(jī)讀取EEPROM區(qū) 總值
- // EEPROM_Z1=EEPROM_Z1A*256+EEPROM_Z1B ; //拆分的值 再乘回去,顯示
- EA=1;
- EX0=1; //外部中斷0開
- IT0=1; //電平觸發(fā)
- EX1=1; //外部中斷0開
- IT1=1; //電平觸發(fā)
-
- while(1)
- {
-
-
- if(t0z3>=15) // 上電定時器++,1.5秒后
- {
- x4_flag=1; //標(biāo)志位置1,讓t0z3不再加值 ,
- LCDMINI12864_TIME_DIS2(); // 上電1。5后先刷新一次 時值 ,然后1000個50毫秒后再刷新
- LCDMINI12864_TIME_DIS3(); //刷新一次 周 年 月 日 ,然后都不刷新了。
- }
- if(x1_flag==1){LCDMINI12864_TIME_DIS1();x1_flag=0;t0z1=0; } //單獨(dú)讀秒,分 并刷新 秒 分
- if(x2_flag==1){LCDMINI12864_EEPROM_DIS();x2_flag=0;t0z0=3; } //顯示計(jì)數(shù)值
- if(x3_flag==1){LCDMINI12864_TIME_DIS2();x3_flag=0;t0z2=0; } //讀時 并刷新 時
-
-
- }
- }
- void exint0() interrupt 0
- {
- if(t0z0>=19) // 計(jì)時器0過了19個50毫秒,后
- {
- EEPROM_Z1++; //計(jì)數(shù)值 ++
- BEEP=0; // FMQ響
-
- t0z0=0; // 讓計(jì)數(shù)器0歸0
- if(EEPROM_Z1>=200)delay(900); // 如果計(jì)數(shù)值 到了200,長響,
- else delay(300); //讓FMQ響一會
- BEEP=1; // 關(guān)閉FMQ
- cc(0x2000); // 擦除第1個扇區(qū)(2000h~21FFh)
- xcx(0x2000,EEPROM_Z1); // 對EEPROM區(qū)2002h寫入2
- xcx(0x2001,EEPROM_Z2); // 對EEPROM區(qū)2002h寫入2
- EA=1; //使用EEPROM后,要再開
-
- }
-
- }
- void exint1() interrupt 2 //清零鍵
- {
- delay(300); //延時一會
- EEPROM_Z1=0; // 計(jì)數(shù)值 清零
- EEPROM_Z2++; // 累計(jì)值 +1
- cc(0x2000); // 擦除第1個扇區(qū)(2000h~21FFh)
- xcx(0x2000,EEPROM_Z1); // 對EEPROM區(qū)2002h寫入2
- xcx(0x2001,EEPROM_Z2); // 對EEPROM區(qū)2002h寫入2
- EA=1; //使用EEPROM后,要再開
- t0z0=0; // 計(jì)時器0歸0,讓計(jì)數(shù)值 刷新 顯示
- }
復(fù)制代碼 Keil代碼有待改進(jìn):
11 清零鍵加延時 要不然會連續(xù)加數(shù) 未成功 下次再加.rar
(57.3 KB, 下載次數(shù): 14)
2022-3-24 18:53 上傳
點(diǎn)擊文件名下載附件
|
-
評分
-
查看全部評分
|