与电脑通信的温湿度传感器c程序.docx
《与电脑通信的温湿度传感器c程序.docx》由会员分享,可在线阅读,更多相关《与电脑通信的温湿度传感器c程序.docx(9页珍藏版)》请在冰点文库上搜索。
与电脑通信的温湿度传感器c程序
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
voidunit();
voiddelay2ms(uintM);
voiddelay2xus(ucharm);
ucharread_onebyte();
voidRead();
voidwrite_com(ucharcom);
voidwrite_data(ucharD);
voidLCD1602_unit();//初始化lcd1602
voidLCD1602_display();
voiduart_unit();
voidsent_byte();
ucharDATA[5];
sbitled=P0^3;
sbitled3=P0^0;
ucharD=1;
sbitDQ=P2^7;
sbitlcd_rs=P3^3;
sbitlcd_rw=P3^4;
sbitlcd_en=P3^5;
ucharRH_H,RH_L,T_H,T_L,CHECK;
floatRH,T;
/*---------------------微秒延时函数--------------------------------------*/
voiddelay2xus(ucharm)
{while(--m);
}
/*--------------------毫秒延时函数---------------------------------------*/
voiddelay2ms(uintM)
{
uinti,j,k;
for(k=0;k{for(i=0;i<9;i++){for(j=0;j<32;j++);}}}/*--------------------------DHT11初始化函数---------------------------*/voidunit(){led3=1;led3=0;DQ=1;DQ=0;delay2ms(12);DQ=1;delay2xus(12);//检测DHT11响应信号是否开始while(DQ);//DQ=1时跳过while(!DQ);//检测DHT11响应信号是否结束while(DQ);led3=1;//检测DHT11的发送bite开始信号是否开始}/*---------------------读一个字节函数-----------------------------------*/ucharread_onebyte(){uchari;ucharflag;ucharbyte=0x00;for(i=0;i<8;i++){while(DQ);byte=byte<<=1;while(!DQ);//检测数据信号,即高电平delay2xus(17);//区分开1信号和0信号if(DQ)flag=1;elseflag=0;byte=byte|flag;//若DQ是高电平,就是1信号,是低电平就是0信号}returnbyte;//返回8位数据}/*-------------------------------读DHT11数据函数------------------------------*/voidRead(){ucharj,total;//检测数据是否正确指示灯for(j=0;j<5;j++){led=0;DATA[j]=read_onebyte();}//按协议顺序,DATA[0]为湿整,DATA[1]为湿小,DATA[2]为温整,DATA[3]为温小RH_H=DATA[0];RH_L=DATA[1];T_H=DATA[2];T_L=DATA[3];CHECK=DATA[4];total=RH_H+RH_L+T_H+T_L;if(CHECK==total);//检测数据是否正确elseled=1;//检测数据是否正确指数灯}/*------------------------------LCD写指令函数--------------------------------------------*/voidwrite_com(ucharcom){lcd_rs=0;//声明是指令P1=com;delay2ms(5);lcd_en=1;//下降沿有效delay2ms(5);lcd_en=0;}/*---------------------------------LCD写数据函数---------------------------------------*/voidwrite_data(ucharD){lcd_rs=1;//声明是数据P1=D;delay2ms(5);lcd_en=1;//下降沿有效delay2ms(5);lcd_en=0;}/*---------------------------------LCD1602初始化函数----------------------------------*/voidLCD1602_unit(){lcd_rw=0;write_com(0x80);write_com(0x06);//声明是写操作//清屏//光标右移,字符不动write_com(0x0f);//开显示,有光标,光标不闪烁write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口}/*-------------------------------------LCD1602显示函数-------------------------------------*/voidLCD1602_display(){ucharwho[2];uchari;ucharstr1[11];//暂存相对湿度字符ucharstr2[11];//暂存温度字符LCD1602_unit();write_com(0x80);//光标在第一行第一位who[0]=0xdf;who[1]='c';RH=RH_H+RH_L*0.001;//相对湿度数据T=T_H+T_L*0.001;//温度数据sprintf(str1,"RH:%7.3f%%",RH);//转化为字符串sprintf(str2,"T:%7.3f%s",T,who);for(i=0;i<11;i++)//在第一行显示相对湿度数据{write_data(str1[i]);}write_com(0xc0);//光标在第二行第一位for(i=0;i<11;i++)//在第二行显示温度数据{write_data(str2[i]);}}/*----------------------------------串行异步通信初始化函数与------------------------------*/voiduart_unit(){TMOD|=0x20;PCON=0x00;SCON=0x50;//启动timer1,mode2,8bit自动重装//波特率正常,即SMOD=0//串口模式1,8bitUART,REN=1,SM0=0;SM1=1TH1=0xf3;//自动重装,波特率为2400,晶振12MHZTL1=0xf3;TR1=1;//打开总xxES=1;//打开timer1EA=1;//打开串行xx}/*------------------------------------串行发送数据函数-----------------------------------*/voidsent_byte(){ucharc;ucharsent[2];sent[0]=2;//准备接收信号sent[1]=RH;sent[2]=3;sent[3]=T;sent[4]=0;for(c=0;c<5;c++){SBUF=sent[c];while(!TI);TI=0;delay2ms(25);//xx补偿}}/*------------------------------------------------------------------------主函数------------------------------------------------------------*/voidmain(){D=1;while(1)//主循环,等待上位机给启动信号{while(!D);//检测上位机命令RI=0;TI=0;delay2ms(100);//当电脑传给T=1时,可跳出循环,开始新一轮的测量数据,并发送上一次测量数据T=0;while(!T);unit();Read();//读并整理出相对湿度值和温度值LCD1602_unit();//初始化lcd1602LCD1602_display();//显示uart_unit();sent_byte();//运行一次后停止}}/*-----------------------中断服务函数-------------------------------*/voiduart()interrupt4//串行中断号为4{if(RI==1)D=SBUF;//将T置1或0RI=0;
{for(i=0;i<9;i++)
{for(j=0;j<32;j++);
/*--------------------------DHT11初始化函数---------------------------*/
voidunit()
{led3=1;
led3=0;DQ=1;
DQ=0;
delay2ms(12);
DQ=1;
delay2xus(12);//检测DHT11响应信号是否开始
while(DQ);//DQ=1时跳过
while(!
DQ);//检测DHT11响应信号是否结束
while(DQ);
led3=1;//检测DHT11的发送bite开始信号是否开始
/*---------------------读一个字节函数-----------------------------------*/
ucharread_onebyte()
{uchari;
ucharflag;
ucharbyte=0x00;
for(i=0;i<8;i++)
{while(DQ);
byte=byte<<=1;
DQ);//检测数据信号,即高电平
delay2xus(17);//区分开1信号和0信号
if(DQ)
flag=1;
else
flag=0;
byte=byte|flag;//若DQ是高电平,就是1信号,是低电平就是0信号
returnbyte;//返回8位数据
/*-------------------------------读DHT11数据函数------------------------------*/
voidRead()
ucharj,total;
//检测数据是否正确指示灯
for(j=0;j<5;j++)
{led=0;
DATA[j]=read_onebyte();}//按协议顺序,DATA[0]为湿整,DATA[1]为湿小,DATA[2]为温整,DATA[3]为温小
RH_H=DATA[0];
RH_L=DATA[1];
T_H=DATA[2];
T_L=DATA[3];
CHECK=DATA[4];
total=RH_H+RH_L+T_H+T_L;
if(CHECK==total);//检测数据是否正确
led=1;//检测数据是否正确指数灯
/*------------------------------LCD写指令函数--------------------------------------------*/
voidwrite_com(ucharcom)
lcd_rs=0;//声明是指令
P1=com;
delay2ms(5);
lcd_en=1;//下降沿有效
lcd_en=0;
/*---------------------------------LCD写数据函数---------------------------------------*/
voidwrite_data(ucharD)
lcd_rs=1;//声明是数据
P1=D;
/*---------------------------------LCD1602初始化函数----------------------------------*/
voidLCD1602_unit()
{lcd_rw=0;
write_com(0x80);
write_com(0x06);//声明是写操作
//清屏
//光标右移,字符不动
write_com(0x0f);//开显示,有光标,光标不闪烁
write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
/*-------------------------------------LCD1602显示函数-------------------------------------*/
voidLCD1602_display()
ucharwho[2];
uchari;
ucharstr1[11];//暂存相对湿度字符
ucharstr2[11];//暂存温度字符
LCD1602_unit();
write_com(0x80);//光标在第一行第一位
who[0]=0xdf;
who[1]='c';
RH=RH_H+RH_L*0.001;//相对湿度数据
T=T_H+T_L*0.001;
//温度数据
sprintf(str1,"RH:
%7.3f%%",RH);//转化为字符串
sprintf(str2,"T:
%7.3f%s",T,who);
for(i=0;i<11;i++)//在第一行显示相对湿度数据
{write_data(str1[i]);
write_com(0xc0);//光标在第二行第一位
for(i=0;i<11;i++)//在第二行显示温度数据
write_data(str2[i]);
/*----------------------------------串行异步通信初始化函数与------------------------------*/voiduart_unit()
TMOD|=0x20;
PCON=0x00;
SCON=0x50;//启动timer1,mode2,8bit自动重装
//波特率正常,即SMOD=0
//串口模式1,8bitUART,REN=1,SM0=0;SM1=1
TH1=0xf3;//自动重装,波特率为2400,晶振12MHZ
TL1=0xf3;
TR1=1;//打开总xx
ES=1;//打开timer1
EA=1;//打开串行xx
/*------------------------------------串行发送数据函数-----------------------------------*/
voidsent_byte()
{ucharc;
ucharsent[2];
sent[0]=2;//准备接收信号
sent[1]=RH;
sent[2]=3;
sent[3]=T;
sent[4]=0;
for(c=0;c<5;c++)
{SBUF=sent[c];
TI);
TI=0;
delay2ms(25);//xx补偿
/*------------------------------------------------------------------------
主函数
------------------------------------------------------------*/
voidmain()
{D=1;
while
(1)//主循环,等待上位机给启动信号
D);//检测上位机命令
RI=0;
delay2ms(100);//当电脑传给T=1时,可跳出循环,开始新一轮的测量数据,并发送上一次测量数据T=0;while(!
T);
unit();
Read();//读并整理出相对湿度值和温度值
LCD1602_unit();//初始化lcd1602
LCD1602_display();//显示
uart_unit();
sent_byte();
//运行一次后停止
/*-----------------------中断服务函数-------------------------------*/
voiduart()interrupt4//串行中断号为4
if(RI==1)
D=SBUF;//将T置1或0
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2