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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

基于51单片机的DS1302+LCD12864+DS18B20小综合.docx

1、基于51单片机的DS1302+LCD12864+DS18B20小综合#include#include#define uint unsigned int#define uchar unsigned char#define first_line 0x80#define second_line 0x90#define third_line 0x88#define forth_line 0x98#define sec_addr_pos 0x04#define min_addr_pos 0x02#define hor_addr_pos 0x00#define day_addr_pos 0x05#defi

2、ne mon_addr_pos 0x03#define yer_addr_pos 0x01#define wek_addr_pos 0x02#define sbl_addr_pos 0x04#define Tep_addr_pos 0x05#define Tmp_addr_pos 0x06uchar code line_one=2016年10月31日 ;uchar code line_two=14:22:45 ;uchar code line_three=星期五 - 23 ;uchar str_wek=一二三四五六日;char second,minute,hour,day,week,month

3、,year;uchar key_flag,mode_cnt;uint temperature,symbol;/用于存储DS18B20采集的整个数据uchar DS18B20_H;/用于存储DS18B20数据采集的整数部分uchar DS18B20_L;/用于存储DS18B20数据采集的小数部分uchar init_18B20_fail;sfr LCD_DATA=0x80;sbit LCD_EN=P27;sbit LCD_RS=P26;sbit LCD_RW=P25;sbit DS_CLK=P36;sbit DS_RST=P35;sbit DS_IO=P34;sbit ACC0=ACC0;sbi

4、t ACC7=ACC7;sbit key_1=P24;sbit key_2=P23;sbit key_3=P22;sbit DQ=P37; void delay_ms(uint ms);void delay_us(uint us);bit busy(void);void write_command(uchar command);void write_data(uchar dat);void lcd_pos(uchar x,uchar y);void LCD_init(void);void Input_1byte(uchar TD);uchar Output_1byte(void);uchar

5、Read_DS1302(uchar DS_ADD);void write_DS1302(uchar DS_ADD,uchar DS_DATE);void write_time(uchar addr,uchar num);uchar BCD_to_Dec(uchar num);void write_week(uchar num);void write_date(uchar addr,uchar num);uchar readsecond(void);uchar readminute(void);uchar readhour(void);uchar readday(void);uchar read

6、month(void);uchar readweek(void);uchar readyear(void);void readtime(void);void DS1302_init(void);void key_scan(void);uchar DS18B20_read_byte(void);void DS18B20_write_byte(uchar byte);uchar DS18B20_Init(void);uint read_temperature(void);void write_temp(uchar temp_h);void write_symbol(uchar addr,uchar

7、 symbol);void display_18B20_err(void);void main(void) key_flag=0; second=20; minute=30; hour=10; day=31; week=3; month=12; year=16; LCD_init(); /*while(1) write_date(day_addr_pos,day); write_date(mon_addr_pos,month); write_date(yer_addr_pos,year); write_time(sec_addr_pos,second); write_time(min_addr

8、_pos,minute); write_time(hor_addr_pos,hour); write_week(week); */ if(!(Read_DS1302(0x8E)&0x80) DS1302_init(); while(1) key_scan(); if(key_flag=0) second=Read_DS1302(0x81); write_time(sec_addr_pos,BCD_to_Dec(second); minute=Read_DS1302(0x83); write_time(min_addr_pos,BCD_to_Dec(minute); hour=Read_DS13

9、02(0x85); write_time(hor_addr_pos,BCD_to_Dec(hour); week=Read_DS1302(0x8B); write_week(week); day=Read_DS1302(0x87); write_date(day_addr_pos,BCD_to_Dec(day); month=Read_DS1302(0x89); write_date(mon_addr_pos,BCD_to_Dec(month); year=Read_DS1302(0x8D); write_date(yer_addr_pos,BCD_to_Dec(year); readtime

10、();/读出十进制数,提供给按键进行数据的+/-的处理 temperature=read_temperature(); init_18B20_fail=DS18B20_Init(); if(init_18B20_fail=0) /temperature=read_temperature(); if(temperature&0x8000)=0x8000)/判断读取的温度是正温度还是负温度 symbol=0x2D; /write_symbol(0x0A,0x2C);/显示负号 temperature=temperature+1;/负温度时处理,原数取反再加1 else symbol=0xfe; /

11、write_symbol(0x0A,0xfe);/不显示正号 /write_symbol(0x0A,symbol); DS18B20_H=(temperature4)&0x7f;/取温度读数的整数部分 DS18B20_L=temperature&0x0f;/取温度读数的小数部分 write_symbol(sbl_addr_pos,symbol); write_temp(DS18B20_H); else display_18B20_err(); void delay_us(uint us) while(us-);void delay_ms(uint ms) uchar i; while(ms-)

12、 for(i=250;i0;i-) _nop_(); _nop_(); _nop_(); _nop_(); bit busy(void) bit result; LCD_RS=0; LCD_RW=1; LCD_EN=1; result=(bit)(LCD_DATA&0x80); LCD_EN=0; return result;void write_command(uchar command) while(busy(); LCD_RS=0; LCD_RW=0; LCD_EN=1; delay_us(1); LCD_DATA=command; delay_us(1); LCD_EN=0;void

13、write_data(uchar dat) while(busy(); LCD_RS=1; LCD_RW=0; LCD_EN=1; delay_us(1); LCD_DATA=dat; delay_us(1); LCD_EN=0;void lcd_pos(uchar x,uchar y) uchar pos; if(x=0) x=0x80; else if(x=1) x=0x90; else if(x=2) x=0x88; else if(x=3) x=0x98; pos=x+y; write_command(pos);void LCD_init(void) uchar i; write_co

14、mmand(0x30); delay_ms(1); write_command(0x30); delay_ms(1); write_command(0x0C); delay_ms(1); write_command(0x01); delay_ms(1); write_command(0x06); delay_ms(1); write_command(first_line); for(i=0;i16;i+) write_data(line_onei); write_command(second_line); for(i=0;i16;i+) write_data(line_twoi); write

15、_command(third_line); for(i=0;i0;i-) DS_IO=ACC0; DS_CLK=1; DS_CLK=0; ACC=ACC1; uchar Output_1byte(void) uchar i; for(i=8;i0;i-) ACC=ACC1; ACC7=DS_IO; DS_CLK=1; DS_CLK=0; return(ACC);uchar Read_DS1302(uchar DS_ADD) uchar DS_INF; DS_RST=0; DS_CLK=0; DS_RST=1; Input_1byte(DS_ADD); DS_INF=Output_1byte()

16、; DS_CLK=1; DS_RST=0; return(DS_INF); void write_DS1302(uchar DS_ADD,uchar DS_DATE) DS_RST=0; DS_CLK=0; DS_RST=1; Input_1byte(DS_ADD); Input_1byte(DS_DATE); DS_CLK=1; DS_RST=0;void DS1302_init(void) second=57; minute=59; hour=23; day=30; month=3; week=5; year=16; write_DS1302(0x8E,0x00);/NWP write_D

17、S1302(0x80,(second/10)4|(second%10); write_DS1302(0x82,(minute/10)4|(minute%10); write_DS1302(0x84,(hour/10)4|(hour%10); write_DS1302(0x86,(day/10)4|(day%10); write_DS1302(0x88,(month/10)4|(month%10); write_DS1302(0x8A,(week/10)4|(week%10); write_DS1302(0x8C,(year/10)4; NUM_L=num&0x0f; NUM=(NUM_H*10

18、)+NUM_L; return NUM;void write_week(uchar num) uchar i; switch(num) case 1:write_command(third_line+wek_addr_pos); for(i=0;i2;i+) write_data(str_weki); delay_ms(5); break; case 2:write_command(third_line+wek_addr_pos); for(i=2;i4;i+) write_data(str_weki); delay_ms(5); break; case 3:write_command(thi

19、rd_line+wek_addr_pos); for(i=4;i6;i+) write_data(str_weki); delay_ms(5); break; case 4:write_command(third_line+wek_addr_pos); for(i=6;i8;i+) write_data(str_weki); delay_ms(5); break; case 5:write_command(third_line+wek_addr_pos); for(i=8;i10;i+) write_data(str_weki); delay_ms(5); break; case 6:writ

20、e_command(third_line+wek_addr_pos); for(i=10;i12;i+) write_data(str_weki); delay_ms(5); break; case 7:write_command(third_line+wek_addr_pos); for(i=12;i4)*10+(dat&0x0f); return second;/*读出分的十进制数*/uchar readminute(void) uchar dat; dat=Read_DS1302(0x83); minute=(dat&0x70)4)*10+(dat&0x0f); return minut

21、e;/*读出小时的十进制数*/uchar readhour(void) uchar dat; dat=Read_DS1302(0x85); hour=(dat&0x70)4)*10+(dat&0x0f); return hour;/*读出天的十进制数*/uchar readday(void) uchar dat; dat=Read_DS1302(0x87); day=(dat&0x70)4)*10+(dat&0x0f); return day;/*读出月的十进制数*/uchar readmonth(void) uchar dat; dat=Read_DS1302(0x89); month=(d

22、at&0x70)4)*10+(dat&0x0f); return month;/*读出周的十进制数*/uchar readweek(void) uchar dat; dat=Read_DS1302(0x8b); week=(dat&0x70)4)*10+(dat&0x0f); return week;/*读出年的十进制数*/uchar readyear(void) uchar dat; dat=Read_DS1302(0x8d); year=(dat&0xf0)4)*10+(dat&0x0f); return year;void key_scan(void) if(key_1=0) delay

23、_ms(5); if(key_1=0) while(!key_1); mode_cnt+; key_flag=1; write_DS1302(0x8E,0x00); write_DS1302(0x80,0x80); write_DS1302(0x8E,0x80); if(mode_cnt=8) key_flag=0; mode_cnt=0; write_command(0x0C); write_DS1302(0x8E,0x00); write_DS1302(0x80,0x00); write_DS1302(0x80,(second/10)4|(second%10); write_DS1302(

24、0x82,(minute/10)4|(minute%10); write_DS1302(0x84,(hour/10)4|(hour%10); write_DS1302(0x86,(day/10)4|(day%10); write_DS1302(0x88,(month/10)4|(month%10); write_DS1302(0x8A,(week/10)4|(week%10); write_DS1302(0x8C,(year/10)4|(year%10); /write_DS1302(0x80,0x00); write_DS1302(0x8E,0x80); switch(mode_cnt) case 7: write_

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

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