ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:20.09KB ,
资源ID:9134827      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9134827.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(智能电子钟源程序.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

智能电子钟源程序.docx

1、智能电子钟源程序#include#define uint unsigned int#define uchar unsigned char#define yh 0x80 #define er 0x80+0x40 uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp; uint tem;float f_tem; /液晶屏的与C51之间的引脚连接定义sbit rs=P20;sbit en=P22;sbit rw=P21;/如果硬件上rw接地,就不用写这句和后面的rw=0了 sbit IO=P11;sbit SCLK=P10;sbit RST=P1

2、2;sbit led=P26;/LED背光开关sbit ACC0=ACC0;sbit ACC7=ACC7;/校时按键与C51的引脚连接定义sbit key1=P15;/设置键sbit key2=P16;/加键sbit key3=P17;/减键sbit buzzer=P13;/蜂鸣器,通过三极管9012驱动,端口低电平响/ds18b20芯片与c51之间的引脚连接定义sbit tem_ds=P33; uchar code tab1=20 - - ;/年显示的固定字符uchar code tab2= : : ;/时间显示的固定字符void delay(uint xms)/延时函数,有参函数 uint

3、 x,y; for(x=xms;x0;x-) for(y=110;y0;y-);/*ds18b20芯片有关子程序*/void DS18B20_init() uint i; tem_ds=0; i=160; while(i0) i-; tem_ds=1; i=8; while(i0) i-; void temwritebit(uchar instruc_data) int time; if(instruc_data) tem_ds=0; time=3;/延时14us while(time0) time-; tem_ds=1;/写1 time=8;/延时35us while(time0) time

4、-; else tem_ds=0; time=14;/延时62us while(time0) time-; tem_ds=1;/释放数据线 time+;time+;uchar temreadbit() uint i; bit datbit; tem_ds=0; i+; tem_ds=1; i+;i+; datbit=tem_ds;/读数据 i=10;/延时45 while(i0) i-; tem_ds=1; return(datbit); uchar temreadbyte() uchar i,j,dat; dat=0; for(i=0;i8;i+) j=temreadbit() ; dat=

5、(j1); return(dat); void temwritebyte(uchar instru) int i; for(i=0;i=1; uint get_tem()/采集温度 uchar tem_L,tem_H; DS18B20_init(); temwritebyte(0xcc); temwritebyte(0x44); delay(1); temwritebyte(0xcc);/写跳过ROM指令; temwritebyte(0xbe); /读数据 tem_L=temreadbyte(); tem_H=temreadbyte(); tem=tem_H8|tem_L; f_tem=tem

6、*0.0625;/得到真实的十进制温度值 tem=f_tem; return (tem);/液晶写入指令函数与写入数据函数void write_1602com(uchar com)/*液晶写入指令函数* rs=0;/数据/指令选择置为指令 rw=0;/读写选择置为写 P0=com;/送入数据 delay(1); en=1;/拉高使能端,为制造有效的下降沿做准备 delay(1); en=0;/en由高变低,产生下降沿,液晶执行命令void write_1602dat(uchar dat)/*液晶写入数据函数* rs=1;/数据/指令选择置为数据 rw=0;/读写选择置为写 P0=dat;/送入

7、数据 delay(1); en=1;/en置高电平,为制造下降沿做准备 delay(1); en=0;/en由高变低,产生下降沿,液晶执行命令void lcd_init()/*液晶初始化函数* write_1602com(0x38);/设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据 write_1602com(0x01);/清显示 write_1602com(0x06);/整屏不移动,光标自动右移 write_1602com(yh+1);/日历显示固定符号从第一行第1个位置之后开始显示 write_1602com(0x0c);/开显示不显示光标 for(a=0;a14;a+) w

8、rite_1602dat(tab1a);/向液晶屏写日历显示的固定符号部分 delay(3); write_1602com(er+2);/时间显示固定符号写入位置,从第2个位置后开始显示 for(a=0;a0;a-) IO=ACC0; SCLK=0; SCLK=1; ACC=ACC1; uchar read_byte()/读一个字节 RST=1; for(a=8;a0;a-) ACC7=IO; SCLK=1; SCLK=0; ACC=ACC1; return (ACC);/*void write_1302(uchar add,uchar dat)/向1302芯片写函数,指定写入地址,数据 RS

9、T=0; SCLK=0; RST=1; write_byte(add); write_byte(dat); SCLK=1; RST=0;uchar read_1302(uchar add)/从1302读数据函数,指定读取数据来源地址 uchar temp; RST=0; SCLK=0; RST=1; write_byte(add); temp=read_byte(); SCLK=1; RST=0; return(temp);uchar BCD_Decimal(uchar bcd)/BCD码转十进制函数,输入BCD,返回十进制 uchar Decimal; Decimal=bcd4; retur

10、n(Decimal=Decimal*10+(bcd&=0x0F);/*void ds1302_init()/1302芯片初始化子函数(2010-01-07,12:00:00,week4) RST=0; SCLK=0; write_1302(0x8e,0x00);/允许写,禁止写保护 write_1302(0x80,0x00);/向DS1302内写秒寄存器80H写入初始秒数据00 write_1302(0x82,0x00);/向DS1302内写分寄存器82H写入初始分数据00 write_1302(0x84,0x12);/向DS1302内写小时寄存器84H写入初始小时数据12 write_130

11、2(0x8a,0x05);/向DS1302内写周寄存器8aH写入初始周数据4 write_1302(0x86,0x09);/向DS1302内写日期寄存器86H写入初始日期数据07 write_1302(0x88,0x12);/向DS1302内写月份寄存器88H写入初始月份数据01 write_1302(0x8c,0x11);/向DS1302内写年份寄存器8cH写入初始年份数据10 write_1302(0x8e,0x80);/打开写保护/温度显示子函数void write_temp(uchar add,uchar dat)/向LCD写温度数据,并指定显示位置 uchar gw,sw; gw=d

12、at%10;/个位 sw=dat/10;/十位 write_1602com(er+add);/er是头文件规定的值0x80+0x40 write_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);/数字+30得到该数字的LCD1602显示码 write_1602dat(0xdf);/显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码 write_1602dat(0x43);/显示C符号,0x43是液晶屏字符库里大写C的地址码 /时分秒显示子函数void write_sfm(uchar add,uchar dat

13、)/向LCD写时分秒,有显示位置加、现示数据,两个参数 uchar gw,sw; gw=dat%10;/取得个位数字 sw=dat/10;/取得十位数字 write_1602com(er+add);/er是头文件规定的值0x80+0x40 write_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);/数字+30得到该数字的LCD1602显示码 /年月日显示子函数void write_nyr(uchar add,uchar dat)/向LCD写年月日,有显示位置加数、显示数据,两个参数 uchar gw,sw; gw=

14、dat%10;/取得个位数字 sw=dat/10;/取得十位数字 write_1602com(yh+add);/设定显示位置为第一个位置+add write_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);/数字+30得到该数字的LCD1602显示码 void write_week(uchar week)/写星期函数 write_1602com(yh+0x0c);/星期字符的显示位置 switch(week) case 1:write_1602dat(M);/星期数为1时,显示 write_1602dat(O); w

15、rite_1602dat(N); break; case 2:write_1602dat(T);/星期数据为2时显示 write_1602dat(U); write_1602dat(E); break; case 3:write_1602dat(W);/星期数据为3时显示 write_1602dat(E); write_1602dat(D); break; case 4:write_1602dat(T);/星期数据为4是显示 write_1602dat(H); write_1602dat(U); break; case 5:write_1602dat(F);/星期数据为5时显示 write_1

16、602dat(R); write_1602dat(I); break; case 6:write_1602dat(S);/星期数据为6时显示 write_1602dat(T); write_1602dat(A); break; case 7:write_1602dat(S);/星期数据为7时显示 write_1602dat(U); write_1602dat(N); break;/*键盘扫描函数*/void keyscan() if(key1=0)/key1为功能键(设置键) delay(9);/延时,用于消抖动 if(key1=0)/延时后再次确认按键按下 buzzer=0;/蜂鸣器短响一次

17、 delay(20); buzzer=1; while(!key1);/按键等待释放 key1n+; if(key1n=9) key1n=1;/设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环 switch(key1n) case 1: TR0=0;/关闭定时器 /TR1=0; write_1602com(er+0x09);/设置按键按动一次,秒位置显示光标 write_1602com(0x0f);/设置光标为闪烁 temp=(miao)/10*16+(miao)%10;/秒数据写入DS1302 write_1302(0x8e,0x00); write_1302(0x80,0x80

18、|temp);/miao write_1302(0x8e,0x80); break; case 2: write_1602com(er+6);/按2次fen位置显示光标 /write_1602com(0x0f); break; case 3: write_1602com(er+3);/按动3次,shi /write_1602com(0x0f); break; case 4: write_1602com(yh+0x0e);/按动4次,week /write_1602com(0x0f); break; case 5: write_1602com(yh+0x0a);/按动5次,ri /write_1

19、602com(0x0f); break; case 6: write_1602com(yh+0x07);/按动6次,yue /write_1602com(0x0f); break; case 7: write_1602com(yh+0x04);/按动7次,nian /write_1602com(0x0f); break; case 8: write_1602com(0x0c);/按动到第8次,设置光标不闪烁 TR0=1;/打开定时器 temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00); write_1302(0x80,0x00|temp);/m

20、iao数据写入DS1302 write_1302(0x8e,0x80); break; /*加键key2*/ if(key1n!=0)/当key1按下以下。再按以下键才有效(按键次数不等于零) if(key2=0)/上调键 delay(10); if(key2=0) buzzer=0;/蜂鸣器短响一次 delay(20); buzzer=1; while(!key2); switch(key1n) case 1:miao+;/设置键按动1次,调秒 if(miao=60) miao=0; write_sfm(0x08,miao); temp=(miao)/10*16+(miao)%10; wri

21、te_1302(0x8e,0x00); write_1302(0x80,temp); write_1302(0x8e,0x80); write_1602com(er+0x09); /write_1602com(0x0b); break; case 2:fen+; if(fen=60) fen=0; write_sfm(0x05,fen); temp=(fen)/10*16+(fen)%10; write_1302(0x8e,0x00); write_1302(0x82,temp); write_1302(0x8e,0x80); write_1602com(er+6); break; case

22、3:shi+; if(shi=24) shi=0; write_sfm(2,shi); temp=(shi)/10*16+(shi)%10; write_1302(0x8e,0x00); write_1302(0x84,temp); write_1302(0x8e,0x80); write_1602com(er+3); break; case 4:week+; if(week=8) week=1; write_1602com(yh+0x0C) ; write_week(week); temp=(week)/10*16+(week)%10; write_1302(0x8e,0x00); writ

23、e_1302(0x8a,temp); write_1302(0x8e,0x80); write_1602com(yh+0x0e); break; case 5:ri+; if(ri=32) ri=1; write_nyr(9,ri); temp=(ri)/10*16+(ri)%10; write_1302(0x8e,0x00); write_1302(0x86,temp); write_1302(0x8e,0x80); write_1602com(yh+10); break; case 6:yue+; if(yue=13) yue=1; write_nyr(6,yue); temp=(yue)

24、/10*16+(yue)%10; write_1302(0x8e,0x00); write_1302(0x88,temp); write_1302(0x8e,0x80); write_1602com(yh+7); break; case 7:nian+; if(nian=100) nian=0; write_nyr(3,nian); temp=(nian)/10*16+(nian)%10; write_1302(0x8e,0x00); write_1302(0x8c,temp); write_1302(0x8e,0x80); write_1602com(yh+4); break; /*减键ke

25、y3,各句功能参照加键注释*/ if(key3=0) delay(10);/调延时,消抖动 if(key3=0) buzzer=0;/蜂鸣器短响一次 delay(20); buzzer=1; while(!key3); switch(key1n) case 1:miao-; if(miao=-1) miao=59; write_sfm(0x08,miao); temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00); write_1302(0x80,temp); write_1302(0x8e,0x80); write_1602com(er+0x09

26、); /write_1602com(0x0b); break; case 2:fen-; if(fen=-1) fen=59; write_sfm(5,fen); temp=(fen)/10*16+(fen)%10; write_1302(0x8e,0x00); write_1302(0x82,temp); write_1302(0x8e,0x80); write_1602com(er+6); break; case 3:shi-; if(shi=-1) shi=23; write_sfm(2,shi); temp=(shi)/10*16+(shi)%10; write_1302(0x8e,0

27、x00); write_1302(0x84,temp); write_1302(0x8e,0x80); write_1602com(er+3); break; case 4:week-; if(week=0) week=7; write_1602com(yh+0x0C); write_week(week); temp=(week)/10*16+(week)%10; write_1302(0x8e,0x00); write_1302(0x8a,temp); write_1302(0x8e,0x80); write_1602com(yh+0x0e); break; case 5:ri-; if(ri=0) ri=31; write_nyr(9,ri); temp=(ri)/10*16+(ri)%10;/十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);/允许写,禁止写保护 writ

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1