電路圖在附件
制作出來的實物圖如下:
O~6{HOP%(2WP_I9OAF%%Y@B.png (128 KB, 下載次數: 51)
下載附件
2020-4-26 22:08 上傳
單片機源程序如下:
- /*
- *******************************************************************************
- * “冬松電子工作室” 傾情奉獻
- *
- * 配套 LCD12864電子萬年歷時鐘電路板
- *
- * 文 件 名:calendarMain.c
- * 描 述: LCD12864電子萬年歷時鐘工程主文件
- * 功 能:初始化定時器0,及中斷服務程序(用于鬧鐘),主函數調用
- * 咨詢電話:135-91697612
- *******************************************************************************
- */
- #include "clock.h"
- #include "calendar.h"
- #include "key.h"
- #include "lcd.h"
- #include "zhen.h"
- #include "sensor.h"
- uchar alarmStyle; //定義蜂鳴器報警方式
- /****************************************************************************/
- sbit bell=P1^0; //定義蜂鳴器端口
- /****************************************************************************
- * 名稱:void Timer0_Initial(void)
- * 功能:初始化timer0
- * 入口函數:無
- * 出口函數:無
- ****************************************************************************/
- void Timer0_Initial(void)
- {
- TMOD=0x01; //Timer0工作方式1定時
- TH0 =0x4c;
- TL0 =0x00; //定時50 ms
- ET0 =1; //Timer0開中斷
- TR0 =1; //timer0啟動
- }
- /*****************************************************************************
- * 名稱: Timer0_Overflow() inturrupt 1
- * 功能: 中斷服務程序 1.整點報時 三聲嘟嘟的聲音 2.鬧鐘報時,持續一分鐘
- * 入口參數:無
- * 出口參數:無
- *****************************************************************************/
- void Timer0_Overflow() interrupt 1
- {
- TH0 = 0x4c;
- TL0 = 0x00; //延時 50 ms
- bell=~bell; //進入中斷,蜂鳴器取反,達到蜂鳴器間歇工作目的
-
- }
- /******************************************************************************
- * 函數名稱: main()
- * 功 能: 主函數
- * 入口參數: 無
- * 出口參數: 無
- ********************************************************************************/
- void main()
- {
- uchar clock_time[7] = {0x00,0x11,0x20,0x01,0x02,0x01,0x16}; //定義時間變量 秒 分 時 日 月 周 年
- uchar alarm_time[3]; //鬧鐘設置 alarm_time[0]:分鐘 alarm_time[1]:小時
- uchar temperature[2];//定義溫度變量temperature[0]為低8位,temperature[1]為高8位
- uchar i, j;
- uchar CALL[3]; //存儲三畫面狀態(開和閉)數組
- // bell = 1;
- // lcd = 1;
- // psb = 1; //12864采用并口輸出方式
- // cs2 = 0;
- Timer0_Initial(); //初始化定時器0
- v_Lcd12864Init_f(); //12864初始化
- port = 0xFF; //釋放P0端口
- Lcd_Write_Command(0x36); //采用擴充指令集,繪圖開,清除模擬指針畫面字符
- delay_1ms(2); //延時2ms
- Lcd_Write_Command(0x36); //采用擴充指令集,繪圖開,需設定兩次,先改DL,再改RE
- delay_1ms(2); //延時2ms
- cls(); //清屏,為顯示做準備
- key_init(); //初始化鍵盤掃描程序變量
- // Set1302(clock_time); //時鐘初試化
- CALL1[0] = R1302(0xc7); //讀取DS1302的RAM中 畫面一 狀態值
- CALL1[1] = R1302(0xc9); //讀取DS1302的RAM中 畫面二 狀態值
- CALL1[2] = R1302(0xcb); //讀取DS1302的RAM中 畫面三 狀態值
- if(((CALL1[0]==1)||(CALL1[1]==1))&&(CALL1[2]==0)) //第一、二個畫面
- {
- frame_and_scale_f(); //繪制出邊框,和刻度
- }
- alarmStyle=0x00; //初始化報警方式,此時不報警
- EA = 0; //關閉總中斷
- while( 1 )
- {
- CALL[0] = R1302(0xc1); //讀取DS1302的RAM中 分 鬧鐘值
- CALL[1] = R1302(0xc3); //讀取DS1302的RAM中 時 鬧鐘值
- CALL[2] = R1302(0xc5); //讀取DS1302的RAM中 開和閉 狀態值
- CALL1[0] = R1302(0xc7); //重新讀取DS1302的RAM中 畫面一 狀態值
- CALL1[1] = R1302(0xc9); //重新讀取DS1302的RAM中 畫面二 狀態值
- CALL1[2] = R1302(0xcb); //重新讀取DS1302的RAM中 畫面三 狀態值
- Get1302(clock_time); //獲取 秒 分 時 日 月 周 年 的時鐘數據
- Lcd_Clock(clock_time); //時鐘顯示
- Sensor_Fresh(temperature); //溫度更新,讀取溫度
- Lcd_Temperature(temperature); //顯示溫度
- Conversion(0,clock_time[6],clock_time[4],clock_time[3]); //輸入BCD陽歷數據,輸出BCD陰歷數據
- Conver_week(0,clock_time[6],clock_time[4],clock_time[3]);//輸入BCD陽歷數據,輸出BCD星期數據
- if(KEY_FUNC==Key_Scan()) //如果按鍵作值KEY_FUNC(0x08)與按鍵掃描Key_Scan()數對比相等(也是0x08),
- {
- while(KEY_FUNC==Key_Scan()); //KEY_FUNC和Key_Scan()的值相等,就在這里等待,按鍵抬起就執行下面語句,
- Key_Function(clock_time, alarm_time); //則進入功能選擇菜單
- }
- if(KEY_UP == Key_Scan()) //如果按鍵作值KEY_UP(0x01)與按鍵掃描Key_Scan()數對比相等(也是0x01),
- {
- lcd = 1; //打開液晶背光燈
- }
- if(KEY_DOWN == Key_Scan()) //如果按鍵作值KEY_DOWN(0x02)與按鍵掃描Key_Scan()數對比相等(也是0x02),
- {
- lcd = 0; //關閉液晶背光燈
- }
- if(((CALL1[0]==1)||(CALL1[1]==1))&&(CALL1[2]==0)) //第一、二個畫面
- {
- frame_and_scale_f(); //繪制出邊框,和刻度
- zhizhen();
- }
- if(((CALL1[0]==0)||(CALL1[1]==0))&&(CALL1[2]==1)) //第三個畫面
- {
- Lcd_Write_Command(0x34); //采用擴充指令集,繪圖關
- Lcd_Write_Command(0x30); //基本指令集
- }
- if((*clock_time==0x59)&&(*(clock_time+1)==0x59)) //比較秒和分數據到59,整點報時
- {
- EA = 1; //打開總中斷
- bell = 0; //打開蜂鳴器
- }
- else
- {
- EA = 0; //關閉總中斷
- bell = 1; //關閉蜂鳴器
- }
- //鬧鐘報警
- i = clock_time[1]; //分鐘數據傳遞給變量 i
- j = clock_time[2]; //小時數據傳遞給變量 j
- i = bcd_hex(i); //分鐘數據轉換成十進制數
- j =bcd_hex(j); //小時數據轉換成十進制數
- //不轉換鬧鐘調整數據和DS1302鬧鈴存儲的鬧鐘數據不同,鬧鐘不響
- if(CALL[2] == 0) //如果鬧鐘狀態是 “開”
- {
- if(( CALL[0] == i)&&( CALL[1] == j)) //時鐘分鐘和小時與DS13202存儲的鬧鐘值相吻合,
- {
- EA = 1; //打開總中斷
- bell = 0; //打開蜂鳴器
- }
- }
- else //否則鬧鐘狀態是 “關”
- {
- EA = 0; //關閉總中斷
- bell = 1; //關閉蜂鳴器
- }
- }
- }
復制代碼
所有資料51hei提供下載:
指針數字切換萬年歷.rar
(114.42 KB, 下載次數: 216)
2020-4-26 22:07 上傳
點擊文件名下載附件
原理圖 下載積分: 黑幣 -5
|