




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
#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#define mon_addr_pos 0x03#define yer_addr_pos 0x01#define wek_addr_pos 0x02#definesbl_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,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;sbit 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 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 readmonth(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 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_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_DS1302(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();/读出十进制数,提供给按键进行数据的+/-的处理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;/负温度时处理,原数取反再加1elsesymbol=0xfe;/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);elsedisplay_18B20_err();void delay_us(uint us)while(us-);void delay_ms(uint ms)uchar i;while(ms-)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 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_command(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_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(); 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);/NWPwrite_DS1302(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)+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(third_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:write_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 minute;/*读出小时的十进制数*/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=(dat&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_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(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)=30)day=1;/month+;elseif(day=29)day=1;/month+;if(month=4|month=6|month=9|month=11)if(day=31)day=1;/month+;write_date(day_addr_pos,day);delay_ms(5);write_command(first_line+day_addr_pos);delay_ms(5);break;case 2:month+;if(month=13)month=1;write_date(mon_addr_pos,month);delay_ms(5);write_command(first_line+mon_addr_pos);delay_ms(5);break;case 1:year+;if(year=100)year=0;write_date(yer_addr_pos,year);delay_ms(5);write_command(first_line+yer_addr_pos);delay_ms(5);break;if(key_3=0)delay_ms(5);if(key_3=0)while(!key_3);switch(mode_cnt)case 6:second-;if(second0)second=59;write_time(sec_addr_pos,second);delay_ms(5);/write_command(second_line+11);write_command(second_line+sec_addr_pos);delay_ms(5);break;case 5:minute-;if(minute0)minute=59;write_time(min_addr_pos,minute);delay_ms(5);/write_command(second_line+8);write_command(second_line+min_addr_pos);delay_ms(5);break;case 4:hour-;if(hour0)hour=23;write_time(hor_addr_pos,hour);delay_ms(5);/write_command(second_line+5);write_command(second_line+hor_addr_pos);delay_ms(5);break;case 7:week-;if(week=0)week=7;write_week(week);delay_ms(5);write_command(third_line+wek_addr_pos);delay_ms(5);break;case 3:day-;if(month=1|month=3|month=5|month=7|month=8|month=10|month=12)if(day=0)day=31;/month+;if(month=2)if(year+2000)%4=0&(year+2000)%100!=0|(year+2000)%400=0)if(day=0)day=29;/month+;elseif(day=0)day=28;/month+;if(month=4|month=6|month=9|month=11)if(day=0)day=30;/month+;write_date(day_addr_pos,day);delay_ms(5);write_command(first_line+day_addr_pos);delay_ms(5);break;case 2:month-;if(month=0)month=12;write_date(mon_addr_pos,month);delay_ms(5);write_command(first_line+mon_addr_pos);delay_ms(5);break;case 1:year-;if(year0)year=99;write_date(yer_addr_pos,year);delay_ms(5);write_command(first_line+yer_addr_pos);delay_ms(5);break;void DS18B20_write_byte(uchar byte)uchar i=0;for(i=0;i=1;delay_us(5);uchar DS18B20_read_byte(void)uchar i,temp=0;for(i=0;i=1;DQ=1;if(DQ)temp=temp|0x80;d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教版七年级生物下册 第2章 第2节 消化和吸收 说课稿
- 汽轮机和水轮机检修工成本预算考核试卷及答案
- 桥式起重机司机转正考核试卷及答案
- 水面保洁员招聘考核试卷及答案
- 飞机管工设备调试考核试卷及答案
- 民族弹拨乐器制作工招聘考核试卷及答案
- 八年级英语下册 Unit 6 An old man tried to move the mountains第五课时 Self Check说课稿(新版)人教新目标版
- 教师招聘之《幼儿教师招聘》考前冲刺练习试题附答案详解(轻巧夺冠)
- 7.2 图形的运动与坐标教学设计-2025-2026学年初中数学青岛版2024八年级上册-青岛版2024
- 2025年康复医学康复评估技能模拟测试卷答案及解析
- 2025-2026学年人教鄂教版(2024)小学科学三年级上册(全册)教学设计(附目录P137)
- 2025年药典考试题大库及答案
- (高清版)T∕CES 243-2023 《构网型储能系统并网技术规范》
- 2025年人教版(2024)小学信息科技四年级(全一册)教学设计(附教材目录 P208)
- 急诊急救护理教学课件
- 最新医疗安全十八项核心制度课件
- 住宅小区供配电系统设计课件
- 社保费和非税收入课件
- “三高”讲座-课件
- 年产12000吨水合肼(100%)项目环评报告书
- 普通冲床设备日常点检标准作业指导书
评论
0/150
提交评论