本帖最后由 liyz 于 2017-4-10 09:01 編輯
我是從95年左右開始玩單片機,還買片TD-II單板機(純機器代碼輸入的)那時我還沒有電腦,我只學會用匯編,現在已經好多年沒玩了,最近突然又想玩玩單片機做個鬧鐘,匯編語言已經忘得差不多了,那就學學用C語言吧,在網上找到幾份學習資料逐漸明白了C語言奧秘。這是參考別人的資料花了好幾個星期一步一步增加功能修改出來的,已經做了成品給小孩當鬧鐘用,增加了語音報時(用yf017語音芯片),存儲記憶(24C02),兩組鬧鐘(一組可設置每周工作日響鬧,另一組可設置每天響鬧或只響一次,還有再響等功能),電路圖就懶得畫了,純屬業余玩玩給大家參考。
0.png (226.95 KB, 下載次數: 94)
下載附件
2017-4-9 18:33 上傳
0.png (241.34 KB, 下載次數: 133)
下載附件
2017-4-9 18:34 上傳
0.png (531.47 KB, 下載次數: 126)
下載附件
2017-4-9 18:39 上傳
附上不錯的C51學習資料:
《51單片機C語言快速上手》.pdf
(4.6 MB, 下載次數: 100)
2017-4-9 17:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
十天學會單片機實例100.docx
(198.15 KB, 下載次數: 57)
2017-4-9 17:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
單片機源程序:
- /*******************************************************************************
- *標題: DS1302+DS18B20+LCD1602電子時鐘 *
- * *
- ********************************************************************************
- * 添加鬧鐘時間記憶,鬧鈴時長,鬧鐘再響次數,間隔,周鬧鐘功能,語音整點報時 *
- *
- *
- ********************************************************************************/
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #include "24c02.h"
- #include "LCD1602.h"
- #include "DS1302.h"
- #include "DS18B20.h"
- #include "yuyin.h"
- sbit key1=P2^3; //調時鐘和鬧鐘鍵
- sbit key2=P2^2; //調時加鍵,正常走時狀態語音報時鍵
- sbit key3=P2^1; //調時減鍵,鬧鐘開關
- sbit key4=P2^0; //查看鬧鈴鍵
- sbit beep = P2^4; //蜂鳴器控制IO口
- sbit led1 = P1^0; //LED燈,鬧鈴響標志
- /******************************************************************/
- /* 函數聲明 */
- /******************************************************************/
- void Read_RTC(void);
- void temp_to_str();
- void keyscan();
- bit ReadRTC_Flag,Display_Flag,Alarm_Flag,Alarm_Flag1,Aset_Flag,yuyin_flag,zd_baoshi,each,setzx=0; //定義標志位
- uchar miao,fen,shi,ri,yue,week,nian,T,nz_flag,yuyin_shi,yuyin_ge,m=0,n=0,w=0,m1=0;
- uchar set_miao,set_fen,set_shi,set_time,setzx_time,setzx_f,nz_miao,nz_fen,nz_shi,miao_ss;
- char l_tmpdate[7]; //秒分時日月周年
- uchar TempBuffer[5],nz_week[7];
- uchar code write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分時日月周年 最低位寫位
- uchar code read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //秒分時日月周年 最低位讀位
- uchar code nz_week_address[7]={0x10,0x11,0x12,0x13,0x14,0x15,0x16};
-
- uchar code table1[]="SUN"; //星期字表
- uchar code table2[]="MON";
- uchar code table3[]="TUE";
- uchar code table4[]="WED";
- uchar code table5[]="THU";
- uchar code table6[]="FRI";
- uchar code table7[]="SAT";
- uchar code tab1[]=" 20 - - ";
- uchar code tab2[]=" : : ";
- uchar code tab3[14]="Set Alarm! ";
- uchar code tab4[16]="w:S M T W T F S ";
- uchar code tab5[]=" *ON *OFF";
- /******************************************************************/
- /* 毫秒級延時函數 */
- /******************************************************************/
- void delay(uchar a)
- {
- uchar i;
- while(a--)
- {
- for(i=0;i<250;i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- void delay1(uchar a)
- {
- uchar i;
- while(a--)
- {
- for(i=0;i<5;i++)
- {}
- }
- }
- /********************************************/
- /* 取出EEPROM時鐘參數初始化函數 */
- /*******************************************/
- void Set_read()
- {
- uchar i,*p;
- p=nz_week_address; //地址傳遞
- for(i=0;i<7;i++) //分7次讀取
- {
- nz_week[i]=Read24c02(*p);
- p++;
- }
- set_miao=Read24c02(0x03);
- set_fen=Read24c02(0x02);
- set_shi=Read24c02(0x01);
- set_time=Read24c02(0x05);
- nz_flag=Read24c02(0x06);
- setzx_time=Read24c02(0x07);
- setzx_f=Read24c02(0x08);
- zd_baoshi=Read24c02(0x09);
- yuyin_flag=Read24c02(0x0a);
- nz_miao=Read24c02(0x1a);
- nz_fen=Read24c02(0x1b);
- nz_shi=Read24c02(0x1c);
- each=Read24c02(0x1d);
- }
- /**************************************************
- 初始化函數
- ***************************************************/
- void init()
- {
- uchar i;
- Alarm_Flag=0;
- miao_ss=0;
- led1=1;
- TMOD=0x01; //設置定時器0為工作方式1(0000 0001)
- TH0=(65536-50000)/256; //裝初值50ms一次中斷
- TL0=(65536-50000)%256; //
- IE=0x82; //開總中斷,開定時器0中斷
- TR0=0;
- write_lcd1602(0x80,0);
- for(i=0;i<10;i++)
- {
- write_lcd1602(tab1[i],1);
- }
- write_lcd1602(0x80+0x40+1,0);
- for(i=0;i<7;i++)
- {
- write_lcd1602(tab2[i],1);
- }
- }
- /******************************************************************/
- /* 溫度數據轉換 */
- /******************************************************************/
- void temp_to_str() //溫度數據轉換成液晶字符顯示
- {
- /*TempBuffer[0]=temp_value/100%10+0x30; //十位
- TempBuffer[1]=temp_value/10%10+0x30; //個位
- TempBuffer[2]='.';
- TempBuffer[3]=temp_value%10+0x30;
- TempBuffer[4]=0xdf; //溫度符號
- */
- TempBuffer[0]=temp_value/100+0x30; //十位
- TempBuffer[1]=temp_value%100/10+0x30; //個位
- TempBuffer[2]='.';
- TempBuffer[3]=temp_value%10+0x30;
- TempBuffer[4]=0xdf; //溫度符號
- }
- /******************************************************************/
- /* 顯示星期 */
- /******************************************************************/
- void write_week(uchar xq)
- {
- uchar x;
- write_lcd1602(0x80+12,0);
- switch(xq)
- {
- case 1:
- for(x=0;x<3;x++)
- {
- write_lcd1602(table1[x],1);
- }
- break;
- case 2:
- for(x=0;x<3;x++)
- {
- write_lcd1602(table2[x],1);
- }
- break;
- case 3:
- for(x=0;x<3;x++)
- {
- write_lcd1602(table3[x],1);
- }
- break;
- case 4:
- for(x=0;x<3;x++)
- {
- write_lcd1602(table4[x],1);
- }
- break;
- case 5:
- for(x=0;x<3;x++)
- {
- write_lcd1602(table5[x],1);
- }
- break;
- case 6:
- for(x=0;x<3;x++)
- {
- write_lcd1602(table6[x],1);
- }
- break;
- case 7:
- for(x=0;x<3;x++)
- {
- write_lcd1602(table7[x],1);
- }
- break;
- }
- write_lcd1602(0x80+12,0);
- }
- /*****************************************************/
- /* 顯示鬧鐘1開關標志函數 */
- /*****************************************************/
- void a_lcd()
- {
- if(nz_flag==1)
- {
- write_lcd1602(0x80+0x40,0);
- write_lcd1602('A',1);
- }
- else
- {
- write_lcd1602(0x80+0x40,0);
- write_lcd1602(' ',1);
- }
- }
- /*****************************************************/
- /* 顯示ON和OFF函數 */
- /*****************************************************/
- void on_off_lcd(uchar f)
- {
- uchar i;
- write_lcd1602(0x80+0x40+10,0);
- if(f==1)
- {
- for(i=0;i<6;i++)
- {write_lcd1602(tab5[i],1); }
- write_lcd1602(0x80+0x40+13,0);
- }
- else
- {
- for(i=5;i<11;i++)
- { write_lcd1602(tab5[i],1); }
- write_lcd1602(0x80+0x40+13,0);
- }
- }
- /******************************************************************/
- /* 顯示函數 */
- /******************************************************************/
- void display()
- {
- uchar i,ww;
- Read_RTC();
- write_sfm(8,miao);
- write_sfm(5,fen);
- write_sfm(2,shi);
- write_nyr(3,nian);
- write_nyr(6,yue);
- write_nyr(9,ri);
- write_week(week);
- write_lcd1602(0x80+15,0);
- if(setzx==1)
- {write_lcd1602(0xf3,1);}
- else
- {
- ww=nz_week[week-1];
- if(ww==1)
- {write_lcd1602(0xeb,1);}
- else
- {write_lcd1602(' ',1);}
- }
- a_lcd();
- ReadTemp();
- temp_to_str();
- write_lcd1602(0x80+0x40+11,0);
- for(i=0;i<5;i++)
- {
- write_lcd1602(TempBuffer[i],1);
- }
- }
- /******************************************************************/
- /* 讀時鐘數據 */
- /******************************************************************/
- void Read_RTC(void) //讀取 日歷
- {
- uchar i,*p;
- p=read_rtc_address; //地址傳遞
- for(i=0;i<7;i++) //分7次讀取 秒分時日月周年
- {
- l_tmpdate[i]=Read_Ds1302(*p);
- p++;
-
- miao=((l_tmpdate[0]&0x70)>>4)*10 + (l_tmpdate[0]&0x0f);
- fen =((l_tmpdate[1]&0x70)>>4)*10 + (l_tmpdate[1]&0x0f);
- shi =((l_tmpdate[2]&0x70)>>4)*10 + (l_tmpdate[2]&0x0f);
- ri =((l_tmpdate[3]&0x70)>>4)*10 + (l_tmpdate[3]&0x0f);
- yue =((l_tmpdate[4]&0x70)>>4)*10 + (l_tmpdate[4]&0x0f);
- week=((l_tmpdate[5]&0x70)>>4)*10 + (l_tmpdate[5]&0x0f);
- nian=((l_tmpdate[6]&0x70)>>4)*10 + (l_tmpdate[6]&0x0f);
- }
- }
- /******************************************************************/
- /* 蜂鳴器發聲函數 */
- /******************************************************************/
- void di()
- {
- uchar i;
- while(key1==0||key2==0||key3==0||key4==0)
- {
- for(i=0;i<50;i++)
- {
- delay1(4);
- beep=~beep;
- }
- }
- }
- /******************/
- void Abeep()
- {
- uchar i;
- for(i=0;i<250;i++)
- {
- delay1(4);
- beep=~beep;
- led1=~led1;
- }
- delay(50);
- for(i=0;i<250;i++)
- {
- delay1(4);
- beep=~beep;
- led1=~led1;
- }
- delay(50);
- for(i=0;i<250;i++)
- {
- delay1(4);
- beep=~beep;
- led1=~led1;
- }
- }
- /*********************返回正常計時狀態程序******************************/
- void R_normal()
- {
- uchar i;
- TR0=0;
- miao_ss=0;
- ReadRTC_Flag=0;
- Display_Flag=0;
- Aset_Flag=0;
- n=0;
- write_lcd1602(0x0c,0);
- if(m!=0||m1!=0||w!=0)
- {
- m=0;
- m1=0;
- w=0;
- write_lcd1602(0x80,0); //清掉Set Alarm
- for(i=0;i<12;i++)
- {
- write_lcd1602(tab1[i],1);
- }
- write_lcd1602(0x80+0x40+1,0);
- for(i=0;i<10;i++)
- {
- write_lcd1602(tab2[i],1);
- }
- }
-
- display();
-
- }
- /******************************************************************/
- /* 鬧鐘函數 */
- /******************************************************************/
- void alarm()
- {
- uchar tmp,temp;
- if((nz_week[week-1]==1)&&(shi==set_shi)&&(fen==set_fen)&&(miao==set_miao))
- {
- //Read_RTC();
- R_normal();
- tmp=set_time+fen; //計算響鈴分鐘數
- if(tmp>=60)
- {tmp=tmp%60;}
- Alarm_Flag=1; //鬧鈴響標志位
- setzx=1;
- led1=0;
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //語音報當前時間
- while(Alarm_Flag)
- {
- Abeep();
- delay(500);
- Read_RTC(); //邊響邊走時
- display();
- keyscan();
- if(tmp==fen)
- {
- Alarm_Flag=0;
- setzx_f--; //響鈴次數減一次
- if(setzx_f!=0)
- {
- temp=setzx_time+fen;
- if(temp>=60)
- {
- temp=temp%60;
- set_shi++;
- if(set_shi>23)
- {set_shi=0;}
- }
- set_fen=temp;
- led1=0;
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //語音報當前時間
- }
- else
- {
- setzx=0;
- led1=1;
- set_fen=Read24c02(0x02);
- set_shi=Read24c02(0x01);
- setzx_f=Read24c02(0x08);
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //語音報當前時間
- }
- }
- }
- }
- }
- /******************************************************************/
- /* 鬧鐘1函數 */
- /******************************************************************/
- void alarm1()
- {
- uchar tmp,temp;
- if((nz_flag==1)&&(shi==nz_shi)&&(fen==nz_fen)&&(miao==nz_miao))
- {
- //Read_RTC();
- R_normal();
- tmp=set_time+fen; //計算響鈴分鐘數
- if(tmp>=60)
- {tmp=tmp%60;}
- Alarm_Flag1=1; //鬧鈴響標志位
- setzx=1;
- led1=0;
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //語音報當前時間
- while(Alarm_Flag1)
- {
- Abeep();
- delay(500);
- Read_RTC(); //邊響邊走時
- display();
- keyscan();
- if(tmp==fen)
- {
- Alarm_Flag1=0;
- setzx_f--; //響鈴次數減一次
- if(setzx_f!=0)
- {
- temp=setzx_time+fen;
- if(temp>=60)
- {
- temp=temp%60;
- nz_shi++;
- if(nz_shi>23)
- {nz_shi=0;}
- }
- nz_fen=temp;
- led1=0;
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //語音報當前時間
- }
- else
- {
- setzx=0;
- led1=1;
- nz_fen=Read24c02(0x1b);
- nz_shi=Read24c02(0x1c);
- setzx_f=Read24c02(0x08);
- if(each==0)
- nz_flag=0;
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //語音報當前時間
- }
- }
- }
- /* tmp=fen+5; //響鈴x分鐘
- if(tmp>=60)
- {tmp=tmp%60;}
- Alarm_Flag1=1; //鬧鈴響標志位
- led1=0;
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //語音報鬧鐘時間
- while(Alarm_Flag1)
- {
- Abeep();
- delay(500);
- Read_RTC(); //邊響邊走時
- display();
- keyscan();
- if(tmp==fen)
- {
- Alarm_Flag1=0;
- led1=1;
- if(each==0)
- nz_flag=0;
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //語音報鬧鐘時間
- }
- } */
- }
- }
- /******************************************************************/
- /* 鍵盤掃描函數 */
- /******************************************************************/
- void keyscan()
- {
- uchar i,temp;
- if(Alarm_Flag==0&&Alarm_Flag1==0&&setzx==0)
- {
- if(key1==0) //調時功能鍵
- {
- delay(9);
- if(key1==0)
- {
- di();
- while(!key1); //松手檢測
- miao_ss=0;
- if(Display_Flag==0&&m==0&&w==0&&m1==0)
- {
- ++n;
- Aset_Flag=1; //屏蔽調鬧鈴功能鍵,進入調時功能
- ReadRTC_Flag=1; //停止走時
- switch(n)
- {
- case 1: on_off_lcd(zd_baoshi); //按一次功能鍵閃爍
- write_lcd1602(0x0f,0);
- break;
- case 2: write_lcd1602(0x80+0x40+9,0); //按兩次功能鍵秒閃爍
- //Write_Ds1302(0x8e,0x00); //允許寫,禁止寫保護
- //Write_Ds1302(0x80,((miao/10)*16+miao%10)); //寫入DS1302秒位
- //Write_Ds1302(0x8e,0x80); //打開寫保護
- break;
- case 3: write_lcd1602(0x80+0x40+6,0); //按三次功能鍵分閃爍
- break;
- case 4: write_lcd1602(0x80+0x40+3,0); //按四次功能鍵時閃爍
- break;
- case 5: write_lcd1602(0x80+10,0); //按五次功能鍵日閃爍
- break;
- case 6: write_lcd1602(0x80+7,0); //按六次功能鍵月閃爍
- break;
- case 7:write_lcd1602(0x80+4,0); //按七次功能鍵年閃爍
- break;
- case 8: write_lcd1602(0x80+12,0); //按八次功能鍵周閃爍
- break;
- case 9: TR0=0; //按九次功能鍵開始走時,停止閃爍
- n=0;
- ReadRTC_Flag=0;
- Aset_Flag=0;
- write_lcd1602(0x0c,0);
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x80,((miao/10)*16+miao%10));
- Write_Ds1302(0x82,((fen/10)*16+fen%10));
- Write_Ds1302(0x84,((shi/10)*16+shi%10));
- Write_Ds1302(0x8e,0x80);
- break;
- }
- }
- else
- {
- if(n==0&&w==0&&m1==0&&m>0)
- {
- m++;
- Alarm_Flag=0; //初始化鬧鈴標志位,鬧鈴不響
- Alarm_Flag1=0;
- switch(m)
- { case 2: write_lcd1602(0x80+0x40+9,0); //開始設定鬧鈴,秒位閃爍可調
- write_lcd1602(0x0f,0);
- break;
- case 3: write_lcd1602(0x80+0x40+6,0); //分位閃爍可調
- break;
- case 4: write_lcd1602(0x80+0x40+3,0); //時位閃爍可調
- break;
- case 5: write_lcd1602(0x80+0x40+14,0); //
- break;
- case 6: write_lcd1602(0x80+15,0); //
- break;
- case 7: write_lcd1602(0x80+12,0); //
- break;
- case 8: write_lcd1602(0x80+0x40+11,0); //
- break;
- case 9:R_normal();
- // display(); //返回時間顯示
- break;
- }
- }
- else
- if(n==0&&m==0&&m1==0&&w>0)
- {
- w++;
- Alarm_Flag=0; //初始化鬧鈴標志位,鬧鈴不響
- Alarm_Flag1=0;
- switch(w)
- { case 2: write_lcd1602(0x80+0x40+2,0);
- write_lcd1602(0x0f,0); //開始閃爍
- break;
- case 3: write_lcd1602(0x80+0x40+4,0);
- break;
- case 4: write_lcd1602(0x80+0x40+6,0);
- break;
- case 5: write_lcd1602(0x80+0x40+8,0); //
- break;
- case 6: write_lcd1602(0x80+0x40+10,0); //
- break;
- case 7: write_lcd1602(0x80+0x40+12,0); //
- break;
- case 8: write_lcd1602(0x80+0x40+14,0); //
- break;
- case 9: R_normal();
- break;
- }
- }
- else
- {
- if(n==0&&m==0&&w==0&&m1>0)
- {
- m1++;
- Alarm_Flag=0; //初始化鬧鈴標志位,鬧鈴不響
- Alarm_Flag1=0;
- switch(m1)
- { case 2: write_lcd1602(0x80+0x40+9,0); //開始設定鬧鈴,秒位閃爍可調
- write_lcd1602(0x0f,0);
- break;
- case 3: write_lcd1602(0x80+0x40+6,0); //分位閃爍可調
- break;
- case 4: write_lcd1602(0x80+0x40+3,0); //時位閃爍可調
- break;
- case 5: on_off_lcd(each); //
- break;
- case 6:
- nz_flag=1; //開啟鬧鐘檢測
- R_normal();
- break;
- }
- }
- }
- }
- }
- }
- }
- if(Alarm_Flag==0&&Alarm_Flag1==0&&setzx==0)
- { if(key4==0) //鬧鈴功能鍵
- {
- delay(9);
- if(key4==0)
- {
- di();
- while(!key4);
- if(Aset_Flag==0) //不是調時鐘狀態就可以進入調鬧鐘
- {
- miao_ss=0;
- if(m1==0)
- {
- if(w==0)
- {
- m++;
- if(m>1)
- {m=9;}
- Display_Flag=1; //屏蔽調時功能鍵,進入調鬧鈴功能
- switch(m)
- {
- case 1: n=0;
- ReadRTC_Flag=0; //開顯示
- write_lcd1602(0x0c,0); //停止閃爍
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x80,((miao/10)*16+miao%10));
- Write_Ds1302(0x8e,0x80);
- write_lcd1602(0x80,0); //首行寫入Set Alarm!
- write_lcd1602('w',1);
- write_lcd1602(':',1);
- // write_lcd1602(' ',1);
- for(i=3;i<12;i++)
- {
- write_lcd1602(tab3[i],1);
- }
- write_lcd1602(setzx_f/10+'0',1);
- write_lcd1602(setzx_f%10+'0',1);
- write_lcd1602(0xde,1);
- write_lcd1602(setzx_time/10+'0',1);
- write_lcd1602(setzx_time%10+'0',1);
- write_lcd1602(0x80+0x40,0); //第二行寫入設定的時間
- write_lcd1602('*',1);
- for(i=0;i<7;i++)
- {
- write_lcd1602(tab2[i],1);
- }
- write_lcd1602(0x80+0x40+8,0);
- write_lcd1602(set_miao/10+'0',1);
- write_lcd1602(set_miao%10+'0',1);
- write_lcd1602(0x80+0x40+5,0);
- write_lcd1602(set_fen/10+'0',1);
- write_lcd1602(set_fen%10+'0',1);
- write_lcd1602(0x80+0x40+2,0);
- write_lcd1602(set_shi/10+'0',1);
- write_lcd1602(set_shi%10+'0',1);
- write_lcd1602(0x80+0x40+11,0);
- if(yuyin_flag==1)
- {write_lcd1602('V',1);}
- else
- {write_lcd1602('_',1);}
- write_lcd1602(' ',1);
- write_lcd1602(set_time/10+'0',1);
- write_lcd1602(set_time%10+'0',1);
- write_lcd1602('m',1);
- break;
- case 9:
- m=0; //關閉更更改鬧鈴時間
- w=1; //
- write_lcd1602(0x0c,0); //停止閃爍
- write_lcd1602(0x80,0); //首行寫入星期表
- for(i=0;i<16;i++)
- {
- write_lcd1602(tab4[i],1);
- }
- write_lcd1602(0x80+0x40,0);
- write_lcd1602('*',1);
- write_lcd1602(':',1);
- write_lcd1602(nz_week[0]+'0',1);
- write_lcd1602(' ',1);
- write_lcd1602(nz_week[1]+'0',1);
- write_lcd1602(' ',1);
- write_lcd1602(nz_week[2]+'0',1);
- write_lcd1602(' ',1);
- write_lcd1602(nz_week[3]+'0',1);
- write_lcd1602(' ',1);
- write_lcd1602(nz_week[4]+'0',1);
- write_lcd1602(' ',1);
- write_lcd1602(nz_week[5]+'0',1);
- write_lcd1602(' ',1);
- write_lcd1602(nz_week[6]+'0',1);
- write_lcd1602(' ',1);
- break;
- }
- }
- else
- {
- w=0;
- m1=1;
- write_lcd1602(0x0c,0); //停止閃爍
- write_lcd1602(0x80,0); //首行寫入Set Alarm!
- for(i=0;i<11;i++)
- {
- write_lcd1602(tab3[i],1);
- }
- write_lcd1602('E',1);
- write_lcd1602('.',1);
- write_lcd1602('d',1);
- write_lcd1602('a',1);
- write_lcd1602('y',1);
- write_lcd1602(0x80+0x40,0); //第二行寫入設定的時間
- write_lcd1602(' ',1);
- for(i=0;i<7;i++)
- {
- write_lcd1602(tab2[i],1);
- }
- write_lcd1602(0x80+0x40+8,0);
- write_lcd1602(nz_miao/10+'0',1);
- write_lcd1602(nz_miao%10+'0',1);
- on_off_lcd(each);
- write_lcd1602(0x80+0x40+5,0);
- write_lcd1602(nz_fen/10+'0',1);
- write_lcd1602(nz_fen%10+'0',1);
- write_lcd1602(0x80+0x40+2,0);
- write_lcd1602(nz_shi/10+'0',1);
- write_lcd1602(nz_shi%10+'0',1);
- a_lcd();
- }
- }
- else
- {
- R_normal();
- // display(); //返回時間顯示*/
-
- }
- }
- else
-
- R_normal();
-
- }
- }
- }
- if(n!=0||m>1||m1>1||w>1) //功能加鍵
- {
- if(key2==0)
- {
- delay(9);
- if(key2==0)
- {
- di();
- while(!key2);
- miao_ss=0;
- if(Display_Flag==0)
- {
- switch(n)
- {
- case 1:zd_baoshi=~zd_baoshi;
- Write24c02(0x09,zd_baoshi);
- on_off_lcd(zd_baoshi);
- break;
- case 2: miao++;
- if(miao==60)
- miao=0;
- write_lcd1602(0x80+0x40+8,0); //使LCD1602在秒位上顯示“加”設好的秒數
- write_lcd1602((miao/10)+'0',1); //十進制轉換成LCD1602能顯示的字符,顯示出來
- write_lcd1602((miao%10)+'0',1);
- T=(miao/10)*16+(miao%10); //十進制轉換成DS1302能寫的BCD碼
- Write_Ds1302(0x8e,0x00); //允許寫,禁止寫保護
- Write_Ds1302(0x80,T); //寫入DS1302
- Write_Ds1302(0x8e,0x80); //打開寫保護
- //Read_RTC();
- write_lcd1602(0x80+0x40+9,0); //寫完數據后光標自動右移,所以要歸位
- break;
- case 3: fen++;
- if(fen==60)
- fen=0;
- write_lcd1602(0x80+0x40+5,0);
- write_lcd1602((fen/10)+'0',1);
- write_lcd1602((fen%10)+'0',1);
- T=(fen/10)*16+(fen%10);
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x82,T);
- Write_Ds1302(0x8e,0x80);
- write_lcd1602(0x80+0x40+6,0);
- break;
- case 4: shi++;
- if(shi==24)
- shi=0;
- write_lcd1602(0x80+0x40+2,0);
- write_lcd1602((shi/10)+'0',1);
- write_lcd1602((shi%10)+'0',1);
- T=(shi/10)*16+(shi%10);
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x84,T);
- Write_Ds1302(0x8e,0x80);
- write_lcd1602(0x80+0x40+3,0);
- break;
- case 5: ri++;
- if(ri==32)
- ri=1;
- write_lcd1602(0x80+9,0);
- write_lcd1602((ri/10)+'0',1);
- write_lcd1602((ri%10)+'0',1);
- T=(ri/10)*16+(ri%10);
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x86,T);
- Write_Ds1302(0x8e,0x80);
- write_lcd1602(0x80+10,0);
- break;
- case 6: yue++;
- if(yue==13)
- yue=1;
- write_lcd1602(0x80+6,0);
- write_lcd1602((yue/10)+'0',1);
- write_lcd1602((yue%10)+'0',1);
- T=(yue/10)*16+(yue%10);
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x88,T);
- Write_Ds1302(0x8e,0x80);
- write_lcd1602(0x80+7,0);
- break;
- case 7: nian++;
- if(nian==100)
- nian=0;
- write_lcd1602(0x80+3,0);
- write_lcd1602((nian/10)+'0',1);
- write_lcd1602((nian%10)+'0',1);
- T=(nian/10)*16+(nian%10);
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x8c,T);
- Write_Ds1302(0x8e,0x80);
- write_lcd1602(0x80+4,0);
- break;
- case 8: week++;
- if(week==8)
- week=1;
- write_week(week);
- T=(week/10)*16+(week%10);
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x8a,T);
- Write_Ds1302(0x8e,0x80);
- break;
- }
- }
- else
- if(w==0&&m1==0&&m>1)
- {
- switch(m)
- {
- case 2: set_miao++; //鬧鐘秒加1
- if(set_miao==60)
- set_miao=0;
- write_lcd1602(0x80+0x40+8,0);
- write_lcd1602(set_miao/10+'0',1);
- write_lcd1602(set_miao%10+'0',1);
- write_lcd1602(0x80+0x40+9,0);
- Write24c02(0x03,set_miao);
- break;
- case 3: set_fen++; //鬧鐘分加1
- if(set_fen==60)
- set_fen=0;
- write_lcd1602(0x80+0x40+5,0);
- write_lcd1602(set_fen/10+'0',1);
- write_lcd1602(set_fen%10+'0',1);
- write_lcd1602(0x80+0x40+6,0);
- Write24c02(0x02,set_fen);
- break;
- case 4: set_shi++; //鬧鐘時加1
- if(set_shi==24)
- set_shi=0;
- write_lcd1602(0x80+0x40+2,0);
- write_lcd1602(set_shi/10+'0',1);
- write_lcd1602(set_shi%10+'0',1);
- write_lcd1602(0x80+0x40+3,0);
- Write24c02(0x01,set_shi);
- break;
- case 5: set_time++; //鬧鐘響鈴時長
- if(set_time==31)
- set_time=1;
- write_lcd1602(0x80+0x40+13,0);
- write_lcd1602(set_time/10+'0',1);
- write_lcd1602(set_time%10+'0',1);
- write_lcd1602(0x80+0x40+14,0);
- Write24c02(0x05,set_time);
- break;
- case 6: setzx_time++; //鬧鐘再響間隔
- if(setzx_time==31)
- setzx_time=1;
- write_lcd1602(0x80+14,0);
- write_lcd1602(setzx_time/10+'0',1);
- write_lcd1602(setzx_time%10+'0',1);
- write_lcd1602(0x80+15,0);
- Write24c02(0x07,setzx_time);
- break;
- case 7: setzx_f++; //鬧鐘響鈴次數
- if(setzx_f==11)
- setzx_f=1;
- write_lcd1602(0x80+11,0);
- write_lcd1602(setzx_f/10+'0',1);
- write_lcd1602(setzx_f%10+'0',1);
- write_lcd1602(0x80+12,0);
- Write24c02(0x08,setzx_f);
- break;
- case 8: yuyin_flag=~yuyin_flag;
- write_lcd1602(0x80+0x40+11,0);
- if(yuyin_flag==1)
- {write_lcd1602('V',1);}
- else
- {write_lcd1602('_',1);}
- write_lcd1602(0x80+0x40+11,0);
- Write24c02(0x0a,yuyin_flag);
- break;
- }
- }
- else
- if(m==0&&m1==0&&w>1)
- {
- switch(w)
- {
- case 2: //星期日鬧鐘開關,1為開
- nz_week[0]=1;
- write_lcd1602(0x80+0x40+2,0);
- write_lcd1602(nz_week[0]+'0',1);
- write_lcd1602(0x80+0x40+2,0);
- Write24c02(0x10,nz_week[0]);
- break;
- case 3: //星期一鬧鐘開關
- nz_week[1]=1;
- write_lcd1602(0x80+0x40+4,0);
- write_lcd1602(nz_week[1]+'0',1);
- write_lcd1602(0x80+0x40+4,0);
- Write24c02(0x11,nz_week[1]);
- break;
- case 4: //星期二鬧鐘開關
- nz_week[2]=1;
- write_lcd1602(0x80+0x40+6,0);
- write_lcd1602(nz_week[2]+'0',1);
- write_lcd1602(0x80+0x40+6,0);
- Write24c02(0x12,nz_week[2]);
- break;
- case 5: //星期三鬧鐘開關
- nz_week[3]=1;
- write_lcd1602(0x80+0x40+8,0);
- write_lcd1602(nz_week[3]+'0',1);
- write_lcd1602(0x80+0x40+8,0);
- Write24c02(0x13,nz_week[3]);
- break;
- case 6: //星期四鬧鐘開關
- nz_week[4]=1;
- write_lcd1602(0x80+0x40+10,0);
- write_lcd1602(nz_week[4]+'0',1);
- write_lcd1602(0x80+0x40+10,0);
- Write24c02(0x14,nz_week[4]);
- break;
- case 7: //星期五鬧鐘開關
- nz_week[5]=1;
- write_lcd1602(0x80+0x40+12,0);
- write_lcd1602(nz_week[5]+'0',1);
- write_lcd1602(0x80+0x40+12,0);
- Write24c02(0x15,nz_week[5]);
- break;
- case 8: //星期六鬧鐘開關
-
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (47.87 KB, 下載次數: 104)
下載附件
2017-4-9 18:36 上傳
程序:
電子時鐘最終雙鬧版.rar
(20.54 KB, 下載次數: 166)
2017-4-9 17:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|