




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
#include#include/内含-NOP-函数#include#include/#include#define uchar unsigned char#define uint unsigned int int l=0;/*宏定义所需指令#define BASIC_SET 0x30#define EXTEND_SET 0x34#define DRAW_ON 0x36#define DRAW_OFF 0x34 unsigned char temp0=0x00;unsigned char TPH,TPL;xdata unsigned char a=哈尔滨理工大学;xdata unsigned char b=当前室温为:;unsigned char c=0000000000000000;uchar code str1=0x28,0x5E,0xAC,0x28,0x03,0x00,0x00,0xB9;/ROM1uchar code str2=0x28,0xFF,0xA8,0x68,0x04,0x00,0x00,0x57;/ROM2 sbit T = P11;sbit RS = P06;sbit RW = P36;sbit EN = P37;/sbit T10 = P05;void delay_1us(unsigned int x);/extern void delay_1us(); void delay_5us(); void delay_10us(); void delay_20us(); void delay_100us(); void delay_200us(); void DelayXus(unsigned char n); bit reset_DS18B20(); void writeByte_DS18B20(unsigned char x); unsigned char readByte_DS18B20(); void show_Temperature(uchar x); void DS18B20_show(uchar x); void init_DS18B20(); typedef unsigned char uint8;typedef char int8;typedef unsigned short uint16;typedef short int16;typedef unsigned long uint32;typedef long int32; unsignedcharExchange(unsignedcharch)unsignedcharTT=0x80;unsignedcharEE=0x01;unsignedcharTemp=0, i;for(i=0;i1;EE=EE1;return Temp;void delay1ms(uint ms)/延时1毫秒(不够精确的) uint i,j; for(i=0;ims;i+) for(j=0;j100;j+);voidDelay1(unsigned intn)unsigned inti;for(i=0;in;i+) _nop_();/*ms级延时函数void delay_1ms(uint x)uint i,j;for(j = 0;j x; j+)for(i = 0;i 110; i+); void LCD_write_command(unsigned char command) /Checkbusy();RS = 0;RW = 1;Delay1(10);RW = 0;EN=1; P2=Exchange(command); EN = 0; uchar read_dat(void)uchar temp;P2=0xff ; RS=1 ; RW=1 ; Delay1(25); EN=0 ; EN=1 ; temp=P2 ; EN=0 ;return Exchange(temp); /*写入一个字节的数据*/void LCD_write_byte(unsigned char ch) RS = 1;RW = 1; Delay1(10);RW = 0;EN = 1;P2=Exchange(ch);EN = 0;void LCD_write_line(unsigned char *ch, unsigned int LCD_line, unsigned char LCD_High) int str_len=0;intLCD_line_len=16;int i=0;unsigned char addr;str_len = strlen(ch);if(str_len16)/要显示的字符串可能大于16 ByteLCD_line_len = str_len;else;switch(LCD_line)case 1:/写入第一行addr = 0x80;break;case 2:/写入第二行addr = 0x90;break;case 3:/写入第三行addr = 0x88;break;case 4:/写入第四行addr = 0x98;break;default: break;LCD_write_command(addr+LCD_High);while(iLCD_line_len)LCD_write_byte(chi);i+;/*voidShowAncientPeom() LCD_write_command(0x30);LCD_write_command(0x01); Delay1(500);LCD_write_line(b,1,0);/LCD_write_line(a,1,4); /strcpy(d,g0); LCD_write_line(d,2,1);LCD_write_line(c1,3,0);LCD_write_line(a,4,0); */void LCD_init()unsigned char command;RS = 0;RW = 0;EN = 0;/command = 0x30;/LCD_write_command(command);command = 0x30;LCD_write_command(command);command = 0x0c;LCD_write_command(command);command = 0x01;LCD_write_command(command); command = 0x06;LCD_write_command(command); void delay_1us(unsigned int x)unsigned int i;x = x*5/4;for(i=0;ix;i+);void init_DS18B20()bit result;T = 1;delay_1us(5);/延迟几微秒T = 0;/单片机将单线总线信号拉低480-950 us,delay_1us(500);/然后释放总线(拉高电平)T = 1;delay_1us(20);/等待15-60 us 等待DS18B20输出脉冲 delay_1us(100);/DS18B20会持续输出60-240 us,/之后DS18B20会拉高电平,释放总线result = T;bit reset_DS18B20()bit flag;T = 0;DelayXus(240);DelayXus(240);/*delay_200us();delay_200us();delay_100us();delay_20us();*/T = 1;/delay_100us();/delay_20us();DelayXus(100);while(T);flag = T;/*delay_200us();delay_20us();delay_10us();delay_10us();*/DelayXus(240);DelayXus(180);/while(!T);/delay_100us();return(flag);/*void delay_1us() /STC11/10系列长调用LCALL花费6个时钟周期, /ret返回花费4个时钟周期_nop_();/NOP指令花费1个时钟周期_nop_(); */void delay_5us() _nop_();void delay_10us()delay_5us();_nop_();void delay_20us()delay_10us();delay_5us();_nop_();void delay_100us()delay_20us();delay_20us();delay_20us();delay_20us();delay_10us();delay_5us();_nop_();void delay_200us()delay_100us();delay_20us();delay_20us();delay_20us();delay_20us();delay_10us();delay_5us();_nop_();void writeByte_DS18B20(unsigned char dat)unsigned char i=0;for(i=0;i=1;unsigned char readByte_DS18B20()unsigned char i;for(i=0;i=1;T= 0; /单片机拉低信号,开始/_nop_();DelayXus(1);T = 1;/_nop_();DelayXus(1);if(T=1)temp0|=0x80;DelayXus(20);DelayXus(20);/delay_20us();/delay_20us();/等待控制器 开始在45us内采样return(temp0);/*void show_Temperature() int i=0; reset_DS18B20(); /设备复位 writeByte_DS18B20(0xCC); /跳过ROM命令 writeByte_DS18B20(0x44); /开始转换命令 while (!T); /等待转换完成 reset_DS18B20(); /设备复位 writeByte_DS18B20(0xCC); /跳过ROM命令 writeByte_DS18B20(0xBE); /读暂存存储器命令 TPL = readByte_DS18B20(); /读温度低字节 TPH = readByte_DS18B20(); /读温度高字节while(i20000)i+; DS18B20_show(); */void b20_Matchrom(uchar a) /匹配ROMchar j;writeByte_DS18B20(0x55); /发送匹配ROM命令if(a=1)for(j=0;j8;j+)writeByte_DS18B20(str1j);/发送18B20的序列号,先发送低字节 if(a=2)for(j=0;j8;j+)writeByte_DS18B20(str2j);/发送18B20的序列号,先发送低字节 void show_Temperature(uchar z)/*读取温度值并转换*/int i=0;reset_DS18B20(); writeByte_DS18B20(0xCC);/for(i=0;i8;i+)/ / str1i=readByte_DS18B20(); /读序列号reset_DS18B20(); if(z=1)b20_Matchrom(1); /匹配ROM 1if(z=2)b20_Matchrom(2); /匹配ROM 2writeByte_DS18B20(0x44);delay1ms(5);reset_DS18B20(); writeByte_DS18B20(0xCC);/读序列号reset_DS18B20(); if(z=1)b20_Matchrom(1); /匹配ROM 1if(z=2)b20_Matchrom(2);/匹配ROM 2 writeByte_DS18B20(0xBE); /*读取温度*/ TPL = readByte_DS18B20();TPH = readByte_DS18B20();/*tvalue=TPH;tvalue=8;tvalue=tvalue|TPL; if(tvalue0x0fff) tflag=0; else tvalue=tvalue+1;tflag=1; tt=tvalue*0.0625;tvalue=tt*10;return(tvalue);*/while(i20000)i+; DS18B20_show(z);/*向TPL TPH中的字在LCD上显示出来写1字节数据*/void DS18B20_show(uchar z)unsigned char temperature14;unsigned char temp1; /存放整数部分/unsigned char temp2; /存放小数部分uint16 temp3; /存放小数+整数unsigned char temp=Temp+000.0000;temperature0=+;temperature1=0;temperature2=0;temperature3=0;temperature4=0;temperature5=0;temperature6=0;temperature7=0;temperature8=.;temperature9=0;temperature10=0;temperature11=0;temperature12=0;temperature13=0;if(TPH&0xf8)temperature0=-;if(TPH&0x04)temperature1=1;if(TPH&0x02)temperature2=1;if(TPH&0x01)temperature3=1;if(TPL&0x80)temperature4=1;if(TPL&0x40)temperature5=1;if(TPL&0x20)temperature6=1;if(TPL&0x10)temperature7=1;if(TPL&0x08)temperature9=1;if(TPL&0x04)temperature10=1;if(TPL&0x02)temperature11=1;if(TPL&0x01)temperature12=1;/ 温度为 正负时 分别将其二进制数放进两个字节temp3=(0x0000|TPH)8)|TPL);/将TPL,TPH中的整数部分的数 /移到16位temp3中if(TPH&0xf8)temp4=-;temp3=temp3+0x0001; /将其转化成正数的二进制形式 else/temp1=(TPH&0x07)4);temp1 = (temp34)&0x007f;switch(temp1/100)/设置整数部分百位数字符 temp=温度+000.0000case 0x00:temp5=0;break;case 0x01:temp5=1;break;default:break;switch(temp1%100)/10)/设置整数部分十位数字符 temp=温度+000.0000case 0x00:temp6=0;break;case 0x01:temp6=1;break;case 0x02:temp6=2;break;case 0x03:temp6=3;break;case 0x04:temp6=4;break;case 0x05:temp6=5;break;case 0x06:temp6=6;break;case 0x07:temp6=7;break;case 0x08:temp6=8;break;case 0x09:temp6=9;break;default:break;switch(temp1%100)%10)/设置整数部分个位数字符 temp=温度+000.0000case 0x00:temp7=0;break;case 0x01:temp7=1;break;case 0x02:temp7=2;break;case 0x03:temp7=3;break;case 0x04:temp7=4;break;case 0x05:temp7=5;break;case 0x06:temp7=6;break;case 0x07:temp7=7;break;case 0x08:temp7=8;break;case 0x09:temp7=9;break;default:break;/设置小数部分 显示字符temp=温度+000.0000/temp1 = TPL&0x0f;temp1 = temp3&0x000f;switch(temp1)case 0x00:temp9=0;temp10=0;/0.0625*0temp11=0;temp12=0; break;case 0x01:temp9=0;temp10=6;/0.0625*1temp11=2;temp12=5; break;case 0x02:temp9=1;temp10=2;/0.0625*2temp11=5;temp12=0; break;case 0x03:temp9=1;temp10=8;/0.0625*3temp11=7;temp12=5; break;case 0x04:temp9=2;temp10=5;/0.0625*4temp11=0;temp12=0; break;case 0x05:temp9=3;temp10=1;/0.0625*5temp11=2;temp12=5; break;case 0x06:temp9=3;temp10=7;/0.0625*6temp11=5;temp12=0; break;case 0x07:temp9=4;temp10=3;/0.0625*7temp11=7;temp12=5; break;case 0x08:temp9=5;temp10=0;/0.0625*8temp11=0;temp12=0; break;case 0x09:temp9=5;temp10=6;/0.0625*9temp11=2;temp12=5; break;case 0x0A:temp9=6;temp10=2;/0.0625*10temp11=5;temp12=0; break;case 0x0B:temp9=6;temp10=8;/0.0625*11temp11=7;temp12=5; break;case 0x0C:temp9=7;temp10=5;/0.0625*12temp11=0;temp12=0; break;case 0x0D:temp9=8;temp10=1;/0.0625*13temp11=2;temp12=5; break;case 0x0E:temp9=8;temp10=7;/0.0625*14temp11=5;temp12=0; break;case 0x0F:temp9=9;temp10=3;/0.0625*15temp11=7;temp12=5; break;default:break; /LCD_write_line(a,1,0);LCD_write_line(b,2,1);if(z=1)LCD_write_line(temp,4,0);else LCD_write_line(temp,3,0); /*延时X微秒 不同的工作环境,需要调整此函数此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同*/ void DelayXus(unsigned char n) while (n-) _nop_(); _nop_(); void main() int i=0; LCD_init(); init_DS18B20(); while(1) /ShowAncientPeom();delay_200us();show_Temperature(1);show_Temperature(2); /*while(i8) switch(str1i&0xf0) case 0x00: c2*i=0; break; case 0x10: c2*i=1; break;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第二章农业推广的发展简史
- 住宅小区会所建筑施工BIM技术应用
- 吸痰技术与应用
- 销售药品总结
- 眩光现象及其防控技术
- 新四军江抗东进纪念馆讲解
- 新品导入技术报告
- 设备设计方案讲解
- 西京医院医生进修总结
- 小朋友课程汇报
- 企业产学研用管理办法
- 2025年版义务教育体育与健康课程标准题库及答案(教师培训考试专用七套)
- 2025广东省中考数学试卷
- 工程事业部运营管理办法
- 2025汽车智能驾驶技术及产业发展白皮书
- 苯职业病防护课件
- 2025年铸牢中华民族共同体意识基本知识测试题及答案
- 2025年湖北省中考道德与法治真题(解析版)
- 2025-2030年中国胃食管反流病行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030中国苯丙酮尿症(PKU)行业市场发展趋势与前景展望战略研究报告
- 催收新人培训管理制度
评论
0/150
提交评论