12864液晶电子钟 具有按键可调、闹钟、温度显示
12864液晶电子钟具有按键可调闹钟温度显示
12864液晶电子钟具有按键可调闹钟温度显示理解才是最主要程序已全部通过硬件测试,请放心使用。
(没有使用到DS1302)/某某某某某某某某某某某某12864时钟显示函数某某某某某某某某某某某某某//某某某某某某实现时间走动、按键控制、蜂鸣器闹铃、温度显示某某某某某某/#include<reg52.h>#include<tdio.h>#defineucharunignedchar#defineuintunignedint/某某某某某某某某某某某某某某某某某某某某功能:定义液晶12864控制端接口某某某某某某某某某某某某某某某某某某某某某/bitr=P2^6;//注意:rw控制端始终为低电平,直接在硬件上接低电平biten=P2^7;bitwd=P2^0;//温度传感器信号线/某某某某某某某某某某某某某某某某某某某某功能:定义蜂鸣器、按键接口某某某某某某某某某某某某某某某某某某某某某/bitbeet=P2^2;//蜂鸣器定义bitkey1=P1^0;//功能选择bitkey2=P1^1;//至加bitkey3=P1^2;//至减bitkey4=P1^3;//北京时间与闹钟时间画面切换/某某某某某某某某某某某某某某某某某某某某功能:定义数据初始值某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/charhour=23,minute=59,econd=58,count=0;charhi=0,fen=0,miao=0,hm;intyear=2022;charmonth=12,day=30,mm=0,cc=7;uinttemp;floatf_temp;/某某某某某某某某某某某某某某某某某某某某功能:定义数组字符串某某某某某某某某某某某某某某某某某某某某某/ucharcodetable1[]={"幸福牌电子钟"};ucharcodetable2[]={"温馨提示:00.0℃"};/某某某某某某某某某某某某某某某某某某某某功能:延时函数某某某某某某某某某某某某某某某某某某某某某某某某某某某/voiddelay(uintz){uint某,y;for(某=z;某>0;某--)for(y=110;y>0;y--);}/某某某某某某某某某某某某某某某某某某某功能:蜂鸣器响应某某某某某某某某某某某某某某某某某某某某某某某/voidfengmingqi(){beet=0;delay(1);beet=1;delay(1);}理解才是最主要/某某某某某某某某某某某某某某某某某某某某功能:液晶12864读写数据某某某某某某某某某某某某某某某某某某/void某ieling_hu(ucharaa,ucharbb){if(aa==1){r=0;}if(aa==0){r=1;}P0=bb;delay(1);en=1;delay(1);en=0;delay(1);}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864写入地址某某某某某某某某某某某某某某某某某某/void某ieludizhi(uchar某,uchary){witch(某){cae1:某ieling_hu(1,0某80+y);return;//return返回的意思cae2:某ieling_hu(1,0某90+y);return;cae3:某ieling_hu(1,0某88+y);return;cae4:某ieling_hu(1,0某98+y);return;}}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864写入字符串某某某某某某某某某某某某某某某某某/void某iezifuchuan(uchar某dd){while(某dd!='\0'){某ieling_hu(0,某dd++);}}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864清屏函数某某某某某某某某某某某某某某某某某某某某某/voidqingping(){某ieling_hu(1,0某01);//清屏某ieling_hu(1,0某01);//清屏某ieling_hu(1,0某01);//清屏delay(20);}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864初始化指令操作某某某某某某某某某某某某某某某某某某/voidinit_12864(){某ieling_hu(1,0某30);//基本指令操作某ieling_hu(1,0某30);//基本指令操作某ieling_hu(1,0某0C);//0某0c:无光标,O某OF:光标反白显示某ieling_hu(1,0某01);//清屏理解才是最主要某ieling_hu(1,0某06);}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864初始化字串显示某某某某某某某某某某某某某某某某某某/voidinit_zifu(){某ieludizhi(1,0);某iezifuchuan("欢迎使用");delay(1);某ieludizhi(2,0);某iezifuchuan("幸福牌电子钟");delay(1);某ieludizhi(3,0);某iezifuchuan("订购热线");delay(1);某ieludizhi(4,0);某iezifuchuan("Phone:0777-66914");delay(9534);qingping();某ieludizhi(1,0);某iezifuchuan(table1);delay(1);某ieludizhi(4,0);某iezifuchuan(table2);delay(1);某ieludizhi(3,5);某iezifuchuan("星期");某ieludizhi(2,2);某iezifuchuan("年月日");}/某某某某某某某某某某某某某某某某某某某功能:时间、年月日显示函数某某某某某某某某某某某某某某某某某某某某/voiddiplay(){某ieludizhi(3,0);//显示时分秒某ieling_hu(0,0某30+hour/10);某ieling_hu(0,0某30+hour%10);某ieling_hu(0,':');某ieling_hu(0,0某30+minute/10);某ieling_hu(0,0某30+minute%10);某ieling_hu(0,':');某ieling_hu(0,0某30+econd/10);某ieling_hu(0,0某30+econd%10);某ieludizhi(2,0);//显示年某ieling_hu(0,0某30+year/1000);某ieling_hu(0,0某30+year%1000/100);某ieling_hu(0,0某30+year%100/10);某ieling_hu(0,0某30+year%10);某ieludizhi(2,3);//显示月某ieling_hu(0,0某30+month/10);某ieling_hu(0,0某30+month%10);某ieludizhi(2,5);//显示日某ieling_hu(0,0某30+day/10);某ieling_hu(0,0某30+day%10);}/某某某某某某某某某某某某某某某某某某某功能:闹钟(时间、年月日)显示函数某某某某某某某某某某某某某某某某某某某某/voiddiplay1(){理解才是最主要某ieludizhi(3,0);//显示时分秒某ieling_hu(0,0某30+hi/10);某ieling_hu(0,0某30+hi%10);某ieling_hu(0,':');某ieling_hu(0,0某30+fen/10);某ieling_hu(0,0某30+fen%10);某ieling_hu(0,':');某ieling_hu(0,0某30+miao/10);某ieling_hu(0,0某30+miao%10);某ieludizhi(2,0);//显示年某ieling_hu(0,0某30+year/1000);某ieling_hu(0,0某30+year%1000/100);某ieling_hu(0,0某30+year%100/10);某ieling_hu(0,0某30+year%10);某ieludizhi(2,3);//显示月某ieling_hu(0,0某30+month/10);某ieling_hu(0,0某30+month%10);某ieludizhi(2,5);//显示日某ieling_hu(0,0某30+day/10);某ieling_hu(0,0某30+day%10);}/某某某某某某某某某某某某某某某某某某某功能:星期函数某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/ void某ingqi(){witch(cc){cae1:某ieludizhi(3,7);某iezifuchuan("一");return;cae2:某ieludizhi(3,7);某iezifuchuan("二");return;cae3:某ieludizhi(3,7);某iezifuchuan("叁");return;cae4:某ieludizhi(3,7);某iezifuchuan("四");return;cae5:某ieludizhi(3,7);某iezifuchuan("五");return;cae6:某ieludizhi(3,7);某iezifuchuan("六");return;cae7:某ieludizhi(3,7);某iezifuchuan("日");return;}}/某某某某某某某某某某某某某某某某某某某功能:按键程序某某某某某某某某某某某某某某某某某某某/voidanjian(){if(key4==0){delay(1);hm=~hm;while(key4==0);}/某某某某某某某某某某某某某某某某某某某功能:key1按键选择功能某某某某某某某某某某某某某某某某某某某/if(key1==0){delay(1);mm++;if(hm!=0){if(mm>=4)mm=0;}理解才是最主要if(mm==1){某ieludizhi(3,3);某ieling_hu(0,0某5f);}if(mm==2){TR0=1;某ieludizhi(3,2);某ieling_hu(0,0某5f);}if(mm==3){某ieludizhi(3,0);某ieling_hu(0,0某5f);}if(mm==4){某ieludizhi(2,5);某ieling_hu(0,0某5f);}if(mm==5){某ieludizhi(2,3);某ieling_hu(0,0某5f);}if(mm==6){某ieludizhi(2,1);某ieling_hu(0,0某5f);}if(mm==7){某ieludizhi(3,7);某ieling_hu(0,0某5f);}if(mm==8){某ieludizhi(2,7);某ieling_hu(0,0某02);}if(mm>=9){某ieludizhi(2,7);某ieling_hu(0,0某20);mm=0;}//mm=0;跳出调整时间while(key1==0);}/某某某某某某某某某某某某某某某某某某某功能:key2按键加减功能某某某某某某某某某某某某某某某某某某某/if(mm==1&&key2==0)//秒加1{if(hm==0){TR0=0;delay(1);if(key2==0){econd++;if(econd>=60){e cond=0;}}}if(hm!=0){delay(1);if(key2==0){miao++;if(miao>=60){miao=0;}}} while(key2==0);}if(mm==1&&key3==0)//秒减1{if(hm==0){TR0=0;delay(1);if(key3==0){econd--;if(econd<=-1){econd=59;}}}if(hm!=0){delay(1);if(key3==0){miao--;if(miao<=-1){miao=59;}}}while(key3==0);}if(mm==2&&key2==0)//分加1{if(hm==0){delay(1);if(key2==0){minute++;if(minute>=60){minut e=0;}}}if(hm!=0){delay(1);if(key2==0){fen++;if(fen>=60){fen=0;}}}while(key2==0);}if(mm==2&&key3==0)//分减1{if(hm==0){delay(1);if(key3==0){minute--;if(minute<=-1){minute=59;}}}if(hm!=0){delay(1);if(key3==0){fen--;if(fen<=-1){fen=59;}}} while(key3==0);}理解才是最主要if(mm==3&&key2==0)//时加1{if(hm==0){delay(1);if(key2==0){hour++;if(hour>=24){hour=0;}}} if(hm!=0){delay(1);if(key2==0){hi++;if(hi>=24){hi=0;}}}while(key2==0);}if(mm==3&&key3==0)//时减1{if(hm==0){delay(1);if(key3==0){hour--;if(hour<=-1){hour=23;}}}if(hm!=0){delay(1);if(key3==0){hi--;if(hi<=-1){hi=23;}}} while(key3==0);}if(mm==4&&key2==0)//日加1{delay(1);if(key2==0){day++;if(day>=31){day=1;}}while(key2==0);}if(mm==4&&key3==0)//日减1{delay(1);if(key3==0){day--;if(day<=0){day=31;}}while(key3==0);}if(mm==5&&key2==0)//月加1 {delay(1);if(key2==0){month++;if(month>=13){month=1;}}理解才是最主要while(key2==0);}if(mm==5&&key3==0)//月减1{delay(1);if(key3==0){month--;if(month<=0){month=12;}}while(key3==0);}if(mm==6&&key2==0)//年加1{delay(1);if(key2==0){year++;}//不设置年限while(key2==0);}if(mm==6&&key3==0)//年减1{delay(1);if(key3==0){year--;}while(key3==0);}if(mm==7&&key2==0)//星期加1 {delay(1);if(key2==0){cc++;if(cc>=8){cc=1;}}while(key2==0);}if(mm==7&&key3==0)//星期减1 {delay(1);if(key3==0){cc--;if(cc==0){cc=7;}理解才是最主要}while(key3==0);}}/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某功能:18B20所有函数某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某//某某某某某某某某某某某某某某某某某某某18B20复位,初始化函数某某某某某某某某某某某某某某某某某某某某某某某某某某/voiddreet(void){uinti;wd=0;i=103;while(i>0)i--;wd=1;i=4;while(i>0)i--;}/某某某某某某某某某某某某某某某某某某某18B20读1位函数某某某某某某某某某某某某某某某某某某某某某某某某某某/bittempreadbit(void){uinti;bitdat;wd=0;i++;//i++起延时作用wd=1;i++;i++;dat=wd;i=8;while(i>0)i--;return(dat);}/某某某某某某某某某某某某某某某某某某某18B20读1个字节函数某某某某某某某某某某某某某某某某某某某某某某某某某某/uchartempread(void){uchari,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里}return(dat);理解才是最主要}/某某某某某某某某某某某某某某某某某某某18B20写一个字节数据函数某某某某某某某某某某某某某某某某某某某某某某某某某某/voidtempwritebyte(uchardat){uinti;ucharj;bittetb;for(j=1;j<=8;j++){tetb=dat&0某01;dat=dat>>1;if(tetb)//写1{wd=0;i++;i++;wd=1;i=8;while(i>0)i--;}ele{wd=0;//写0i=8;while(i>0)i--;wd=1;i++;i++;}}}/某某某某某某某某某某某某某某某某某某某18B20开始获取温度并转换函数某某某某某某某某某某某某某某某某某某某某某某某某某某/voidtempchange(void){dreet();delay(1);tempwritebyte(0某cc);//写跳过读ROM指令tempwritebyte(0某44);//写温度转换指令}/某某某某某某某某某某某某某某某某某某某18B20读取寄存器中存储的温度数据函数某某某某某某某某某某某某某某某某某某某某某某某某某某/uintget_temp(){uchara,b;dreet();delay(1);理解才是最主要tempwritebyte(0某cc);tempwritebyte(0某be);a=tempread();//读低8位b=tempread();//读高8位temp=b;temp<<=8;//两个字节组合为1个字temp=temp|a;f_temp=temp某0.0625;//温度在寄存器中为12位分辨率位0.0625°temp=f_temp某10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入f_temp=f_temp+0.05;returntemp;//temp是整型}/某某某某某某某某某某某某某某某某某某某18B20发送数据函数某某某某某某某某某某某某某某某某某某某某某某某某某某/{do{SBUF=某parr++;//发送数据while(!TI);//等待发送完成标志为1TI=0;//标志清零}while(某parr);//保持循环直到字符为'\0'}/某某某某某某某某某某某某某某某某某某某某某某某某功能:主函数某某某某某某某某某某某某某某某某某某某某某某某某某某某某/ voidmain(){ucharbuff[4];TMOD=0某01;//设置T0为工作方式1EA=1;ET0=1;TR0=1;//开启T0中断TH0=-50000/256;TL0=-50000%256;init_12864();init_zifu();hm=0;while(1){if(count>5&&count<18){tempchange();//开始获取温度get_temp();//读取寄存温度printf(buff,"%f",f_temp);某ieludizhi(4,5);某ieling_hu(0,0某30+temp/100);某ieling_hu(0,0某30+temp%100/10);理解才是最主要某ieling_hu(0,0某2e);某ieling_hu(0,0某30+temp%100%10);}if(hm==0)diplay();//如果hm=0显示北京时间,否则显示闹钟时间elediplay1();anjian();//按键判断某ingqi();//显示星期if(minute==59&&econd==59){fengmingqi();}//整点报时if(hi==hour&&fen==minute&&miao>=econd&&miao<=econd+3){fengmi ngqi();}//闹钟}}/某某某某某某某某某某某某某某某某某某某某某某某某功能:中断函数某某某某某某某某某某某某某某某某某某某某某某某某某某/ {TH0=-50000/256;TL0=-50000%256;count++;if(count==20){count=0;econd++;if(econd==60){econd=0;minute++;if(minute==60) {minute=0;hour++;if(hour==24){hour=0;day++;cc++;if(cc==8)cc=1; if(day==31){day=1;month++;if(month==13)理解才是最主要{month=1;year++; }}} } } } }。
12864中文字库液晶模块使用说明书
12864中文字库液晶模块使用说明书第 1 页共16 页一、12864液晶显示模块概述1. 12864液晶显示模块是128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标GB2312码简体中文字库(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。
可与CPU 直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。
具有多种功能:光标显示、画面移位、睡眠模式等。
2. 外观尺寸:93×70mm(4X8C), 84×44mm(2X8C),110×65mm(2x8 C _2), 116×39mm(2X10),180×65mm(4X16A)3. 视域尺寸:73×39mm(4X8C), 78×25mm(2x8 C _2), 70×20mm(2X8C),85×20mm(2X10), 132×39mm(4X16A),补充说明:外观尺寸可根据用户的要求进行适度调整。
二、模块引脚说明1)表—1:(128X32)、(160X32)模块引脚说明引脚名称 方向 说明 引脚名称方向 说明1 VSS - GND(0V) 11 DB4 I/O 数据42 VDD - Supply Voltage For Logic (+5v) 12 DB5 I/O 数据53 VO - Supply Voltage For LCD (悬空)13 DB6 I/O 数据64 RS(CS) H/L H: Data L: Instruction Code 14 DB7 I/O 数据75 R/W(STD) H/L H: Read L: Write15 PSB H/L 16032此脚为:RESET脚 6 E(SCLK) H,H/L Enable Signal7 DB0 I/O 数据0 16 /RST H/L 16032此脚为空8 DB1 I/O 数据1 17 LEDK - 16032此脚为A9 DB2 I/O 数据2 18 LEDA - 16032此脚为K10 DB3 I/O 数据3 注:以上K为负,A为正4)表—4:(256X64)引脚说明引脚名称 方向 说明引脚名称 方向 说明 1 FG - FRAME GROUND 11 DB0 I/O 数据0 2 VSS - GND(0V)12 DB1 I/O 数据1 3 VDD - Supply Voltage For Logic (+5v) 13 DB2 I/O 数据2 4 NC - 空脚14 DB3 I/O 数据3 5 R/W H/L H: Read L: Write 15 DB4 I/O 数据4 6 E1 H,H/L Enable Signal1 16 DB5 I/O 数据5 7 E2 H,H/L Enable Signal217 DB6 I/O 数据6 8 RS H/L H: Data L: Instruction Code 18 DB7 I/O 数据7 9 NC - 空脚19 NC - 空脚 10 /RST H/L Reset Signal 低电平有效 20 NC - 空脚注 K背光源负极(LED-OV)A背光源正极(LED+5V)三、12864液晶硬件接口1、逻辑工作电压(VDD):4.5~5.5V2、电源地(GND):0V3、LCD 驱动电压(V0):0~-10V4、工作温度(Ta):0~55℃(常温) / -20~70℃(宽温) 保存温度(Tstg):-10~65℃(常温)5、电气特性见附图1 外部连接图(参考附图2)模块有并行和串行两种连接方法(时序如下): 1、8位并行连接时序图MPU 写资料到模块RSR/WEMPU从模块读出资料RSR/WE2、串行连接时序图CS C LS T3、AC电气特性(TA=25℃ VCC=5V)condition Min. Typ. Max. UnitSYMBOL Characteristics Testfrequency Rf=39KΩ480 540 600 KHz Fosc OSCTIME UNIT PARAMETER SYMBOL MESUREFOR WRITE MODE(WRITING DATA FROM MPU TO ST7920)System cycle time TC 13,000 nsAddress setup time TAS 1,500 nsAddress hold time TAH 1,500 nsData setup time TDSW 1,000 nsData hold time TH 20 nsEnable pulsewidth TPW 1,500 nsEnable rise/fall time TR,TF 25 nsFOR READ MODE(READING DATA FROM ST7920 TO MPU)System cycle time TC 13,000 nsAddress setup time TAS 1,500 nsAddress hold time TAH 1,500 nsData setup time TDDR 1,000 nsData hold time TH 20 ns Enable pulsewidth TPW 1,500 ns Enable rise/fall time TR,TF 25 ns四、用户指令集指令表—2:(RE=1:扩充指令集)指令码指令RS RW DB7 DB6 DB5DB4 DB3 DB2DB1DB0说明执行时间(540KHZ )待命模式 0 0 0 0 0 0 0 0 0 1将DDRAM 填满“20H ”,并且设定DDRAM 的地址计数器(AC )到“00H ” 72us卷动地址或IRAM 地址选择 0 0 0 0 0 0 0 0 1 SR SR=1:允许输入垂直卷动地址 SR=0:允许输入IRAM 地址72us反白选择 0 0 0 0 0 0 0 1 R1 R0选择4行中的任一行作反白显示,并可决定反白与否 72us 睡眠模式0 0 0 0 0 0 1 SL X XSL=1:脱离睡眠模式 SL=0:进入睡眠模式72us扩充功能设定0 0 0 0 1 1 X1REG 0RE=1:扩充指令集动作RE=0:基本指令集动作G=1 :绘图显示ONG=0 :绘图显示OFF72us设定IRAM地址或卷动地址0 0 0 1 AC5AC4 AC3 AC2AC1AC0SR=1:AC5—AC0为垂直卷动地址SR=0:AC3—AC0为ICON IRAM地址72us设定绘图RAM地址0 0 1 AC6 AC5AC4 AC3 AC2AC1AC0设定CGRAM地址到地址计数器(AC)72us备注:1、当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。
LCD12864液晶中文说明书
J12864中文/JGD12864中文/FY12864ZW
特色:(1)模组背部自带10K3*3硬封可调电位器,可以调到理想对比度
(2)LED背光极性可调,JP4为液晶背光正负反接处,此模组背光为4颗LED灯,非普通背光
(3)模组自带原装三星正品防静电电容,抗干扰性更强C6C7C8
C固定为0
第二字节:(并行)8位数据的高4位—格式DDDD0000第三字节:(并行)8位数据的低4位—格式0000DDDD串行接口时序参数:(测试条件:T=25℃VDD=4.5V)
四、用户指令集
1、指令表1:(RE=0:基本指令集)
指令
指令码
说明
执行时间
(540
KHZ)
RS
RW
DB7
DB6
DB5
DB4
(4)串并口可通过两种方式调节1PSB脚控制2JP2短路到+
为并口短路到-为串口
(5)自改3.3V可通过JP3调节,默认接+级为5V,接-为3.3V,C4C5加极性电容即可型号
为106A14FH4,背光电阻33欧改成3.3欧
+
一、液晶显示模块概述
12864中文汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。
RAM
1
1
D7
D6
D5
D4
D3
D2
D1
D0
从内部RAM读取资料
(DDRAM/CGRAM/IRAM/G
72us
72us
读取忙碌标志
(BF)和地址
0
1
BF
12864LCD上显示温湿度
12864LCD显示温湿度第一种方式:/**********************DHT11与12864LCD************************/ #include <>#define uchar unsigned char#define uint unsigned intuchar lcd_x,lcd_y,data_byte=0,count;uint TH_data,TL_data,RH_data,RL_data,CK_data;uint TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;uchar num;sbit RS = P2^0;;uchar wendu[6];uchar shidu[6];/********************************************************1ms延时函数********************************************************/void delay(int z){ int x,y;for(x=z;x>0;x--)for(y=125;y>0;y--); }/********************************************************50us延时函数********************************************************/void delay_50us(uint t){uint j;for(;t>0;t--)for(j=19;j>0;j--);}/********************************************************50ms延时函数********************************************************/ void delay_50ms(uint t){uint j;for(;t>0;t--)for(j=6245;j>0;j--);}/********************************************************12864液晶写指令********************************************************/ void write_12864com(uchar com){ lcdrs=0;lcdrw=0;delay_50us(1);P0=com;lcden=1;delay_50us(10);lcden=0;delay_50us(2);}/********************************************************12864液晶写数据********************************************************/ void write_dat(ucha r dat) { lcdrs=1;lcdrw=0;delay_50us(1);P0=dat;lcden=1;delay_50us(10);lcden=0;delay_50us(2); }/********************************************************12864液晶初始化********************************************************/void init12864lcd(void) {delay_50ms(2);write_12864com(0x30);delay_50us(4);write_12864com(0x30);delay_50us(4);write_12864com(0x0f);delay_50us(4);write_12864com(0x01);delay_50us(240);write_12864com(0x06);delay_50us(10);write_12864com(0x0c);delay_50us(10); }/********************************************************12864液晶显示函数********************************************************/ void display1(void){uchar i;write_12864com(0x80);for(i=0;i<18;i++){write_dat(table2[i]);delay_50us(1); } }/********************************************************12864液晶显示函数********************************************************/ void display2(void){uchar i;write_12864com(0x90);for(i=0;i<18;i++){write_dat(table3[i]);delay_50us(1); } }/********************************************************12864液晶显示函数********************************************************/ void display3(void){ uchar i;write_12864com(0x88);for(i=0;i<8;i++){ write_dat(table4[i]);delay_50us(1); }}/********************************************************12864液晶显示函数********************************************************/ void displaywendu(void){ uchar i;write_12864com(0x94);for(i=0;i<3;i++){ write_dat(wendu[i]);delay_50us(1);}for(i=0;i<1;i++){write_dat(table5[i]);delay_50us(1);}for(i=4;i<5;i++){write_dat(wendu[i]);delay_50us(1); } }/********************************************************12864液晶显示函数********************************************************/ void displayshidu(void) {uchar i;write_12864com(0x8C);for(i=0;i<3;i++) {write_dat(shidu[i]);delay_50us(1); }for(i=0;i<1;i++){ write_dat(table5[i]);delay_50us(1);}for(i=4;i<5;i++){write_dat(shidu[i]);delay_50us(1);} }/********************************************************SHT11写字节程序********************************************************/char s_write_byte(unsigned char value){unsigned char i,error=0;for (i=0x80;i>0;i>>=1) //高位为1,循环右移{ if (i&value) DATA=1; //和要发送的数相与,结果为发送的位else DATA=0;SCK=1;_nop_();_nop_();_nop_(); //延时3usSCK=0;}DATA=1; //释放数据线SCK=1;error=DATA; //检查应答信号,确认通讯正常_nop_();_nop_();_nop_();SCK=0;DATA=1;return error; //error=1 通讯错误}/********************************************************SHT11读字节程序********************************************************/char s_read_byte(unsigned char ack){unsigned char i,val=0;DATA=1; //释放数据线for(i=0x80;i>0;i>>=1) //高位为1,循环右移{SCK=1;if(DATA)val=(val|i); //读一位数据线的值SCK=0; }DATA=!ack; //如果是校验,读取完后结束通讯;SCK=1;_nop_();_nop_();_nop_(); //延时3usSCK=0;_nop_();_nop_();_nop_();DATA=1; //释放数据线return val; }/********************************************************SHT11启动传输********************************************************/void s_transstart(void){DATA=1;SCK=0; //准备_nop_();SCK=1;_nop_();DATA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DATA=1;_nop_();SCK=0; }/********************************************************SHT11连接复位********************************************************/void s_connectionreset(void){ unsigned char i;DATA=1;SCK=0; //准备for(i=0;i<9;i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位{ SCK=1;SCK=0;}s_transstart(); //启动传输}/********************************************************SHT11温湿度检测********************************************************/char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsign ed char mode){unsigned error=0;unsigned int i;s_transstart(); //启动传输switch(mode) //选择发送命令{ case TEMP : error+=s_write_byte(MEASURE_TEMP);break; //测量温度case HUMI : error+=s_write_byte(MEASURE_HUMI);break; //测量湿度default : break;}for (i=0;i<65535;i++)if(DATA==0) break; //等待测量结束if(DATA) error+=1;// 如果长时间数据线没有拉低,说明测量错误*(p_value) =s_read_byte(ACK); //读第一个字节,高字节(MSB)*(p_value+1)=s_read_byte(ACK); //读第二个字节,低字节(LSB)*p_checksum =s_read_byte(noACK); //read CRC校验码return error; // error=1 通讯错误}/********************************************************SHT11温湿度值标度变换及温度补偿********************************************************/ void calc_sth10(flo at *p_humidity ,float *p_temperature){const float C1=; // 12位湿度精度修正公式const float C2=+; // 12位湿度精度修正公式const float C3=; // 12位湿度精度修正公式const float T1=+; // 14位温度精度5V条件修正公式const float T2=+; // 14位温度精度5V条件修正公式float rh=*p_humidity; // rh: 12位湿度float t=*p_temperature; // t: 14位温度float rh_lin; // rh_lin: 湿度linear值float rh_true; // rh_true: 湿度ture 值float t_C; // t_C : 温度℃t_C=t* - 40; //补偿温度rh_lin=C3*rh*rh + C2*rh + C1; //相对湿度非线性补偿rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相对湿度对于温度依赖性补偿if(rh_true>100)rh_true=100; //湿度最大修正if(rh_true<rh_true=; //湿度最小修正*p_temperature=t_C; //返回温度结果*p_humidity=rh_true; //返回湿度结果}/********************************************************主函数********************************************************/void main(void){unsigned int temp,humi;value humi_val,temp_val; //定义两个共同体,一个用于湿度,一个用于温度unsigned char error; //用于检验是否出现错误unsigned char checksum; //CRCinit12864lcd();display1();display2();display3();s_connectionreset(); //启动连接复位while(1){error=0; //初始化error=0,即没有错误error+=s_measure((unsigned char*)&,&checksum,TEMP); //温度测量error+=s_measure((unsigned char*)&,&checksum,HUMI); //湿度测量if(error!=0) s_connectionreset(); ////如果发生错误,系统复位else{=(float); //转换为浮点数=(float); //转换为浮点数calc_sth10(&,&; //修正相对湿度及温度temp=*10;humi=*10;wendu[0]=temp/1000+'0'; //温度百位wendu[1]=temp%1000/100+'0'; //温度十位wendu[2]=temp%100/10+'0'; //温度个位wendu[3]=0x2E; //小数点wendu[4]=temp%10+'0'; //温度小数点后第一位displaywendu();shidu[0]=humi/1000+'0'; //湿度百位shidu[1]=humi%1000/100+'0'; //湿度十位shidu[2]=humi%100/10+'0'; //湿度个位shidu[3]=0x2E; //小数点shidu[4]=humi%10+'0'; //湿度小数点后第一位displayshidu(); }Delay(800);//等待足够长的时间,以现行下一次转换}}。
12864zk红外遥控数字时钟
/*---------------------------------------------------------------------------红外遥控多功能数字时钟程序单片机:STC89C52RC晶振:12MHz时钟芯片:DS1302液晶屏:LCM-12864-ST7920功能描述: 大数字显示时间;能显示农历、温度和设置闹铃;有整点报时功能红外遥控和按键都能设置时间和闹铃说明:LCM12864使用并口连接方式,PSB、RST接高电平------------------------------------------------------------------------------*//*-------------------------------头文件---------------------------------------*/#include <reg52.h>#include <intrins.h>#include "LCD12864.h"#include "DS1302.h"#include "DS18B20.h"#include "nongli.h"#include "displaytime.h"#include "zk.h"#include "bell.h"#include "HW.H"#include "delay.h"#define uint unsigned int#define uchar unsigned char/*--------------------定义按键-----------------------------------------------*/sbit K1 = P1^0; //K1-设置sbit K2 = P1^1; //K2-确认、返回sbit K3 = P1^2; //K3-加sbit K4 = P1^3; //K4-减//K5=P1^4,K5-控制闹钟的打开与关闭,在"hw.h"中定义/*---------------------函数声明------------------------------*/void ds_w0(void);void ds_w(void);void Conver_week(bit c,uchar year,uchar month,uchar day);/*-----------------------------定义全局变量------------------------------*/bit w=0; //调时标志位unsigned char yy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;//定义时间映射全局变量(专用寄存器)signed char address,item,item0,max,mini;unsigned char clk_ala[2]={0x00,0x00};//闹钟数据存放初,始值为00:00unsigned char hour,minute,time;//用于闹铃的设置/*-----------------------------日期、时间设置函数-----------------------------*/void tiaozheng(void){yy = read_clock(0x8d);//调用1302时钟数据中的年数据,从地址0x8d中mo = read_clock(0x89);//调用1302时钟数据中的月数据,从地址0x89中dd = read_clock(0x87);//从1302芯片中读取日数据,从地址0x87中week = read_clock(0x8b);//从1302芯片中读取星期数据,从地址0x8b中//----------------------------------lcm_w_test(0,0x80);lcm_w_word("20");//显示内容字符20lcm_w_test(1,(yy/16)+0x30);//函数参数1,代表本行写数据,YY/16+0X30得出年十位数字的显示码地址,送显示lcm_w_test(1,yy%16+0x30);//函数lcm_w_word("年");//----------------------------------lcm_w_test(1,(mo/16)+0x30);lcm_w_test(1,mo%16+0x30);//与16取余数,得到月份的个位数,加0x30得到该数字的液晶内定显示码送显示lcm_w_word("月");//调用字符显示函数,显示文字月//----------------------------------/*lcm_w_test(0,0x88);//第一个参数0,表示本行写入LCM的是指令,指定显示位置88H (第三行左端)lcm_w_word("星期");//调用字符显示函数,显示文字星期lcm_w_test(1,mo%16+0x30);//与16取余数,得到月份的个位数,加0x30得到该数字的液晶内定显示码送显示*///----------------------------------lcm_w_test(1,(dd/16)+0x30);lcm_w_test(1,dd%16+0x30);//第一个1参数,表示本行写数据,日数据与16取余得个位数,加0x30得到显示码lcm_w_word("日");//显示字符日//----------------------------------if(read_clock(0x85) != hh){//如果程序中的小时与1302芯片中的不同,hh = read_clock(0x85);//刷新程序中的小时数据}lcm_w_test(0,0x91);//第一个参数0,表示本行写入LCM的是指令,指定显示位置88H (第三行左端)lcm_w_test(1,(hh/16)+0x30);//显示十位lcm_w_test(1,hh%16+0x30);//显示个位lcm_w_word("时");//----------------------------------if(read_clock(0x83) != mm){//如果1302芯片中的分钟数据与程序中的分钟变量不相等mm = read_clock(0x83);//刷新程序中的分钟数据}lcm_w_test(1,(mm/16)+0x30);//向液晶写数据,显示分钟的十位数lcm_w_test(1,mm%16+0x30);//向液晶写数据,显示分钟的个位数lcm_w_word("分");//----------------------------------if(read_clock(0x81) != ss){//如果1302芯片中的分钟数据与程序中的秒钟变量不相等(0x81为读秒数据0x80为写秒数据)ss = read_clock(0x81);//刷新程序中的秒钟数据}lcm_w_test(1,(ss/16)+0x30);//向液晶写数据,显示分钟的十位数lcm_w_test(1,ss%16+0x30);//向液晶写数据,显示分钟的个位数lcm_w_word("秒");////////////////////////////////////////////////////////////////////////=========显示闹钟的设置时间===================hour=clk_ala[0]; //取出上一次的闹钟小时值minute=clk_ala[1]; //取出上一次的闹钟分钟值lcm_w_test(0,0x88);lcm_w_word("闹钟---");//----------------------------lcm_w_test(1,(hour/10)+0x30);//显示小时十位lcm_w_test(1,(hour%10)+0x30);//显示小时个位//----------------------------lcm_w_word(":");//----------------------------lcm_w_test(1,(minute/10)+0x30);//显示分钟的十位lcm_w_test(1,(minute%10)+0x30);//显示分钟的个位//----------------------------lcm_w_word("----");}/*****************************************************************************/ //被调数据加一或减一,并检查数据范围,写入1302指定地址保存void ds_w(void){item0=time;item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;//时间的调整if(K3 == 0||key_add==1){//如果按动上调键item++;//数加1}if(K4 == 0||key_minish==1){//如果按动下调键item--;//数减1}if(item>max) item=mini;//查看数值是否在有效范围之内if(item<mini) item=max;//如果数值小于最小值,则自动等于最大值write_clock(0x8e,0x00);//允许写1302芯片操作write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302write_clock(0x8e,0x80);//写保护,禁止写操作}/********************************************************************///===============闹钟时间的加减设置======================void ds_w0(void){item0=time;if(K3 == 0||key_add==1){//如果按动上调键item0++;//数加1}if(K4 == 0||key_minish==1){//如果按动下调键item0--;//数减1}if(item0>max) item0=mini;//查看数值是否在有效范围之内if(item0<mini)item0=max;//如果数值小于最小值,则自动等于最大值time=item0;//调整后的时间重新赋值给time(time为hour或minute),这步很重要,没有将无法更新闹钟数据}/****************************************************************************** ****************************///调整时间子函数,设置键、数据范围、上调加一,下调减一功能。
12864汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)
//12864汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)#include <reg52.h>#include <intrins.h>#define uchar unsigned charvoid lcd_ini();void ascii_change(void);void delay();void wri_add(uchar com);void wri_dat(uchar com1);void shan(void);void disp();void tkey(void);sbit cs=P1^7;sbit sid=P1^6;sbit sclk=P1^5;bit flag=1;uchar dat,count,f=1;//f测试哪个单元为当前闪烁状态uchar data clock[3]={23,45,12};uchar code clockname[10]={"北京时间:"};uchar data num[6];/*******主程序*************/void main(){lcd_ini();count=10;//机器周期为1us,每次定时50ms,此变量用来控制循环次数,在下面赋值为20,共定时1秒TMOD=0x01;TL0=0XB0;TH0=0X3C;EA=1;ET0=1;IT0=1;EX0=1;TR0=1;while(1){back:ascii_change();disp();delay();if(flag==1)goto back;tkey();shan();delay();}}/****lcd初始化*******/void lcd_ini(){wri_add(0x30);delay();wri_add(0x0c);delay();wri_add(0x01);delay();wri_add(0x06);delay();}/********定时程序*************/ void timer1() interrupt 1 using 2 {TL0=0XB0;TH0=0X3C;count--;if(count==0){count=10;clock[2]++;//秒//}elsegoto out;if(clock[2]==60){clock[2]=0;clock[1]++;//分//}if(clock[1]==60){clock[1]=0;clock[0]++;}if(clock[0]==24)//时//clock[0]=0;out:_nop_();}/*******十位个位转换成ASCII码************/ void ascii_change(void){num[5]=clock[2]-(clock[2]/10)*10+0x30;num[4]=clock[2]/10+0x30;num[3]=clock[1]-(clock[1]/10)*10+0x30;num[2]=clock[1]/10+0x30;num[1]=clock[0]-(clock[0]/10)*10+0x30;num[0]=clock[0]/10+0x30;}/********廷时程序*************/void delay(){uchar i,j;for (i=250;i>0;i--)for (j=250;j>0;j--);}/*****Write address*********/void wri_add(uchar com){uchar i,j,k;cs=0;cs=1;dat=0xf8;for(i=1;i<=8;i++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com;dat=dat&0xf0;for(j=1;j<=8;j++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com;dat=_cror_(dat,4);// 此为高低四位交换dat=dat&0xf0;for(k=1;k<=8;k++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}}/*********Write data*************/ void wri_dat(uchar com1){uchar i,j,k;cs=0;cs=1;dat=0xfa;for(i=1;i<=8;i++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com1;dat=dat&0xf0;for(j=1;j<=8;j++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com1;dat=_cror_(dat,4);// 此为高低四位交换dat=dat&0xf0;for(k=1;k<=8;k++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}}/******display program***********/ void disp(){uchar i,k=0;wri_add(0x80);for (i=1;i<=9;i++)wri_dat(clockname[i-1]);wri_add(0x90);for (i=1;i<=6;i++) {k++;if(k==3||k==5)wri_dat(clockname[8]);//时间之间的冒号。
基于12864的万年历加温度显示设计
基于12864的万年历加温度显示设计摘要本设计将制作一种基于单片机控制的带实时温度显示、具有定时功能的电子万年历。
传统的电子日历大都体积大,功耗大,显示不准确等特点。
为了缩小体积,减小功耗,使其变得小巧灵敏,本设计加入了时钟芯片DS1302,可对时间进行准确记时,同时可设置定时时间,实现定时功能。
另外本设计具有显示实时温度的功能。
传统的温度传感器系统大都采用放大、调理、A/D转换,转换后的数字信号送入计算机处理,处理电路复杂、可靠性相对较差,占用计算机的资源比较多。
本设计将采用DS18B20一线制数字温度传感器,可将温度信号直接转换成数字信号送给微处理器,电路简单,成本低,实现了时间温度同时显示的效果。
最后,温度和时间都将通过12864液晶显示器进行显示。
测试表明系统达到了设计要求的各项功能,各部分工作正常。
关键词时钟/温度检测/单片机/温度MICROCONTROLLER-BASHED CALENDER AND TEMPERATURE DISPLAY DESIGNABSTRACTThis design creates an electronic calendar with real-time temperature display and timing function based on single chip control. Most of traditional calendars are characterized by large size, high power consumption and inaccurate display. In order to reduce volume and power consumption and make calendars become small and exquisite, the design adds a clock chip DS1302, which can accurately record the time and set a regular time to achieve timing function. In addition, this design displays real-time temperature function. Traditional temperature sensor system is mostly amplified, recuperated and A / D converted. The converted digital signal is input the computer to be processed, but the processing circuit is complicated with relatively poor reliability and occupies more resources of the computer. This design uses the DS18B20 first-line system digital temperature sensor to directly convert the temperature signal into digital signal and send it the microprocessor, whose circuit is simple and low cost, achieving the displayed effect of time and temperature simultaneously. Finally, the temperature and time will be displayed through the 12864 liquid crystal display. The test indicates that the system has reached various functions of the design requirements and each part operates smoothly.KEY WORDS clock, temperature detection, SCM, temperature目录中文摘要 (I)英文摘要.................................................................................................... I I 1概论. (1)1.1万年历发展背景 (1)1.2电子万年历的特点 (1)1.3国内外现状、发展 (1)2系统基本方案选择和论证 (2)2.1单片机芯片的选择方案和论证 (2)2.2显示模块的选择方案和论证 (3)2.3时钟芯片的选择方案和论证 (4)2.4温度传感器的选择方案和论证 (4)2.5电路设计最终方案确定 (5)3系统硬件电路设计 (6)3.1系统功能模块划分 (6)3.2各单元模块功能分析及模块电路设计 (6)3.2.1时钟模块 (6)3.2.2 温度模块 (7)3.2.3显示模块 (10)3.2.5 独立键盘模块 (18)3.2.6蜂鸣器模块 (19)3.2.7单片机模块 (20)3.3电路原理图的绘制和电路的焊接 (23)3.3.1原理图绘制软件PROTEL (23)3.3.2 PCB制作 (23)3.3.3 元器件的焊接 (24)4 系统软件设计 (26)4.1 万年历软件系统的流程图 (26)4.2温度信息的采集 (27)4.3时钟的读取 (30)4.3.1 DS1302控制字节的说明 (30)4.3.2 DS1302时间日期寄存器及相应位定义 (31)4.3.3 DS1302数据的输入和输出 (31)4.3.4 DS1302读写部分(程序)部分 (32)4.4温度的显示控制 (32)4.5键盘模块 (34)4.6蜂鸣器模块 (34)5设计总结 (35)致谢 (36)参考文献 (37)附录 (38)1 概论1.1 万年历发展背景随着电子技术的发展,人类不断研究,不断创新纪录。
基于12864的指针式时钟设计
基于12864的指针式时钟设计【摘要】LCD12864是基于点阵式的,像素为128×64的液晶显示屏,基本满足指针式时钟的显示要求。
本系统采用时钟芯片DS1302、单片机、12864设计一款可以切换数字式和指针式显示的电子时钟。
【关键词】指针式时钟;LCD12864;DS1302The Design of a Point Clock Based on 12864MENGMing-ming(Computer Science and Technology School, China University of Mining and TechnologyJiangSuXuzhou221000)【Abstract】The 12864 is a liquid crystal display of 128×64 dots, which can be used to display a point clock. In this paper, the design takes a sort of clock chip named DS1302 and 12864 to make a clock that can switch between point display and digital display.【Key words】Key Words: Point Clock; LCD12864;DS1302采用单片机与时钟芯片DS1302设计电子时钟时,通常是数字显示,这是由于选用数码管和1602等器件的显示能力有限。
而12864是基于点阵式的液晶屏,其像素点为128×64,基本达到指针式时钟显示要求。
本系统在时钟表盘、指针绘制及时钟走时和时间的准确性方面都基本实现要求。
虽然12864自身像素较低,使其显示指针式时钟效果远低于大屏幕LED,但两者所基于的原理相同,对于点阵设计的学习有较大帮助。
毕业设计—基于单片机的12864时钟显示
学士学位毕业论文(设计)题目:基于单片机的12864时钟显示摘要电子时钟是一种非常广泛日常计时工具,给人们的带来了很大的方便,在社会上越来越流行。
它可以对年、月、日、星期、时、分、秒进行计时,采用直观的数字显示,可以同时显示年月日时分秒等信息,还有时间校准等功能。
该电子时钟主要采用STC89C52单片机作为主控核心,用DS1302时钟芯片作为时钟、液晶12864显示屏显示。
STC89C52单片机是由深圳宏晶科技公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的12864液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒等信息。
此外,该电子时钟还具有时间校准等功能。
关键词:STC89C51单片机,DS1302时钟芯片,液晶12864AbstractElectronic clock is a very extensive daily timing tool, to the people has brought great convenience, more and more popular in the community. It can be the year, month, date, day, hour, minute, second for a time, using intuitive digital display, can display information such as year, month, day, hour, and time alignment functions. The electronic clock is used mainly as a master STC89C52 microcontroller core, with theDS1302 clock chip as a clock, LCD display12864. STC89C52 SCM is a Shenzhen Hong Crystal Technology has introduced, power consumption, voltage can be selected 4 ~ 6V voltage power supply; DS1302 clock chip is American DALLAS company launched with a fine current charging low-power real-time clock chip, it can year, month, date, day, hour, minute, second for a time, also has a leap year compensation and other functions, DS1302 and long life, small error; 12864 LCD digital display isused to display that can display year, month, date, day, hour, minute, second and so on. In addition, the electronic clock also has a time calibration function.Key Words:STC89C51 microcontroller, DS1302 clock chip, LCD 12864目录1绪论 (3)1.1时钟发展史 (3)1.2 目前的研究现状 (4)1.3研究目的及意义 (4)2 总体方案设计 (5)2.1 方案的选择 (5)2.1.1设计要求 (5)2.1.2方案的选择 (5)2.2总体方案组成框图 (6)3系统硬件设计 (6)3. 1主芯片模块 (6)3.1.1 中断系统 (8)3.1.2常用寄存器 (8)3.2晶振和复位电路 (10)3.2.1晶振电路 (10)3.2.2复位电路 (11)3.3 DS1302时钟芯片电路 (11)3.3.1 DS1302引脚图 (11)3.3.2 DS1302寄存器 (12)3.3.3 DS1302外围电路 (13)3.4 LCD12864显示模块 (13)3.4.1 LCD12864引脚功能 (13)3.4.2 LCD12864指令说明 (14)3.4.3 LCD12864电路接线 (15)3.5 红外遥控模块 (16)4 系统软件设计 (17)4.1 主程序设计 (17)4.2 LCD12864驱动程序 (19)4.3 DS1302驱动程序 (21)4.4 红外遥控程序 (24)5 调试结果 (25)5.1 正常显示日期时间画面 (26)5.2 进入调整时间日期画面 (26)5.3图片显示画面 (26)6总结 (27)致谢 (28)参考文献 (29)附录一 (31)附录二 (32)1绪论1.1时钟发展史很早以前,人类主要是利用天文现象和流动物质的连续运动来计时。
12864 万年历设计报告
课程设计报告题目多功能数字钟课程名称电子系统设计与工程实践院部名称电子与信息工程学院专业电子信息工程班级电子1001班学生姓名李盖(1010910101)指导教师荣峰多功能数字钟完成人:李盖(电子1001)摘要:随着人类科技文明的发展,人们对于时钟的要求在不断地提高。
时钟已不仅仅被看成一种用来显示时间的工具,在很多实际应用中它还需要能够实现更多其它的功能。
高精度、多功能、小体积、低功耗,是现代时钟发展的趋势。
在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。
具有小巧,价格低廉,走时精度高,使用方便,功能多等特点。
本设计的控制核心是单片机(STC90C516RD+),采用蜂鸣器、液晶显示器(LCD12864)、及其他电路构成。
实现了时间设置、闹铃设置、闹铃开和关、显示节日、显示生日、显示农历、生日时播放音乐、整点报时以及温度采集等功能。
关键词:多功能时钟,温度采集,闹铃,农历,显示节日1、设计要求1.利用LCD显示“年、月、日、星期、时、分、秒”信息,并可通过键盘修改当前时间。
2.具有闹钟时间设置和闹铃功能,利用蜂鸣器进行闹铃。
当闹铃发生时,能够通过按键取消闹铃。
3.利用温度传感器检测环境温度,并显示在LCD上。
2、总体设计2.1系统组成系统由单片机主控模块、时钟模块、测温模块、报警模块、显示模块、键盘接口模块共6个模块组成,电路系统框图下图所示:图1 系统框图2.2工作原理本设计核心器件之一时钟芯片DS1302,其主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。
采用普通32.768KHz晶振。
采用STC90C51作为主控芯片,利用它定期的读取时钟芯片DS1302中的时间并显示在LCD上;通过算法得出阴历日期并显示在LCD 上。
2.3用户至上的设计通过合理的布局,将键盘设置在LCD屏的下方,方便操作;其他的元路隐藏在LCD的后面使外观整洁简约。
LCD12864液晶电子钟
长沙学院《单片机原理及应用》课程设计说明书题目 LCD12864液晶显示电子钟设计系(部)专业(班级)姓名学号指导教师起止日期《单片机原理及应用》课程设计任务书系(部):专业:课题名称LCD12864液晶显示电子钟设计设计内容及要求1、课题内容:设计一种基于AT89S52 单片机的液晶显示电子时钟,要求如下:(1)、能正确显示时间、日期和星期显示格式为:时间:XX 小时:XX 分:XX 秒;日期:XX 年:XX 月:XX 日;星期:X。
(2)、时间能够由按键调整,误差小于1S。
(3)、闹钟功能:时间运行到与闹钟设定时间时,闹钟响(持续响3秒)。
(4)、报时功能:时间运行到正点时间时,闹钟响,几点钟就响几声(每声持续响2 秒,每两声之间时间间隔1 秒)。
液晶显示器第一行显示“数字电子钟”;第二行显示“当前时间”;第三行显示日期和星期;第四行显示最近一个闹钟的设定时间。
2、要求:完成该系统的硬件和软件的设计,在Proteus 软件上仿真通过,并提交一篇课程设计说明书。
设计工作量1、汇编或C51 语言程序设计;2、程序调试;3、在Proteus 上进行仿真成功,进行实验板下载调试;4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、调试过程,参考文献、设计总结等。
进度安排起止日期设计内容(或预期目标)备注第一天课题介绍,答疑,收集材料,C51介绍第二天设计方案论证,练习编写C51程序第三天——第六天程序设计第六天——第八天程序调试、仿真第九天——第十天系统测试并编写设计说明书教研室意见年月日系(部)主管领导意见年月日目录一、整体方案设计 (4)1、单片机的选择 (4)2、单片机结构 (4)二、前期准备 (5)三、程序设计 (8)1、键盘约定 (8)2、界面显示 (9)3、全局变量的定义 (9)4、系统时钟 (9)5、闹钟控制时间的设定 (9)四、总结与体会 (10)参考文献 (11)一、整体方案设计1、单片机的选择单片微型计算机主要由微处理器、存储器、I/O接口电路等组成。
LCD12864液晶显示电子钟设计
《单片机原理及应用》课程设计说明书题目LCD12864 液晶显示电子钟设计系(部)专业(班级)姓名学号指导教师起止日期课程设计任务书系(部):专业:课题名称LCD12864 液晶显示电子钟设计设计要求设计一种基于AT89S52 单片机的液晶显示电子时钟,要求如下:(1)、能正确显示时间、日期和星期显示格式为:时间:XX 小时:XX 分:XX 秒;日期:XX 年:XX 月:XX 日;星期:X。
(2)、时间能够由按键调整,误差小于1S。
(3)、闹钟功能:时间运行到与闹钟设定时间时,闹钟响(持续响3 秒)。
(4)、报时功能:时间运行到正点时间时,闹钟响,几点钟就响几声(每声持续响 2 秒,每两声之间时间间隔 1 秒)。
液晶显示器第一行显示“数字电子钟”;第二行显示“当前时间”;第三行显示日期和星期;第四行显示最近一个闹钟的设定时间。
2、要求:完成该系统的硬件和软件的设计,在Proteus 软件上仿真通过,并提交一篇课程设计说明书。
设计工作量1、汇编或C51 语言程序设计;2、程序调试;3、在Proteus 上进行仿真成功,进行实验板下载调试;4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、调试过程,参考文献、设计总结等。
工作计划起止日期工作内容第一天课题绍,答疑,收集材料,C51介绍第二天设计方案论证,练习编写C51 程序第三天~第六天程序设计第六天~第八天程序调试、仿真第九天~第十天系统测试并编写设计说明书教研室意见年月日系(部)主管领导意见年月日目录一、12864液晶的工作原理 (4)二、方案设计 (4)2.1 实物硬件设计 (4)2.2 系统硬件设计 (5)2.2.1 主芯片模块 (5)2.2.2 晶振和复位模块 (5)2.2.3 按钮模块 (6)2.3 系统软件设计 (6)2.3.1 主程序设计 (6)三、仿真和分析 (7)四、总结体会 (7)参考文献 (33)一、12864液晶的工作原理液晶显示屏中的业态光电显示材料,利用液晶的电光效应把电信号转换成数字符、图像等可见信号。
毕业论文12864多功能数字钟
毕业论文12864多功能数字钟题目:多功能数字钟摘要此多功能数字钟系统以89C55单片机作为控制核心,其外围电路包括时钟闹钟模块、温度测量模块、交流电电压测量及过欠压报警模块、交流电频率测量模块。
其中使用串行时钟芯片PCF8563,实现时间的显示设置和闹钟功能。
通过温度传感器AD590、 AC-DC转换芯片AD536及模数转换芯片ICL7135实现温度和交流电压的测量。
利用波形转换电路和单片机内部定时器测量交流电的频率。
利用光电开关实现非接触关闭闹钟功能。
本系统很好的完成了题目要求的基本及发挥要求,并进行了进一步的扩展。
关键词:89C55单片机 AD536 ICL7135目录1、引言 (3)2、方案论证与比较 (3)3、系统原理框图 (3)4、主要电路设计与计算..................................................................4 4.1基本功能部分 (4)4.2温度测量部分 (8)4.3交流电特性测量部分..................................................................11 5、系统软件工作流程图 (14)5.1软件说明 (14)5.2系统软件流程图 (14)6、系统性能测试与分析 (15)6.1测试仪器 (15)6.2测试方法与数据 (15)6.3时钟及闹钟功能测试 (15)6.4温度测试 (15)6.5交流电电压测试及过欠压报警 (15)6.6交流电频率测试 (16)7、误差分析 (17)结论 (18)致谢 (19)参考文献 (20)1、引言本题目的是设计一个数字时钟,要求具有24小时时间、闹钟设置并具有闹铃功能。
同时要求有对环境温度及供电电源特性进行测量的扩展功能。
我们提出了以下几种方案:2、方案论证与比较1)方案一这是一种纯硬件电路系统。
各功能采用分离的硬件电路模块实现。
DS1302 12864lcd单片机智能闹钟日期温度程序
/****************************************************************************/ //头文件#include <AT89X52.h>#include <string.h>/*****************************************************************************/ //灯与蜂鸣器定义sbit led_b = P2^7;sbit led_r = P1^4;sbit led_g1 = P1^3;sbit led_g2 = P1^2;sbit led_g3 = P1^0;sbit led_g4 = P1^1;sbit beep = P3^1;/*****************************************************************************/ //温度传感器定义sbit DQ = P3 ^ 0;//ds18B20/*****************************************************************************/ //键盘引脚定义sbit KEY_1 = P2^3; //左上sbit KEY_2 = P2^4; //左下sbit KEY_3 = P2^6; //右上sbit KEY_4 = P2^5; //右下sbit KEY_I = P3^2; //常0/****************************************************************************/ //引脚定义sbit SID = P2^1; //数据sbit SCLK = P2^2; //时钟/*****************************************************************************/ //定义DS1302时钟接口sbit clock_clk = P3 ^ 5;//ds1302_clk(时钟线)sbit clock_dat = P3 ^ 4;//ds1302_dat(数据线)sbit clock_Rst = P3 ^ 3;//ds1302_Rst(复位线)/*****************************************************************************/ //定义累加器A中的各位sbit a0 = ACC ^ 0;sbit a1 = ACC ^ 1;sbit a2 = ACC ^ 2;sbit a3 = ACC ^ 3;sbit a4 = ACC ^ 4;sbit a5 = ACC ^ 5;sbit a6 = ACC ^ 6;sbit a7 = ACC ^ 7;/****************************************************************************/ //定义全局变量unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)bit w = 0; //调时标志位static unsigned char menu = 0;//定义静态小时更新用数据变量static unsigned char keys = 0;//定义静态小时更新用数据变量static unsigned char timecount = 0;//定义静态软件计数器变量/****************************************************************************/ void DelayM(unsigned int a){//延时函数1MS/次unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。
12864显示可调1302时钟
sbit key1=P3^3; //自加“+”键
sbit key2=P3^4; //自减“-”键
uchar sum,keyflag=0; //调用时,分,秒,标志,调用键盘处理标志.
/*--------------以下为LCD12864相关函数--------------------------*/
uchar code TAB4[]={"室温: ℃"}; //第四行
/*----------------------DS1302相关声明-------------------------*/
char TAB_1302[]={ 0x00,0x40,0x09,0x10,0x07,0x00,0x12}; //秒:分:时:日:月:星期:年.
sck=1;
}
}
/**************************************************************
函数名称:uchar r_12864byte(void)
函数功能:读字节
***************************************************************/
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
/*------------LCD12864相关声明-----------------------------*/
#define com 0
函数名称:void c_12864busy( void )
HS12864-18液晶显示模块使用说明书
HS12864-18液晶显示模块使用说明书感谢您关注和使用我们的液晶产品。
如果您在使用中有任何疑问,请拨打我们的客户服务热线寻求技术支持和获取相关资料,我们竭诚为您服务。
您可以登录我们的网站了解最新产品信息。
或者您可以在我公司网站的留言簿栏目留下您宝贵的意见。
深圳汉昇实业有限公司SHENZHEN HANSHENG INDUSTRIAL CO.,LTD地址:深圳市南山区西丽镇官龙工业村东区18栋5楼邮编:518055公司主页:联系电话:传真:一、 概述HS12864-18使用KS0108(或其兼容芯片)作为控制器,适配M6800系列时序,具有8位标准数据总线。
可显示各种字符及图形。
每个KS0108拥有64×64位(512字节)的显示RAM,HS12864-18显示屏上的64×64点,显示RAM中的数据直接作为显示驱动信号。
HS12864-18具有操作指令简单,低功耗的特点。
HS12864-18采用COB工艺制作。
二、 外形结构1. 外形图2. 主要外形尺寸项 目 标 准 尺 寸 单 位模 块 体 积 75.0×54.7×12.5(max) mm视 域 60.0×32.6 mm行 列 点 阵 数 128×64 dots点 距 离 0.43×0.43 mm点 大 小 0.40×0.40 mm三、 硬件说明1. 接口定义管脚符号电平功能描述1 VDD 5.0V 供电电源,5.0V2 VSS 0V 电源地3 V0 负压 LCD驱动电压输入端(对比度调节)4-11 DB0~DB7H/L 数据线12 CS1 L 片选信号1,低有效,对应左半屏64×64点13 CS2 L 片选信号2,低有效,对应右半屏64×64点14 /RST H/L 复位信号,低有效15 R/W H/L 读/写信号高:读操作低:写操作16 RS H/L 寄存器选择端高:数据寄存器低:命令寄存器17 E H,H->L 使能信号18 V out 负压负压输出端19 LEDA 5.0V 背光正极20 LEDK 0V 背光负极2. 最大工作范围(1)逻辑工作电压(Vdd):4.5~5.5V(2)电源地(VSS): 0V(3)工作温度(Ta): -20~70℃(宽温)(4)存储温度(Tstg): -30~80℃3. 电气特性(测试条件 Ta=25,Vdd=5.0+/-0.25V)(1)输入高电平(Vih): 3.5Vmin(2)输入低电平(Vil): 0.55Vmax(3)输出高电平(Voh): 3.75Vmin(4)输出低电平(Vol): 1.0Vmax(5)工作电流: 8.0mAmax (注:不含背光电流)4. 原理简图VSS V0CS1CS25. HS12864-18的对比度调节HS12864-18上有负压电路,生成的负压由Vout 脚输出,加过用户主板返回到液晶模块接口的V0端,由此调节对比度。
LCD12864可调电子钟.
#include<reg51.h>#include"ziku.h"#define uchar unsigned char#define uint unsigned int/***************赋值************/#define lcd_on 0x3f //LCD开显示#define lcd_off 0x3e //LCD关显示#define lcd_row 0xc0 //LCD行初始化,共64行 #define lcd_col 0x40 //LCD列初始化,共64列 #define lcd_page 0xb8 //LCD页初始化,共8页 /**********定义变量*******/uchar a,b,c,h,m,s,yue,ri,xingqi;uint mun,nian,n;/*************定义LCD控制字*********/sbit lcd_cs1=P2^0; //LCD右屏sbit lcd_cs2=P2^1;sbit lcd_rs=P2^2;sbit lcd_rw=P2^3;sbit lcd_en=P2^4;sbit duan=P2^6; //LCD左屏 //LCD数据、指令寄存器 //LCD读、写操作 //LCD使能信号 //数码管段选择信号 sbit wei=P2^7; //数码管位选择信号 /*************定义按键************/sbit k1=P3^0;sbit k2=P3^1;sbit k3=P3^2;/***************************************************/ /*延时函数*/void delayms(uint z){int x,y;}/***************************************************/ /*定时器初始化*/ void timer_init(){TMOD=0x01; //选择定时器方式TH0=(65536-50000)/256; //设置定时时间为50ms}/***************************************************/ /*LCD选屏函数*/ void select_screen(uchar screen){switch(screen) { case 0: TL0=(65536-50000)%256; EA=1; //开总中断 ET0=1; //开定时器中断 TR0=1; //启动定时器 for(x=z;x>0;x--) for(y=110;y>0;y--); //选择LCD全屏 lcd_cs1=0; lcd_cs2=0; break; //选择LCD左屏 case 1: lcd_cs1=0; lcd_cs2=1; break; case 2: //选择LCD右屏 lcd_cs1=1; lcd_cs2=0; break; }}/**************************************************/ /*LCD写指令函数*/ void write_com(uchar com){}/**************************************************/ /*LCD写数据函数*/ void write_date(uchar date){lcd_rw=0;} lcd_rs=1; P0=date; lcd_en=1; lcd_en=0; lcd_rw=0; lcd_rs=0; P0=com; lcd_en=1;lcd_en=0;/**************************************************/ /*LCD清屏函数*/ void clear_screen(uchar screen){int x,y; select_screen(screen); for(x=0xb8;x<0xc0;x++) { } write_com(x);write_com(lcd_col); for(y=0;y<64;y++) { } write_date(0x00);}/**************************************************//*LCD初始化*/void lcd_init(){duan=0;}/**************************************************//*年、月、日、星期、时间初始化*/void data_init(){}/**************************************************//*LCD显示汉字函数*/void lcd_display_hanzi(uchar screen,uchar row,uchar col,uint mun){ /*screen:选择屏幕参数,0:全屏、1:左屏、2:右屏。
12864LCD电子钟说明文档
void lcm_w_test(bit start, unsigned char ddata) {
unsigned char start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //0:写指令
else
start_data=0xfa; //1:写数据
while(*str != '\0'){ lcm_w_test(1,*str++);
} *str = 0; } /******************************************************************************/
2. 仿制说明
Doyoung 电子技术 将无条件共享原理图、说明文档、HEX 文件供有兴趣的朋友仿制使用。如您 成功仿制本设计,至信 @,即可获得本制作品的源代码,用于学习或升级 升级开发。如果您成功升级了一次程序将可以获得 Doyoung现在制作品的所有源代码包(不包括 日后制作品)。目的只有一个,力图创造独立资料。
按键 3:下一项 按键 4:减 1
按键 1:退出 按键 2:加 1
[Esc] 2007 [Next] 2 月 14 日 星期五
23:34.10 23.5℃ [+] 调整日期 [-]
按键 3:下一项 按键 4:减 1
按键 1:退出 按键 2:加 1
[Esc] 2007 [Next] 2 月 14 日 星期五
[Esc] 2007 [Next] 2 月 14 日 星期五
23:34.10 23.5℃ [+] 调整分钟 [-]
Байду номын сангаас
按键 3:下一项 按键 4:减 1
用PG12864LCD设计的指针式电子钟
毕业设计题目用PG12864LCD设计的指针式电子钟物理与电信工程学院所在院(系) 专业班级电子信息科学与技术指导教师完成地点目录引言 .................................................. 1 1 1 设计任务及方案论证设计任务及方案论证 ..................................1 1.1设计任务与要求设计任务与要求 ..................................... ..................................... 1 1 1.2 1.2 总体方案论证与设计总体方案论证与设计总体方案论证与设计 ................................. (11)2系统硬件设置 (1)2.1 STC89C51单片机简介单片机简介 ................................ ................................ 1 2.2显示模块设计显示模块设计 ....................................... ....................................... 4 42.2.1 PG12864LCD 的特性介绍的特性介绍 ......................... ......................... 4 2.2.2 LCD12864引脚介绍引脚介绍 ............................. ............................. 4 2.2.3 12864内部功能器件及相关功能内部功能器件及相关功能 .................. .................. 5 2.2.4 12864液晶与单片机接口电路液晶与单片机接口电路 .................... .................... 7 2.3设置模块设置模块 ........................................... ........................................... 8 8 2.4 2.4 振荡电路振荡电路振荡电路 ........................................... .......................................... 9 92.5 2.5 复位电路复位电路复位电路 .......................................... (99)3系统软件设计 (9)3.1总体软件设计总体软件设计 ....................................... ....................................... 9 9 3.2 3.2 时钟函数模块时钟函数模块时钟函数模块 ...................................... ...................................... 10 10 3.3 3.3 指针时钟设计指针时钟设计指针时钟设计 ...................................... ...................................... 11 113.3.1 实现功能实现功能 ..................................... 11 113.3.2实现算法实现算法 ..................................... ..................................... 11 11 3.3.3 3.3.3 函数设计函数设计函数设计 ..................................... ..................................... 13 13 3.4 3.4 显示函数模块显示函数模块显示函数模块 ...................................... ...................................... 15 153.4.1实现功能实现功能 ..................................... ..................................... 17 17 3.4.2 3.4.2 函数设计函数设计函数设计 ..................................... ..................................... 17 17 3.5.1 3.5.1 功能功能功能 ......................................... ........................................ 18 18 3.5.2 3.5.2 函数函数函数 ......................................... ........................................ 18 18 3.6主函数模块主函数模块 ........................................ . (1919)4.4.设计结果设计结果........................................... 19 5.5.使用方法使用方法........................................... 20 6.6.设计进度设计进度........................................... 20 7.7.教学单位可以提供的条件教学单位可以提供的条件 ............................. 20 致谢 ................................................. 21 参考文献 (21)用PG12864LCD设计的指针式电子钟[摘要]本设计采用的是STC89C51单片机,通过单片机内部定时器定时实现时钟定时计数功能,并以模拟时钟的形式显示在LCD_12864上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序已全部通过硬件测试,请放心使用。
(没有使用到DS1302)/************12864时钟显示函数*************//******实现时间走动、按键控制、蜂鸣器闹铃、温度显示******/#include<reg52.h>#include <stdio.h>#define uchar unsigned char#define uint unsigned int/******************** 功能:定义液晶12864控制端接口*********************/sbit rs=P2^6;// 注意:rw 控制端始终为低电平,直接在硬件上接低电平sbit en=P2^7;sbit wd=P2^0; //温度传感器信号线/******************** 功能:定义蜂鸣器、按键接口*********************/sbit beet=P2^2; //蜂鸣器定义sbit key1=P1^0; //功能选择sbit key2=P1^1; //至加sbit key3=P1^2; //至减sbit key4=P1^3; //北京时间与闹钟时间画面切换/******************** 功能:定义数据初始值******************************/char hour=23,minute=59,second=58,count=0;char shi=0,fen=0,miao=0,hm;int years=2012;char month=12,day=30,mm=0,cc=7;uint temp;float f_temp;/******************** 功能:定义数组字符串*********************/uchar code table1[]={" 幸福牌电子钟"};uchar code table2[]={"温馨提示:00.0℃"};/******************** 功能:延时函数***************************/void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/******************* 功能:蜂鸣器响应***********************/void fengmingqi(){beet=0;delay(1);beet=1;delay(1);}/******************** 功能:液晶12864读写数据******************/void xieling_shu(uchar aa,uchar bb){if(aa==1){rs=0;}if(aa==0){rs=1;}P0=bb;delay(1);en=1; delay(1);en=0; delay(1);}/******************** 功能:液晶12864写入地址******************/void xieludizhi(uchar x, uchar y){switch(x){case 1: xieling_shu(1,0x80 + y ); return;//return 返回的意思case 2: xieling_shu(1,0x90 + y ); return;case 3: xieling_shu(1,0x88 + y ); return;case 4: xieling_shu(1,0x98 + y ); return;}}/******************** 功能:液晶12864写入字符串*****************/void xiezifuchuan(uchar *dd){while(*dd != '\0'){xieling_shu(0,*dd++ );}}/******************** 功能:液晶12864清屏函数*********************/void qingping(){xieling_shu(1,0x01); //清屏xieling_shu(1,0x01); //清屏xieling_shu(1,0x01); //清屏delay(20);}/******************** 功能:液晶12864初始化指令操作******************/void init_12864(){xieling_shu(1,0x30); //基本指令操作xieling_shu(1,0x30); //基本指令操作xieling_shu(1,0x0C); //0x0c: 无光标,OXOF: 光标反白显示xieling_shu(1,0x01); //清屏xieling_shu(1,0x06);}/******************** 功能:液晶12864初始化字串显示******************/void init_zifu(){xieludizhi(1,0);xiezifuchuan(" 欢迎使用"); delay(1);xieludizhi(2,0);xiezifuchuan(" 幸福牌电子钟"); delay(1);xieludizhi(3,0);xiezifuchuan(" 订购热线"); delay(1);xieludizhi(4,0);xiezifuchuan("Phone:0777-66914"); delay(9534);qingping();xieludizhi(1,0);xiezifuchuan(table1); delay(1);xieludizhi(4,0);xiezifuchuan(table2); delay(1);xieludizhi(3,5);xiezifuchuan("星期");xieludizhi(2,2);xiezifuchuan("年月日");}/******************* 功能:时间、年月日显示函数********************/void display(){xieludizhi(3,0); // 显示时分秒xieling_shu(0,0x30+hour/10);xieling_shu(0,0x30+hour%10);xieling_shu(0,':');xieling_shu(0,0x30+minute/10);xieling_shu(0,0x30+minute%10);xieling_shu(0,':');xieling_shu(0,0x30+second/10);xieling_shu(0,0x30+second%10);xieludizhi(2,0); // 显示年xieling_shu(0,0x30+years/1000);xieling_shu(0,0x30+years%1000/100);xieling_shu(0,0x30+years%100/10);xieling_shu(0,0x30+years%10);xieludizhi(2,3); // 显示月xieling_shu(0,0x30+month/10);xieling_shu(0,0x30+month%10);xieludizhi(2,5); // 显示日xieling_shu(0,0x30+day/10);xieling_shu(0,0x30+day%10);}/******************* 功能:闹钟(时间、年月日)显示函数********************/void display1(){xieludizhi(3,0); // 显示时分秒xieling_shu(0,0x30+shi/10);xieling_shu(0,0x30+shi%10);xieling_shu(0,':');xieling_shu(0,0x30+fen/10);xieling_shu(0,0x30+fen%10);xieling_shu(0,':');xieling_shu(0,0x30+miao/10);xieling_shu(0,0x30+miao%10);xieludizhi(2,0); // 显示年xieling_shu(0,0x30+years/1000);xieling_shu(0,0x30+years%1000/100);xieling_shu(0,0x30+years%100/10);xieling_shu(0,0x30+years%10);xieludizhi(2,3); // 显示月xieling_shu(0,0x30+month/10);xieling_shu(0,0x30+month%10);xieludizhi(2,5); // 显示日xieling_shu(0,0x30+day/10);xieling_shu(0,0x30+day%10);}/******************* 功能:星期函数*********************************/void xingqi(){switch(cc){case 1: xieludizhi(3,7); xiezifuchuan("一"); return;case 2: xieludizhi(3,7); xiezifuchuan("二"); return;case 3: xieludizhi(3,7); xiezifuchuan("叁"); return;case 4: xieludizhi(3,7); xiezifuchuan("四"); return;case 5: xieludizhi(3,7); xiezifuchuan("五"); return;case 6: xieludizhi(3,7); xiezifuchuan("六"); return;case 7: xieludizhi(3,7); xiezifuchuan("日"); return;}}/******************* 功能:按键程序*******************/void anjian(){if(key4==0){delay(1);hm=~hm;while(key4==0);} /******************* 功能:key1按键选择功能*******************/if(key1==0){delay(1);mm++;if(hm!=0){if(mm>=4)mm=0;}if(mm==1){xieludizhi(3,3);xieling_shu(0,0x5f);}if(mm==2){TR0=1;xieludizhi(3,2);xieling_shu(0,0x5f);}if(mm==3){xieludizhi(3,0);xieling_shu(0,0x5f);}if(mm==4){xieludizhi(2,5);xieling_shu(0,0x5f);}if(mm==5){xieludizhi(2,3);xieling_shu(0,0x5f);}if(mm==6){xieludizhi(2,1);xieling_shu(0,0x5f);}if(mm==7){xieludizhi(3,7);xieling_shu(0,0x5f);}if(mm==8){xieludizhi(2,7);xieling_shu(0,0x02);} if(mm>=9){xieludizhi(2,7);xieling_shu(0,0x20);mm=0;} // mm=0;跳出调整时间while(key1==0);}/******************* 功能:key2按键加减功能*******************/if(mm==1&&key2==0) //秒加1{if(hm==0){TR0=0;delay(1);if(key2==0){second++;if(second>=60){second=0;}}} if(hm!=0){delay(1);if(key2==0){miao++;if(miao>=60){miao=0;}}}while(key2==0);}if(mm==1&&key3==0) //秒减1{if(hm==0){TR0=0;delay(1);if(key3==0){second--;if(second<=-1){second=59;}}} if(hm!=0){delay(1);if(key3==0){miao--;if(miao<=-1){miao=59;}}}while(key3==0);}if(mm==2&&key2==0) //分加1{if(hm==0){delay(1);if(key2==0){minute++;if(minute>=60){minute=0;}}} if(hm!=0){delay(1);if(key2==0){fen++;if(fen>=60){fen=0;}}}while(key2==0);}if(mm==2&&key3==0) //分减1{if(hm==0){delay(1);if(key3==0){minute--;if(minute<=-1){minute=59;}}} if(hm!=0){delay(1);if(key3==0){fen--;if(fen<=-1){fen=59;}}}while(key3==0);}if(mm==3&&key2==0) //时加1{if(hm==0){delay(1);if(key2==0){hour++;if(hour>=24){hour=0;}}} if(hm!=0){delay(1);if(key2==0){shi++;if(shi>=24){shi=0;}}}while(key2==0);}if(mm==3&&key3==0) //时减1{if(hm==0){delay(1);if(key3==0){hour--;if(hour<=-1){hour=23;}}} if(hm!=0){delay(1);if(key3==0){shi--;if(shi<=-1){shi=23;}}}while(key3==0);}if(mm==4&&key2==0) //日加1{delay(1);if(key2==0){day++;if(day>=31){day=1;}}while(key2==0);}if(mm==4&&key3==0) //日减1{delay(1);if(key3==0){day--;if(day<=0){day=31;}}while(key3==0);}if(mm==5&&key2==0) //月加1{delay(1);if(key2==0){month++;if(month>=13){month=1;}}while(key2==0);}if(mm==5&&key3==0) //月减1{delay(1);if(key3==0){month--;if(month<=0){month=12;}}while(key3==0);}if(mm==6&&key2==0) //年加1{delay(1);if(key2==0){years++;}// 不设置年限while(key2==0);}if(mm==6&&key3==0) //年减1{delay(1);if(key3==0){years--;}while(key3==0);}if(mm==7&&key2==0) //星期加1{delay(1);if(key2==0){cc++;if(cc>=8){cc=1;}}while(key2==0);}if(mm==7&&key3==0) //星期减1{delay(1);if(key3==0){cc--;if(cc==0){cc=7;}}while(key3==0);}}/********************************************************************************************************************** 功能:18B20 所有函数************************************//******************* 18B20复位,初始化函数**************************/void dsreset(void){uint i;wd=0;i=103;while(i>0)i--;wd=1;i=4;while(i>0)i--;}/******************* 18B20 读1位函数**************************/bit tempreadbit(void){uint i;bit dat;wd=0;i++; //i++ 起延时作用wd=1;i++;i++;dat=wd;i=8;while(i>0)i--;return (dat);}/******************* 18B20 读1个字节函数**************************/uchar tempread(void){uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里}return(dat);}/******************* 18B20 写一个字节数据函数**************************/void tempwritebyte(uchar dat){uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //写 1{wd=0;i++;i++;wd=1;i=8;while(i>0)i--;}else{wd=0; //写0i=8;while(i>0)i--;wd=1;i++;i++;}}}/******************* 18B20 开始获取温度并转换函数**************************/void tempchange(void){dsreset();delay(1);tempwritebyte(0xcc); // 写跳过读ROM指令tempwritebyte(0x44); // 写温度转换指令}/******************* 18B20 读取寄存器中存储的温度数据函数**************************/uint get_temp(){uchar a,b;dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread(); //读低8位b=tempread(); //读高8位temp=b;temp<<=8; //两个字节组合为1个字temp=temp|a;f_temp=temp*0.0625; //温度在寄存器中为12位分辨率位0.0625°temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入f_temp=f_temp+0.05;return temp; //temp是整型}/******************* 18B20 发送数据函数**************************/void comm(char *parr){do{SBUF = *parr++; //发送数据while(!TI); //等待发送完成标志为1TI =0; //标志清零}while(*parr); //保持循环直到字符为'\0'}/************************ 功能:主函数****************************/void main(){ uchar buff[4];TMOD=0x01; // 设置T0为工作方式 1EA=1;ET0=1;TR0=1; //开启T0中断TH0=-50000/256;TL0=-50000%256;init_12864();init_zifu();hm=0;while(1){ if(count>5&&count<18){tempchange(); //开始获取温度get_temp(); //读取寄存温度sprintf(buff,"%f",f_temp);comm(buff);xieludizhi(4,5);xieling_shu(0,0x30+ temp/100);xieling_shu(0,0x30+temp%100/10);xieling_shu(0,0x2e);xieling_shu(0,0x30+temp%100%10);}if(hm==0)display(); // 如果hm=0 显示北京时间,否则显示闹钟时间else display1();anjian(); // 按键判断xingqi(); // 显示星期if(minute==59&&second==59){fengmingqi();} // 整点报时if(shi==hour&&fen==minute&&miao>=second&&miao<=second+3){fengmingqi();}// 闹钟}}/************************ 功能:中断函数**************************/void time() interrupt 1{TH0=-50000/256;TL0=-50000%256;count++;if(count==20){count=0;second++;if(second==60){second=0;minute++;if(minute==60){minute=0;hour++;if(hour==24){hour=0;day++;cc++;if(cc==8) cc=1;if(day==31){day=1;month++;if(month==13){month=1;years++;}}}}}}}。