LCD上显示温湿度_第1页
LCD上显示温湿度_第2页
LCD上显示温湿度_第3页
LCD上显示温湿度_第4页
LCD上显示温湿度_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 = P20;/并行指令,数据选择信号sbit RW = P21;/读写信号sbit EN = P22;/并行使能信号sbit PSB = P23;/并串口选择信号sbit RST = P25;/复位信号sbit io = P10;/DHT11总线void read_io();/开始信号,读数据并校验void delay(uint a);/延时函数void LCD_init();/LCD初始化程序void write_cmd(uchar cmd);/写指令void write_data(uchar dat);/写数据bit check_busy();/检测LCD忙信号/void clear_gcrom();/清除GCROMvoid delay1();/10us延时void lcd_dis_code(uint cmd_addr,uchar num,uchar dis);/显示函数void lcd_pos(unsigned char X,unsigned char Y);/LCD显示位置计算uchar code lcd=温湿度检测系统 ;uchar code lcd1= 温度:;uchar code lcd2= 湿度:;uchar code lcd3=;uchar code lcd4=%RH;uchar str1= ;uchar str2= ; void main()uchar k,j;LCD_init();lcd_dis_code(0x80,16,lcd);lcd_dis_code(0x88,9,lcd1);lcd_dis_code(0x98,9,lcd2);lcd_dis_code(0x8e,2,lcd3);lcd_dis_code(0x9e,5,lcd4);while(1)read_io();/读取温湿度数据/clear_gcrom();/湿度for(k=0; k2; k+)lcd_pos(4,k+4);write_data(str1k);/clear_gcrom();/温度for(j=0; j2; j+)lcd_pos(3,j+4);write_data(str2j);delay(500);void delay1()/延时10usunsigned char i;for(i=0; i3; i+);void lcd_pos(unsigned char X,unsigned char Y)unsigned char pos;if ( X = 1 ) pos = 0x80 ; else if ( X = 2 ) pos = 0x90 ; else if ( X = 3 ) pos = 0x88 ; else pos = 0x98 ; write_cmd(Y | pos);/数据指针=80+地址变量/*DHT11模块*/uchar receive_byte()/接收一个字节uchar i,temp;for(i=0;i8; i+)count = 2;while(!io) & count+)/等待50us低电平结束,并防止死循环temp = 0;delay1();delay1();delay1();if (io=1) temp = 1;count = 2;while(io & count+);elsetemp = 0;data_byte=1;data_byte|=temp;return (data_byte);void read_io()/开始信号,读数据并校验io = 0;delay(18);/主机拉低18msio = 1;/DATA总线由上拉电阻拉高 主机延时20usdelay1();delay1();delay1();delay1();io = 1;/主机设置为输入高电平,判断从机响应信号if(!io)count = 2;while(!io)&count+);/判断DHT11发出80us低电平响应信号是否结束count = 2;while(io & count+);/判断DHT11拉高总线80us高电平是否结束RH_temp = receive_byte(); RL_temp = receive_byte(); TH_temp = receive_byte(); TL_temp = receive_byte(); CK_temp = receive_byte();io = 1;num = (RH_temp + RL_temp + TH_temp + TL_temp);/数据校验if(num = CK_temp)RH_data = RH_temp; RL_data = RL_temp;TH_data = TH_temp; TL_data = TL_temp; CK_data = CK_temp;/湿度整数部分str10 = (char)(0x30 + RH_data/10);str11 = (char)(0x30 + RH_data%10);/温度整数部分str20 = (char)(0x30 + TH_data/10);str21 = (char)(0x30 + TH_data%10);/*E N D*/*12864模块程序*/*void clear_gcrom()uchar i,j,k;lcd_x = 0x80;lcd_y = 0x80;write_cmd(0x34);for(i = 0 ; i 2 ; i+)/上下两屏幕for(j = 0 ; j 32 ; j+)write_cmd(lcd_y+j);write_cmd(lcd_x); for(k = 0 ; k 16 ; k+)write_data(0x00);lcd_x = 0x88;write_cmd(0x36);write_cmd(0x30);*/ void lcd_dis_code(uint cmd_addr,uchar num,uchar dis)uint i;write_cmd(cmd_addr);for(i=0; inum; i+)write_data(disi);void LCD_init()PSB = 1;RST = 0;delay(5);RST = 1;delay(5);write_cmd(0x34);/扩充指令delay(5);write_cmd(0x30);/基本指令delay(5);write_cmd(0x0c);/显示开关光标delay(5);write_cmd(0x01);/清屏delay(5);bit check_busy()bit temp;RS = 0;RW = 1;EN = 1;delay(5);temp = (bit)(P0&0x80); /按位与操作EN = 0;return (temp);void write_cmd(uchar cmd)while(check_busy();RS = 0;RW = 0;EN = 0;delay(5);P0 = cmd;delay(5);EN = 1;delay(5);EN = 0;void write_data(uchar dat)while(check_busy();RS = 1;RW = 0;EN = 0;P0 = dat;delay(5);EN = 1;delay(5);EN = 0;void delay(uint a)uchar i;while(a-)for(i=0; i113; i+);/*E N D*/第二种编程方式,其实大体都差不了多少#include#include/*宏定义*/#defineuintunsignedint#defineucharunsignedchar#definenoACK0#defineACK1#defineSTATUS_REG_W0x06#defineSTATUS_REG_R0x07#defineMEASURE_TEMP0x03#defineMEASURE_HUMI0x05#defineRESET0x1eenumTEMP,HUMI;typedefunion/定义共用同类型unsignedinti;floatf;value;/*位定义*/sbitlcdrs=P20;sbitlcdrw=P21;sbitlcden=P22;sbitSCK=P10;sbitDATA=P11;/*变量定义*/uchartable2=SHT11温湿度检测;uchartable3=温度为:;uchartable4=湿度为:;uchartable5=.;ucharwendu6;ucharshidu6;/*1ms延时函数*/voiddelay(intz)intx,y;for(x=z;x0;x-)for(y=125;y0;y-);/*50us延时函数*/voiddelay_50us(uintt)uintj;for(;t0;t-)for(j=19;j0;j-);/*50ms延时函数*/voiddelay_50ms(uintt)uintj;for(;t0;t-)for(j=6245;j0;j-);/*12864液晶写指令*/voidwrite_12864com(ucharcom)lcdrs=0;lcdrw=0;delay_50us(1);P0=com;lcden=1;delay_50us(10);lcden=0;delay_50us(2);/*12864液晶写数据*/voidwrite_dat(uchardat)lcdrs=1;lcdrw=0;delay_50us(1);P0=dat;lcden=1;delay_50us(10);lcden=0;delay_50us(2);/*12864液晶初始化*/voidinit12864lcd(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液晶显示函数*/voiddisplay1(void)uchari;write_12864com(0x80);for(i=0;i18;i+)write_dat(table2i);delay_50us(1);/*12864液晶显示函数*/voiddisplay2(void) uchari;write_12864com(0x90);for(i=0;i18;i+)write_dat(table3i);delay_50us(1);/*12864液晶显示函数*/voiddisplay3(void)uchari;write_12864com(0x88);for(i=0;i8;i+)write_dat(table4i);delay_50us(1);/*12864液晶显示函数*/voiddisplaywendu(void)uchari;write_12864com(0x94);for(i=0;i3;i+)write_dat(wendui);delay_50us(1);for(i=0;i1;i+)write_dat(table5i);delay_50us(1);for(i=4;i5;i+)write_dat(wendui);delay_50us(1);/*12864液晶显示函数*/voiddisplayshidu(void)uchari;write_12864com(0x8C);for(i=0;i3;i+)write_dat(shidui);delay_50us(1);for(i=0;i1;i+)write_dat(table5i);delay_50us(1);for(i=4;i0;i=1)/高位为1,循环右移if(i&value)DATA=1;/和要发送的数相与,结果为发送的位elseDATA=0;SCK=1;_nop_();_nop_();_nop_();/延时3usSCK=0;DATA=1;/释放数据线SCK=1;error=DATA;/检查应答信号,确认通讯正常_nop_();_nop_();_nop_();SCK=0;DATA=1;returnerror;/error=1通讯错误/*SHT11读字节程序*/chars_read_byte(unsignedcharack)unsignedchari,val=0;DATA=1;/释放数据线for(i=0x80;i0;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;/释放数据线returnval;/*SHT11启动传输*/voids_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连接复位*/voids_connectionreset(void)unsignedchari;DATA=1;SCK=0;/准备for(i=0;i9;i+)/DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位SCK=1;SCK=0;s_transstart();/启动传输/*SHT11温湿度检测*/ chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode)unsignederror=0;unsignedinti;s_transstart();/启动传输switch(mode)/选择发送命令caseTEMP:error+=s_write_byte(MEASURE_TEMP);break;/测量温度caseHUMI:error+=s_write_byte(MEASURE_HUMI);break;/测量湿度default:break;for(i=0;i100)rh_true=100;/湿度最大修正if(rh_true0.1)rh_true=0.1;/湿度最小修正 *p_temperature=t_C;/返回温度结果*p_humidity=rh_true;/返回湿度结果/*主函数*/voidmain(void)unsignedinttemp,humi;valuehumi_val,temp_val;/定义两个共同体,一个用于湿度,一个用于温度unsignedcharerror;/用于检验是否出现错误unsignedcharchecksum;/CRCinit12864lcd();dis

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论