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