51單片機主控的的12864萬年歷,有圖有真相附件里面有原理圖,完整源代碼,實物測試通過;時分秒大數(shù)字顯示
單片機型號:STC90C516RD+,用STC89C516RD+也可以.
DS1302用現(xiàn)成模塊,可以自己網(wǎng)上找電路圖焊
DS18B20引腳看清楚不要搞錯
12864為并行方式,PSB跟RST接高電平就行,對比度通過103電位器調(diào)背光,可用單片機控制或
用熱釋電模塊控制。
鬧鐘數(shù)據(jù)掉電會丟失,可以自己改改程序,用24C02或其它芯片
電路圖簡單,接線時看程序接或自己接好后改程序的定義
所需元器件:
1.單片機最小系統(tǒng),包括上電復位電路跟時鐘電路
2.12864液晶屏1個
3.DS18B20數(shù)字溫度芯片(三腳)
4.DS1302模塊
5.蜂鳴器(有源跟無源各一),三極管8050(3個),103電位器用在12864調(diào)對比度
6.按鍵5個,開關(guān)一個,導線若干,烙鐵,焊錫,
7.其他自己發(fā)揮擴展
部分單片機代碼預覽:
- #include<reg52.h>
- #include<intrins.h>
- #include"lcd12864.h"
- sbit DSPORT=P2^2; //ds18b20接口
- sbit DSIO=P1^1; //ds1302接口
- sbit RST=P1^2;
- sbit SCLK=P1^0;
- sbit zz=P1^4; //有源蜂鳴器 用三極管8050驅(qū)動
- sbit wei = P2^6;
- sbit duan= P2^7;
- sbit s1=P3^0; //調(diào)節(jié)時間
- sbit s2=P3^1; //加
- sbit s3=P3^2; //減
- sbit s4=P3^3; //調(diào)節(jié)鬧鐘
- sbit Beep=P1^7; //揚聲器 用三極管8050驅(qū)動
- //---定義全局函數(shù)---//
- void Ds1302Write(uchar addr, uchar dat);
- uchar Ds1302Read(uchar addr);
- void Ds1302Init();
- void Ds1302ReadTime();
- //---加入全局變量--//
- uchar timeji=0,n=0,keysun=2;
- char SetPlace=-1,naoshi=0x08,naofen=0x00,linsheng=1; //參數(shù)定義
- bit biaozhi=1;
- bit biaozhi1=1;
- bit naobiao=0;
- uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
- uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
- //---DS1302時鐘初始化2017年5月23日星期二10點57分00秒。---//
- //---存儲順序是秒分時日月周年,存儲格式---//
- char TIME[7] = {0x00, 0x57, 0x10, 0x23, 0x05, 0x02, 0x17};
- void Delay1ms(unsigned int );
- unsigned char Ds18b20Init();
- void Ds18b20WriteByte(unsigned char com);
- unsigned char Ds18b20ReadByte();
- void Ds18b20ChangTemp();
- void Ds18b20ReadTempCom();
- int Ds18b20ReadTemp();
- uchar code CharCode[]=" 調(diào)整時間 年 月 日周 時間 點 分 秒 ";
- uchar code CharCode1[]="20 - - 周 . ℃";
- uchar code xiqi[]=" 一二三四五六日開關(guān)";
- uchar code naozhong[]=" 設(shè)置鬧鐘 點 分 鈴聲選擇 ";
- uchar code naozhonglinshen[]="1.天空之城 2.月亮代表我的心3.你是風兒我是沙4.莫斯科郊外的晚5.經(jīng)典鈴聲 嘀嘀";
- //uchar code tab[11][64]={
- //{/*-- 調(diào)入了一幅圖像:D:\設(shè)計\打印\數(shù)字取模圖片\0.bmp --*/
- ///*-- 寬度x高度=16x32 --*/
- //0x0F,0xF0,0x3F,0xFC,0x7F,0xFE,0x7F,0xFE,0xFC,0x3F,0xF8,0x1F,0xF0,0x0F,0xF0,0x0F,
- …………限于本文篇幅 字模請從51黑下載附件…………
- //0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}
- //};
- /******************************************************************************/
- //圖片數(shù)字圓體
- /******************************************************************************/
- //uchar code tab[12][64]={
- // {// 圖片數(shù)字0
- // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x0E,0x70,
- …………限于本文篇幅 字模請從51黑下載附件…………
- // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- //};
- /******************************************************************************/
- //圖片數(shù)字方體
- /******************************************************************************/
- uchar code tab[12][64]={
- {// 圖片數(shù)字0
- 0x00,0x00,0x3F,0xFC,0x5F,0xFA,0x6F,0xF6,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
- …………限于本文篇幅 字模請下載附件…………
- {// 圖片" "
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- };
-
- unsigned int code music_tab[4][201] ={{ //天空之城
- 0x39,0x20,0x33,0x20,0x30,0x30,0x33,0x10,0x30,0x40,0x26,0x40,0x33,0x80,
- 0x4c,0x40,0x39,0x30,0x40,0x10,0x39,0x40,0x30,0x40,0x40,0x80,0x4c,0x20,
- 0x4c,0x20,0x48,0x30,0x4c,0x10,0x48,0x40,0x30,0x40,0x4c,0x80,0x30,0x20,
- 0x30,0x20,0x33,0x30,0x48,0x10,0x48,0x40,0x33,0x40,0x33,0x80,0x39,0x20,
- 0x33,0x20,0x30,0x30,0x33,0x10,0x30,0x40,0x26,0x40,0x33,0x80,0x4c,0x40,
- 0x39,0x30,0x40,0x10,0x39,0x40,0x30,0x40,0x40,0x80,0x55,0x20,0x4c,0x20,
- 0x48,0x40,0x30,0x20,0x33,0x30,0x30,0x20,0x2b,0x10,0x2b,0x30,0x26,0x10,
- 0x30,0x80,0x30,0x20,0x33,0x20,0x39,0x20,0x39,0x20,0x33,0x20,0x40,0x20,
- 0x39,0x80,0x30,0x20,0x2b,0x20,0x26,0x30,0x2b,0x10,0x26,0x40,0x20,0x40,
- 0x2b,0xc0,0x30,0x40,0x30,0x20,0x33,0x20,0x30,0x40,0x26,0x40,0x26,0xc0,
- 0x33,0x20,0x30,0x40,0x33,0x20,0x30,0x20,0x2b,0x40,0x30,0x60,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00},
- { //月亮代表我的心
- 0x40,0x20,0x30,0x60,0x26,0x20,0x20,0x60,0x30,0x20,0x33,0x60,0x26,0x20,
- 0x20,0x60,0x20,0x20,0x1c,0x60,0x19,0x20,0x20,0xc0,0x26,0x20,0x2b,0x20,
- 0x30,0x60,0x30,0x10,0x30,0x40,0x26,0x20,0x2b,0x20,0x30,0x60,0x30,0x10,
- 0x30,0x40,0x2b,0x20,0x26,0x20,0x2b,0x60,0x39,0x10,0x33,0x40,0x30,0xc0,
- 0x26,0x40,0x26,0x60,0x2b,0x10,0x30,0x40,0x20,0x40,0x33,0xc0,0x39,0x20,
- 0x33,0x20,0x39,0x60,0x33,0x10,0x39,0x60,0x40,0x10,0x26,0xc0,0x20,0x40,
- 0x26,0x60,0x2b,0x10,0x30,0x40,0x20,0x40,0x33,0xc0,0x39,0x20,0x33,0x20,
- 0x30,0x60,0x30,0x10,0x30,0x40,0x2b,0x40,0x2b,0xc0,0x40,0x20,0x30,0x60,
- 0x26,0x10,0x20,0x60,0x30,0x10,0x33,0x60,0x26,0x10,0x20,0x60,0x20,0x10,
- 0x1c,0x60,0x19,0x10,0x20,0x80,0x26,0x20,0x2b,0x20,0x30,0x60,0x30,0x10,
- 0x30,0x40,0x26,0x20,0x2b,0x20,0x30,0x60,0x30,0x10,0x30,0x40,0x2b,0x20,
- 0x26,0x20,0x2b,0x60,0x39,0x10,0x33,0x40,0x2b,0x40,0x30,0xc0,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00},
- { //你是風兒我是沙
- 0x26,0x30,0x20,0x10,0x18,0x20,0x1c,0x60,0x1c,0x30,0x20,0x10,0x20,0xc0,
- 0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,0x26,0x20,0x26,0xc0,
- 0x26,0x30,0x20,0x10,0x18,0x20,0x1c,0x60,0x1c,0x30,0x20,0x10,0x20,0xc0,
- 0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,0x30,0x20,0x30,0xc0,
- 0x26,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x26,0x10,0x2b,0x10,0x30,0x20,
- 0x39,0x20,0x30,0x60,0x2b,0x10,0x26,0x80,0x2b,0x10,0x26,0x10,0x39,0x60,
- 0x2b,0x10,0x24,0x60,0x2b,0x10,0x26,0x20,0x26,0x60,0x30,0x60,0x39,0x10,
- 0x40,0x80,0x30,0x20,0x39,0x20,0x39,0x20,0x30,0x20,0x26,0x20,0x26,0x20,
- 0x26,0x20,0x26,0x20,0x2b,0x40,0x39,0x20,0x2b,0x60,0x30,0x20,0x39,0x20,
- 0x39,0x20,0x39,0x20,0x30,0x20,0x2b,0x20,0x2b,0x20,0x2b,0x20,0x26,0x40,
- 0x2b,0x20,0x30,0x80,0x26,0x20,0x20,0x20,0x18,0x20,0x1c,0x80,0x1c,0x30,
- 0x20,0x10,0x20,0xc0,0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,
- 0x26,0x20,0x26,0x80,0x26,0x30,0x20,0x10,0x18,0x20,0x1c,0x60,0x1c,0x30,
- 0x20,0x10,0x20,0xc0,0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,
- 0x26,0x20,0x26,0xc0,0x00,},
- { // 莫斯科郊外的晚上
- };
- void jiemian();
- void LcdDisplay(int temp);
- void display();
- void zhudisplay();
- void TimerConfiguration();
- void key();
- void naoxian();
- void didi();
- void naoxianguangbiao();
- void linshengbofang();
- void sfmxiangao(uchar add,uchar bata);
- void sfmxiandi(uchar acc,uchar datb);
- void zhujiemian();
- void shua_display();
- void nyrdisplay();
- void delay (unsigned char m); //控制頻率延時
- void delayms(unsigned char a); //豪秒延時子程序
- void main()
- {
- wei = 0;
- duan = 0;
- zz=0;
- Beep=0;
- LCD12864_ClearScreen(); //清CGrom
- LCD12864_WriteCmd(0x01); //清屏
- LCD12864_Init();
- Ds1302Init(); //原來的程序,沒有調(diào)用1302初始化,上電不走時
- zhujiemian();
- TimerConfiguration();
- while(1)
- {
- key();
- if(biaozhi1==1)
- {
- LcdDisplay(Ds18b20ReadTemp()); //溫度顯示放在這里,刷新顯示就正常了
- shua_display();
- if(biaozhi==0)
- {
- biaozhi=1;
- // LcdDisplay(Ds18b20ReadTemp()); //溫度顯示放在這里,刷新很慢
- }
- if((naoshi==TIME[2])&&(naofen==TIME[1])&&(naobiao==1))//鬧鐘
- {
- if(linsheng<5)
- {
- linshengbofang();
- }
- if(linsheng==5)
- {
- didi();
- }
- }
- }
- }
- }
- void nyrdisplay() //年月日顯示函數(shù)
- {
- LCD12864_SetWindow(0, 1); //第1行,第2列
- LCD12864_WriteData(0x30+TIME[6]/16); // 年
- LCD12864_WriteData(0x30+(TIME[6]&0x0f));
- LCD12864_WriteData(0x2d); //顯示‘-’
- LCD12864_WriteData(0x30+TIME[4]/16); //月
- LCD12864_WriteData(0x30+(TIME[4]&0x0f));
- LCD12864_WriteData(0x2d); //顯示‘-’
- LCD12864_WriteData(0x30+TIME[3]/16); //日
- LCD12864_WriteData(0x30+(TIME[3]&0x0f));
- LCD12864_SetWindow(0, 7); //第1行,第8列
- LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2]); //星期
- LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2+1]);
- }
- void zhujiemian() //主界面
- {
- unsigned char i=0,j=0,k=0;
- LCD12864_SetWindow(0, 0);
- while(CharCode1[i]!='\0')
- {
- LCD12864_WriteData(CharCode1[i]);
- i++;
- if(i==16) //第一行滿寫第三行
- {
- LCD12864_SetWindow(1,0);
- }
- if(i==32) //第三行滿寫第四行
- {
- LCD12864_SetWindow(2,0);
- }
- if(i==48) //第三行滿寫第四行
- {
- LCD12864_SetWindow(3,0);
- }
- }
- zhudisplay();
- LCD12864_WriteCmd(0x36); //開啟拓展指令集
- for(i=0;i<16;i++)
- {
- LCD12864_WriteCmd(0x90+i);
- LCD12864_WriteCmd(0x90+2);
- LCD12864_WriteData(tab[10][j++]);
- LCD12864_WriteData(tab[10][j++]); //顯示笑臉
- LCD12864_WriteCmd(0x90+i);
- LCD12864_WriteCmd(0x90+5);
- LCD12864_WriteData(tab[10][k++]);
- LCD12864_WriteData(tab[10][k++]);
- }
- for(i=0;i<16;i++)
- {
- LCD12864_WriteCmd(0x80+i);
- LCD12864_WriteCmd(0x98+2);
- LCD12864_WriteData(tab[10][j++]); //顯示笑臉
- LCD12864_WriteData(tab[10][j++]);
- LCD12864_WriteCmd(0x80+i);
- LCD12864_WriteCmd(0x98+5);
- LCD12864_WriteData(tab[10][k++]);
- LCD12864_WriteData(tab[10][k++]);
- }
- LCD12864_WriteCmd(0x30); //恢復基本指令集
- }
- void shua_display()
- {
- Ds1302ReadTime();
- if((TIME[2]==0x00)&&(TIME[0]<=5))
- nyrdisplay();
- if((TIME[1]==0x00)&&(TIME[0]<=3))
- {
- if((TIME[2]&0x0f)==0)
- sfmxiangao(0,TIME[2]);
- sfmxiandi(1,TIME[2]); //時
- didi(); //整點報時
- }
- if(TIME[0]<=2)
- {
- if((TIME[1]&0x0f)==0)
- sfmxiangao(3,TIME[1]); //分
- sfmxiandi(4,TIME[1]);
- }
- if((TIME[0]&0x0f)==0)
- sfmxiangao(6,TIME[0]); //秒
- sfmxiandi(7,TIME[0]);
- }
- void zhudisplay()
- {
- Ds1302ReadTime();
- nyrdisplay();
- sfmxiangao(0,TIME[2]);
- sfmxiandi(1,TIME[2]); //時
- sfmxiangao(3,TIME[1]); //分
- sfmxiandi(4,TIME[1]);
- sfmxiangao(6,TIME[0]); //秒
- sfmxiandi(7,TIME[0]);
- }
- void int1() interrupt 3 //采用定時中斷1 控制節(jié)拍
- { TH1=0xd8;
- TL1=0xef;
- n--;
- }
- void delay (unsigned char m) //控制頻率延時
- {
- unsigned i=3*m;
- while(--i);
- }
- void delayms(unsigned char a) //豪秒延時子程序
- {
- while(--a); //采用while(--a) 不要采用while(a--); 各位可編譯一下看看匯編結(jié)果就知道了!
- }
- void linshengbofang()
- { unsigned char p=0,m; //m為頻率常數(shù)變量
- unsigned char i=0,j;
- for(j=0;j<150;j++)
- {
- a:p=music_tab[linsheng][i];
- if(p==0x00) { i=0, delayms(1000); return;} //如果碰到結(jié)束符,延時1秒,回到開始再來一遍
- else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延時100ms,繼續(xù)取下一音符
- else {m=music_tab[linsheng-1][i++], n=music_tab[linsheng-1][i++];} //取頻率常數(shù) 和 節(jié)拍常數(shù)
- TR1=1; //開定時器1
- while(n!=0) Beep=~Beep,delay(m); //等待節(jié)拍完成, 通過P1口輸出音頻(可多聲道哦!)
- TR1=0; //關(guān)定時器1
- }
- }
- void naojie()
- {
- unsigned char i=0;
- LCD12864_SetWindow(0, 0);
- while(naozhong[i]!='\0')
- {
- LCD12864_WriteData(naozhong[i]);
- i++;
- if(i==16) //第一行滿寫第三行
- LCD12864_SetWindow(1,0);
- if(i==32) //第三行滿寫第四行
- LCD12864_SetWindow(2,0);
- if(i==48) //第三行滿寫第四行
- LCD12864_SetWindow(3,0);
- }
- }
- void naoxianguangbiao() //鬧 顯 光標閃爍
- {
- if(SetPlace==0)
- LCD12864_SetWindow(2, 6); //秒光標閃爍 第3行,第7列
- if(SetPlace==1)
- LCD12864_SetWindow(2, 4); //分光標閃爍 第3行 第5列
- if(SetPlace==2)
- LCD12864_SetWindow(2, 2); //時光標閃爍 第3行 第3列
- if(SetPlace==3)
- LCD12864_SetWindow(1, 4); //日光標閃爍 第2行 第5列
- if(SetPlace==4)
- LCD12864_SetWindow(1, 2); //月光標閃爍 第2行 第3列
- if(SetPlace==5)
- LCD12864_SetWindow(1, 7); //星期光標閃爍 第2行 第8列
- if(SetPlace==6)
- LCD12864_SetWindow(1, 0); //年光標閃爍 第2行 第1列
- if(SetPlace==8) //鬧鐘設(shè)置
- LCD12864_SetWindow(0, 6);
- if(SetPlace==9)
- LCD12864_SetWindow(1, 2);
- if(SetPlace==10)
- LCD12864_SetWindow(1, 4);
- if(SetPlace==11)
- LCD12864_SetWindow(3, 0);
- }
- void sfmxiangao(uchar add,uchar bata)
- {
- uchar i,j=0;
- LCD12864_WriteCmd(0x36); //開啟拓展指令集
- for(i=0;i<16;i++)
- {
- LCD12864_WriteCmd(0x90+i);
- LCD12864_WriteCmd(0x90+add);
- LCD12864_WriteData(tab[bata/16][j++]);
- LCD12864_WriteData(tab[bata/16][j++]);
- }
- for(i=0;i<16;i++)
- {
- LCD12864_WriteCmd(0x80+i);
- LCD12864_WriteCmd(0x98+add);
- LCD12864_WriteData(tab[bata/16][j++]);
- LCD12864_WriteData(tab[bata/16][j++]);
- }
- LCD12864_WriteCmd(0x30); //恢復基本指令集
- }
- void sfmxiandi(uchar acc,uchar datb)
- {
- uchar i,j=0;
- LCD12864_WriteCmd(0x36); //開啟拓展指令集
- for(i=0;i<16;i++)
- {
- LCD12864_WriteCmd(0x90+i);
- LCD12864_WriteCmd(0x90+acc);
- LCD12864_WriteData(tab[datb&0x0f][j++]);
- LCD12864_WriteData(tab[datb&0x0f][j++]);
- }
- for(i=0;i<16;i++)
- {
- LCD12864_WriteCmd(0x80+i);
- LCD12864_WriteCmd(0x98+acc);
- LCD12864_WriteData(tab[datb&0x0f][j++]);
- LCD12864_WriteData(tab[datb&0x0f][j++]);
- }
- LCD12864_WriteCmd(0x30); //恢復基本指令集
- }
- void shixian() //調(diào)節(jié)時間顯示
- {
- if(SetPlace==0)
- {
- LCD12864_WriteData(0x30+(TIME[0]/16)); //秒
- LCD12864_WriteData(0x30+(TIME[0]&0x0f));
- LCD12864_SetWindow(2, 6); //第3行,第7列
- }
- if(SetPlace==1)
- {
- LCD12864_WriteData(0x30+(TIME[1]/16)); //分
- LCD12864_WriteData(0x30+(TIME[1]&0x0f));
- LCD12864_SetWindow(2, 4); //第3行,第5列
- }
- if(SetPlace==2)
- {
- LCD12864_WriteData(0x30+(TIME[2]/16)); //時
- LCD12864_WriteData(0x30+(TIME[2]&0x0f));
- LCD12864_SetWindow(2, 2);//第3行,第3 列
- }
- if(SetPlace==3)
- {
- LCD12864_WriteData(0x30+(TIME[3]/16)); //日
- LCD12864_WriteData(0x30+(TIME[3]&0x0f));
- LCD12864_SetWindow(1, 4);//第2行,第5列
- }
- if(SetPlace==4)
- {
- LCD12864_WriteData(0x30+(TIME[4]/16)); //月
- LCD12864_WriteData(0x30+(TIME[4]&0x0f));
- LCD12864_SetWindow(1, 2); //第2行,第3列
- }
- if(SetPlace==5)
- {
- LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2]); //星期
- LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2+1]);
- LCD12864_SetWindow(1, 7); //第2行,第8列
- }
- if(SetPlace==6)
- {
- LCD12864_WriteData(0x30+(TIME[6]/16)); //年
- LCD12864_WriteData(0x30+(TIME[6]&0x0f));
- LCD12864_SetWindow(1, 0);// 第2行,第1列
- }
- }
- void naoxian() //調(diào)節(jié)鬧鐘 顯示
- {
- uchar zishu=0;
- if(SetPlace==8) //鬧鐘設(shè)置
- {
- LCD12864_SetWindow(0, 6);
- }
- if(SetPlace==9)
- {
- LCD12864_WriteData(0x30+(naoshi/16)); //時
- LCD12864_WriteData(0x30+(naoshi&0x0f));
- LCD12864_SetWindow(1, 2);
- }
- if(SetPlace==10)
- {
- LCD12864_WriteData(0x30+(naofen/16)); //分
- LCD12864_WriteData(0x30+(naofen&0x0f));
- LCD12864_SetWindow(1, 4);
- }
- if(SetPlace==11)
- {
- if(linsheng==1) //顯示鈴聲名字
- {
- for(zishu=0;zishu<16;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- }
- if(linsheng==2)
- for(zishu=16;zishu<32;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- if(linsheng==3)
- for(zishu=32;zishu<48;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- if(linsheng==4)
- for(zishu=48;zishu<64;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- if(linsheng==5)
- for(zishu=64;zishu<80;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- LCD12864_SetWindow(3, 0);
- }
- }
- void didi()
- {
- zz=1;
- Delay1ms(80);
- zz=0;
- Delay1ms(80);
- zz=1;
- Delay1ms(80);
- zz=0;
- Delay1ms(80);
- zz=1;
- Delay1ms(80);
- zz=0;
- Delay1ms(80);
- zz=1;
- Delay1ms(200);
- zz=0;
- }
- void key()
- {
- uchar zishu=0;
- if(s1==0) //檢測按鍵K1是否按下
- {
- Delay1ms(10); //消除抖動
- if((s1==0)&&(keysun>=2))
- {
- while(s1==0); //松手檢測
- if(SetPlace==-1)
- {
- LCD12864_WriteCmd(0x01); //清屏
- biaozhi1=0;
- keysun=3;
- jiemian();
- display();
- }
- SetPlace++;
- LCD12864_WriteCmd(0x0f); //顯示開,開光標
- if(SetPlace==7)
- {
- LCD12864_WriteCmd(0x0c); //顯示開,關(guān)光標
- SetPlace=-1;keysun=2;
- biaozhi1=1;
- Ds1302Init();
- zhujiemian();
- }
- naoxianguangbiao();
- }
- }
- if(s4==0) //鬧鐘設(shè)置
- {
- Delay1ms(10);
- if((s4==0)&&(keysun<=2))
- {
- while(s4==0); //松手檢測
- biaozhi1=0;
- keysun=1;
- if(SetPlace==-1)
- {
- LCD12864_WriteCmd(0x01);
- naojie();
- SetPlace=7;
- LCD12864_SetWindow(0, 6);
- if(naobiao==0)
- {
- LCD12864_WriteData(xiqi[18]);
- LCD12864_WriteData(xiqi[19]); //顯示關(guān)
- }
- else
- {
- LCD12864_WriteData(xiqi[16]);
- LCD12864_WriteData(xiqi[17]); //顯示開
- }
- LCD12864_SetWindow(1, 2);
- LCD12864_WriteData(0x30+(naoshi/16)); //時
- LCD12864_WriteData(0x30+(naoshi&0x0f));
- LCD12864_SetWindow(1, 4);
- LCD12864_WriteData(0x30+(naofen/16)); //分
- LCD12864_WriteData(0x30+(naofen&0x0f));
- LCD12864_SetWindow(3, 0);
- if(linsheng==1)
- {
- for(zishu=0;zishu<16;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- }
- if(linsheng==2)
- for(zishu=16;zishu<32;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- if(linsheng==3)
- for(zishu=32;zishu<48;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- if(linsheng==4)
- for(zishu=48;zishu<64;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- if(linsheng==5)
- for(zishu=64;zishu<80;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- }
- SetPlace++;
- LCD12864_WriteCmd(0x0f); //顯示開,開光標
- if(SetPlace>=12)
- {
- LCD12864_WriteCmd(0x0c); //顯示開,關(guān)光標
- SetPlace=-1;keysun=2;
- biaozhi1=1;
- LCD12864_WriteCmd(0x01);
- zhujiemian();
- }
- naoxianguangbiao();
- naoxian();
- }
- }
- if(biaozhi1==0)
- {
- if(s2==0) //檢測按鍵K2是否按下
- {
- Delay1ms(10); //消除抖動
- if(s2==0)
- {
- while(s2==0); //松手檢測
- if(SetPlace<=7)
- {
- TIME[SetPlace]++;
- if((TIME[SetPlace]&0x0f)>9) //換成BCD碼。
- TIME[SetPlace]=TIME[SetPlace]+6;
- if((TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59
- TIME[SetPlace]=0;
- if((TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小時只能到23
- TIME[SetPlace]=0;
- if((TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31
- TIME[SetPlace]=1;
- if((TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12
- TIME[SetPlace]=1;
- if((TIME[SetPlace]>=0x8)&&(SetPlace==5)) //周只能到7
- TIME[SetPlace]=1;
- if((TIME[SetPlace]>=0x99)&&(SetPlace==6)) //年只能到99
- TIME[SetPlace]=1;
- }
- else
- {
- if(SetPlace==8)
- {
- naobiao=~naobiao;
- if(naobiao==0)
- {
- LCD12864_WriteData(xiqi[18]);
- LCD12864_WriteData(xiqi[19]);
- }
- else
- {
- LCD12864_WriteData(xiqi[16]);
- LCD12864_WriteData(xiqi[17]);
- }
- }
- if(SetPlace==9)
- {
- naoshi++;
- if((naoshi&0x0f)>9) //換成BCD碼。
- naoshi=naoshi+6;
- if(naoshi>=0x24)
- naoshi=0;
- }
- if(SetPlace==10)
- {
- naofen++;
- if((naofen&0x0f)>9) //換成BCD碼。
- naofen=naofen+6;
- if(naofen>=0x60)
- naofen=0;
- }
- if(SetPlace==11)
- {
- linsheng++;
- if(linsheng==6)
- linsheng=1;
- }
- }
- }
- shixian();
- naoxian();
- }
- if(s3==0) //檢測按鍵K3是否按下
- {
- Delay1ms(10); //消除抖動
- if(s3==0)
- {
- while(s3==0); //松手檢測
- if(SetPlace<=7)
- {
- TIME[SetPlace]--;
- if((TIME[SetPlace]&0x0f)>9) //換成BCD碼。
- TIME[SetPlace]=TIME[SetPlace]-6;
- if((TIME[SetPlace]<=-1)&&(SetPlace<2)) //分秒只能到59
- TIME[SetPlace]=0x59;
- if((TIME[SetPlace]<=-1)&&(SetPlace==2)) //小時只能到23
- TIME[SetPlace]=0x23;
- if((TIME[SetPlace]<=0)&&(SetPlace==3)) //日只能到31
- TIME[SetPlace]=0x31;
- if((TIME[SetPlace]<=0)&&(SetPlace==4)) //月只能到12
- TIME[SetPlace]=0x12;
- if((TIME[SetPlace]<=0)&&(SetPlace==5)) //周只能到7
- TIME[SetPlace]=7;
- if((TIME[SetPlace]<=0)&&(SetPlace==6)) //年只能到99
- TIME[SetPlace]=0x99;
- }
- else
- {
- if(SetPlace==8)
- {
- naobiao=~naobiao;
- if(naobiao==0)
- {
- LCD12864_WriteData(xiqi[18]);
- LCD12864_WriteData(xiqi[19]); //顯示開關(guān)
- }
- else
- {
- LCD12864_WriteData(xiqi[16]);
- LCD12864_WriteData(xiqi[17]); //顯示開關(guān)
- }
- }
- if(SetPlace==9) //鬧鐘時
- {
- naoshi--;
- if((naoshi&0x0f)>9) //換成BCD碼。
- naoshi=naoshi-6;
- if(naoshi<0)
- naoshi=0x23;
- }
- if(SetPlace==10) //鬧鐘分
- {
- naofen--;
- if((naofen&0x0f)>9) //換成BCD碼。
- naofen=naofen-6;
- if(naofen<0)
- naofen=0x59;
- }
- if(SetPlace==11) //鈴聲選擇
- {
- linsheng--;
- if(linsheng==0)
- linsheng=5;
- }
- }
- }
- naoxian();
- shixian();
- }
- }
- }
- void jiemian() //界面
- {
- unsigned char i=0;
- LCD12864_SetWindow(0, 0);
- while(CharCode[i]!='\0')
- {
- LCD12864_WriteData(CharCode[i]);
- i++;
- if(i==16) //第一行滿寫第二行
- LCD12864_SetWindow(1,0);
- if(i==32) //第二行滿寫第三行
- LCD12864_SetWindow(2,0);
- if(i==48) //第三行滿寫第四行
- LCD12864_SetWindow(3,0);
- }
- }
- void Delay1ms(unsigned int y)
- {
- unsigned int x;
- for(y;y>0;y--)
- for(x=110;x>0;x--);
- }
- /*******************************************************************************
- * 函數(shù)名 : Ds18b20Init
- * 函數(shù)功能 : 初始化
- * 輸入 : 無
- * 輸出 : 初始化成功返回1,失敗返回0
- *******************************************************************************/
- unsigned char Ds18b20Init()
- {
- unsigned int i;
- DSPORT=0; //將總線拉低480us~960us
- i=70;
- while(i--);//延時642us
- DSPORT=1; //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
- i=0;
- while(DSPORT) //等待DS18B20拉低總線
- {
- i++;
- if(i>5000)//等待>5MS
- return 0;//初始化失敗
- }
- return 1;//初始化成功
- }
- /*******************************************************************************
- * 函數(shù)名 : Ds18b20WriteByte
- * 函數(shù)功能 : 向18B20寫入一個字節(jié)
- * 輸入 : com
- * 輸出 : 無
- *******************************************************************************/
- void Ds18b20WriteByte(unsigned char dat)
- {
- unsigned int i,j;
- for(j=0;j<8;j++)
- {
- DSPORT=0; //每寫入一位數(shù)據(jù)之前先把總線拉低1us
- i++;
- DSPORT=dat&0x01; //然后寫入一個數(shù)據(jù),從最低位開始
- i=6;
- while(i--); //延時68us,持續(xù)時間最少60us
- DSPORT=1; //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數(shù)值
- dat>>=1;
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : Ds18b20ReadByte
- * 函數(shù)功能 : 讀取一個字節(jié)
- * 輸入 : com
- * 輸出 : 無
- *******************************************************************************/
- unsigned char Ds18b20ReadByte()
- {
- unsigned char byte,bi;
- unsigned int i,j;
- for(j=8;j>0;j--)
- {
- DSPORT=0;//先將總線拉低1us
- i++;
- DSPORT=1;//然后釋放總線
- i++;
- i++;//延時6us等待數(shù)據(jù)穩(wěn)定
- bi=DSPORT; //讀取數(shù)據(jù),從最低位開始讀取
- /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/
- byte=(byte>>1)|(bi<<7);
- i=4; //讀取完之后等待48us再接著讀取下一個數(shù)
- while(i--);
- }
- return byte;
- }
- /*******************************************************************************
- * 函數(shù)名 : Ds18b20ChangTemp
- * 函數(shù)功能 : 讓18b20開始轉(zhuǎn)換溫度
- * 輸入 : com
- * 輸出 : 無
- *******************************************************************************/
- void Ds18b20ChangTemp()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令
- // Delay1ms(100); //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個延時了
- }
- /*******************************************************************************
- * 函數(shù)名 : Ds18b20ReadTempCom
- * 函數(shù)功能 : 發(fā)送讀取溫度命令
- * 輸入 : com
- * 輸出 : 無
- *******************************************************************************/
- void Ds18b20ReadTempCom()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令
- }
- /*******************************************************************************
- * 函數(shù)名 : Ds18b20ReadTemp
- * 函數(shù)功能 : 讀取溫度
- * 輸入 : com
- * 輸出 : 無
- *******************************************************************************/
- int Ds18b20ReadTemp()
- {
- int temp=0;
- unsigned char tmh,tml;
- Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令
- Ds18b20ReadTempCom(); //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
- tml=Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節(jié)
- tmh=Ds18b20ReadByte(); //再讀高字節(jié)
- temp=tmh;
- temp<<=8;
- temp|=tml;
- return temp;
- }
- void LcdDisplay(int temp) //lcd顯示
- {
-
- unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
- float tp;
- if(temp< 0) //當溫度值為負數(shù)
- {
- LCD12864_SetWindow(3, 5); //第4行,第6列
- LCD12864_WriteData(0x2d); //顯示負
- //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算由0.5,還是在小數(shù)點后面。
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
- //寫地址 80表示初始地址
- LCD12864_WriteData(0x30+datas[2]); //個位
- LCD12864_WriteData(0x2e); //顯示 ‘.’
- LCD12864_WriteData(0x30+datas[3]); //顯示小數(shù)點
-
- }
- else
- {
- LCD12864_SetWindow(3, 5); //第4行,第6列
- tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
- //如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點后面。
-
- datas[1] = temp % 10000 / 1000;
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
-
- //寫地址
- LCD12864_WriteData(0x30+datas[1]); //十位
- LCD12864_WriteData(0x30+datas[2]); //個位
- LCD12864_WriteData(0x2e); //顯示 ‘.’
- LCD12864_WriteData(0x30+datas[3]); //顯示小數(shù)點
- }
- }
- void Ds1302Write(uchar addr, uchar dat)
- {
- uchar n;
- RST = 0;
- _nop_();
- SCLK = 0;//先將SCLK置低電平。
- _nop_();
- RST = 1; //然后將RST(CE)置高電平。
- _nop_();
- for (n=0; n<8; n++)//開始傳送八位地址命令
- {
- DSIO = addr & 0x01;//數(shù)據(jù)從低位開始傳送
- addr >>= 1;
- SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)
- _nop_();
- SCLK = 0;
- _nop_();
- }
- for (n=0; n<8; n++)//寫入8位數(shù)據(jù)
- {
- DSIO = dat & 0x01;
- dat >>= 1;
- SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)
- _nop_();
- SCLK = 0;
- _nop_();
- }
-
- RST = 0;//傳送數(shù)據(jù)結(jié)束
- _nop_();
- }
- uchar Ds1302Read(uchar addr)
- {
- uchar n,dat,dat1;
- RST = 0;
- _nop_();
- SCLK = 0;//先將SCLK置低電平。
- _nop_();
- RST = 1;//然后將RST(CE)置高電平。
- _nop_();
- for(n=0; n<8; n++)//開始傳送八位地址命令
- {
- DSIO = addr & 0x01;//數(shù)據(jù)從低位開始傳送
- addr >>= 1;
- SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)
- _nop_();
- SCLK = 0;//DS1302下降沿時,放置數(shù)據(jù)
- _nop_();
- }
- _nop_();
- for(n=0; n<8; n++)//讀取8位數(shù)據(jù)
- {
- dat1 = DSIO;//從最低位開始接收
- dat = (dat>>1) | (dat1<<7);
- SCLK = 1;
- _nop_();
- SCLK = 0;//DS1302下降沿時,放置數(shù)據(jù)
- _nop_();
- }
- RST = 0;
- _nop_(); //以下為DS1302復位的穩(wěn)定時間,必須的。
- SCLK = 1;
- _nop_();
- DSIO = 0;
- _nop_();
- DSIO = 1;
- _nop_();
- return dat;
- }
- void Ds1302Init()
- {
- uchar n;
- Ds1302Write(0x8E,0X00); //禁止寫保護,就是關(guān)閉寫保護功能
- for (n=0; n<7; n++)//寫入7個字節(jié)的時鐘信號:分秒時日月周年
- {
- Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
- }
- Ds1302Write(0x8E,0x80); //打開寫保護功能
- }
- void Ds1302ReadTime()
- {
- uchar n;
- for (n=0; n<7; n++)//讀取7個字節(jié)的時鐘信號:分秒時日月周年
- {
- TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
- }
- }
- void TimerConfiguration()
- {
- TMOD = 0x11; //選擇工作方式1
- TH0 = 0x3C; //設(shè)置初始值,定時50MS
- TL0 = 0xB0;
- EA = 1; //打開總中斷
- ET0 = 1; //打開定時器0中斷
- TR0 = 1; //啟動定時器0
- zz=0;//關(guān)蜂鳴器
- TH1=0xd8;TL1=0xef;
- ET1=1;
- }
- void Timer0() interrupt 1
- {
- TH0 = 0x3C; //設(shè)置初始值
- TL0 = 0xB0;
- timeji++;
- if(timeji==200)
- {
- timeji=0;
- biaozhi=0;
- }
- }
- void display()
- {
- LCD12864_SetWindow(1, 0);
- LCD12864_WriteData(0x30+TIME[6]/16); // 年
- LCD12864_WriteData(0x30+(TIME[6]&0x0f));
- LCD12864_SetWindow(1, 2);
- LCD12864_WriteData(0x30+TIME[4]/16); //月
- LCD12864_WriteData(0x30+(TIME[4]&0x0f));
- LCD12864_SetWindow(1, 4);
- LCD12864_WriteData(0x30+TIME[3]/16); //日
- LCD12864_WriteData(0x30+(TIME[3]&0x0f));
- LCD12864_SetWindow(1, 7);
- LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2]); //星期
- LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2+1]);
- LCD12864_SetWindow(2, 2);
- LCD12864_WriteData(0x30+TIME[2]/16); //時
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼 完整源代碼在附件里。
全部資料下載地址:
萬年歷12864資料.rar
(1.05 MB, 下載次數(shù): 1346)
2017-5-23 12:01 上傳
點擊文件名下載附件
|