1、/*基于盛群单片机开发的 获得温湿传感器dht11和光敏电阻的数据 并且发送到1602显示屏的程序*/#include #pragma vector isr_4 0x4#pragma vector isr_8 0x8#pragma vector isr_c 0xc#pragma vector isr_ad 0x10 /ad中断服务程序(r232地址是10)/ISR for safequardvoid isr_4() / external ISRvoid isr_8() / timer/event 0void isr_c() / timer/event 1/initialize register
2、s for safeguardvoid safeguard_init()_intc0=0;_intc1=0;_tmr0h=0;_tmr0l=0;_tmr0c=0;_tmr1h=0;_tmr1l=0;_tmr1c=0;_pac=0xff;_pbc =0xff; /input mode_pcc =0xff;typedef unsigned char u8;#define rs _pc2 /屏幕的控制rs#define ep _pc0 /屏幕的控制rs#define rw _pc1 /屏幕的控制rs#define dht _pb1#define ko _pb2 /外部按键定义#define ky _
3、pb3#define LED_DATA_CRL _pac /屏幕数据管脚的I/O控制#define DHT_DATA_CRL _pbc /dht数据管脚的I/O控制#define LED_DATA_DATA _pa /屏幕数据管脚的数据传递#define LED_CRL_CRL _pcc /屏幕控制管脚的I/O控制#define ad_start _26_7 /定义ad转换的start位(r232的adcr寄存器地址是0x26h)void busycheck(void);void init(void);void cmd(unsigned char);void data(int);signed
4、char U8FLAG,U8temp,U8comdata;int U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;/*中间数值,校对校验码后付给最终的结果*/int U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;/*实际数值*/int k; /外部按键常量unsigned int light; /光强的数字值int light_b; /百位int light_s;/十位int light_g;/个位int c
5、ount;void ADtrans() /ad转换开始ad_start=0;ad_start=1;ad_start=0;/-屏幕部分-/*屏幕初始*void init()LED_DATA_CRL=0;LED_CRL_CRL=0;LED_DATA_DATA=0;_pc=0;_delay(5000);_delay(5000);_delay(5000);cmd(0x38);_delay(5000);cmd(0x38);_delay(5000);cmd(0x38);_delay(5000);cmd(0x38);busycheck();cmd(0x08);busycheck();cmd(0x01);bu
6、sycheck();cmd(0x06);busycheck();cmd(0x0c);busycheck();/*/*送指令函数*void cmd(u8 mingling) /busycheck(); rs= 0; rw = 0; ep = 0; LED_DATA_DATA=mingling;_delay(100); ep=1;_delay(100); ep=0;/*/*送数据*void data(int zimu)/busycheck();rw=0; rs = 1; rw = 0; ep = 0;LED_DATA_DATA= zimu;_delay(100);ep = 1;_delay(100
7、);ep = 0; /*/*busycheck*void busycheck(void)u8 val;doep=0;LED_DATA_CRL=0xff;rs=0;rw=1;ep=1;_delay(100);val=LED_DATA_DATA;_delay(100);ep=0; while(val&(u8)0x80);rw=0;LED_DATA_CRL=0;/* /*写入地址*void pos(u8 x)cmd(x|0x80);/*/-dht21 部分-/*获取8位二进制数*/*COM获取一个8位二进制数*/ void COM(void) u8 i; for(i=0;i8;i+) U8FLAG=
8、2; while(!dht)&U8FLAG+); _delay(35); U8temp=0; if(dht)U8temp=1; U8FLAG=2; while(dht)&U8FLAG+); /超时则跳出for循环 if(U8FLAG=1)break; /判断数据位是0还是1 / 如果高电平高过预定0高电平值则数据位为 1 U8comdata=1; U8comdata|=U8temp; /rof /*/*-*/*-温湿度读取子程序 -*/*-*/*-以下变量均为全局变量-*/*-温度高8位= U8T_data_H-*/*-温度低8位= U8T_data_L-*/*-湿度高8位= U8RH_dat
9、a_H-*/*-湿度低8位= U8RH_data_L-*/*-校验 8位 = U8checkdata-*/void RH(void) int c=0; DHT_DATA_CRL=0; dht=0; _delay(20000); /主机拉低500us DHT_DATA_CRL=0xff; /主机设为输入(电平由上拉电阻拉高) 在2040us后判断从机响应信号 while(dht=1)&(c+100); /判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!dht) U8FLAG=2; while(!dht)&U8FLAG+);/判断从机是否发出 80us 的低电平响应信号是否结
10、束 U8FLAG=2; while(dht)&U8FLAG+); /判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 COM(); /数据接收状态 U8RH_data_H_temp=U8comdata; COM(); U8RH_data_L_temp=U8comdata; COM(); U8T_data_H_temp=U8comdata; COM(); U8T_data_L_temp=U8comdata; COM(); U8checkdata_temp=U8comdata; /数据校验 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_da
11、ta_H_temp+U8RH_data_L_temp); if(U8temp=U8checkdata_temp) if(1) U8RH_data_H=U8RH_data_H_temp; U8RH_data_L=U8RH_data_L_temp; U8T_data_H=U8T_data_H_temp; U8T_data_L=U8T_data_L_temp; U8checkdata=U8checkdata_temp; /*/-华丽的main函数分割线-void main() /*变量定义*u8 r=r;u8 h=h;u8 t=t;u8 c=c;u8 l=l;u8 z=:;u8 si=4;u8 wu
12、=5;u8 liu=6;u8 ling=0;int rhdatas; /湿度数据十位int rhdatag; / 湿度数据个位int tdatas;int tdatag;int i=0;/*/*初始化*safeguard_init();init();DHT_DATA_CRL=0xff; _acsr=0x01; /ad转换8分频_adcr=0x08; /设置通道 pb0 an0作为ad输入ad_start=1; /设置分频和通道ad_start=0;_emi=0; /关总中断_adf=0; /清除ad中断标志位_eadi=1; / 开ad中断使能_emi=1; /开总中断/*while(1) R
13、H();ADtrans(); /ad转换开始if(ko=0)k=1; /查询键盘else if(ky=0)k=0;/*把获得的数据转换成屏幕可以显示的数字(根据屏幕的编码表)*rhdatas=U8RH_data_H/10;rhdatag=U8RH_data_H%10;rhdatas=(rhdatas|0x30)&0x3f;rhdatag=(rhdatag|0x30)&0x3f;if(ko=0)k=1;/查询键盘else if(ky=0)k=0;tdatas=U8T_data_H/10;tdatag=U8T_data_H%10;tdatas=(tdatas|0x30)&0x3f;tdatag=(
14、tdatag|0x30)&0x3f;if(ko=0)k=1; /查询键盘else if(ky=0)k=0;light_b=light/100;light_s=(light-light_b*100)/10;light_g=light%10;light_b=(light_b|0x30)&0x3f;light_s=(light_s|0x30)&0x3f;light_g=(light_g|0x30)&0x3f;/*cmd(0x08); /先关显示屏!_delay(60000);cmd(0x01); / 清屏! _delay(60000); _delay(60000); if(ko=0)k=1; /查询
15、键盘else if(ky=0)k=0;pos(0); /显示温度data(h);data(z);data(rhdatas);data(rhdatag);if(ko=0)k=1; /查询键盘else if(ky=0)k=0;pos(43); /显示湿度data(t);data(z);data(tdatas);data(tdatag);if(ko=0)k=1; /查询键盘else if(ky=0)k=0;pos(8);data(r); /显示推荐数据data(c);data(z);if(tdatas=3) if (k=1) data(si);data(ling); else data(si);da
16、ta(wu);if(U8T_data_H=25) if (k=1) data(si);data(wu); else data(wu);data(ling);if (U8T_data_H25) if (k=1) data(wu);data(wu); else data(liu);data(ling);pos(0x4a); /显示当前光强data(l);data(z);data(light_b);data(light_s);data(light_g);pos(0x48);data(count);if(ko=0)k=1; /查询键盘else if(ky=0)k=0;cmd(0xc); /开显示屏!_
17、delay(250000); if(ko=0)k=1; /查询+延时else if(ky=0)k=0; _delay(250000);if(ko=0)k=1;else if(ky=0)k=0;_delay(250000);if(ko=0)k=1;else if(ky=0)k=0;_delay(250000);if(ko=0)k=1;else if(ky=0)k=0;_delay(250000);if(ko=0)k=1;else if(ky=0)k=0;_delay(250000);if(ko=0)k=1;else if(ky=0)k=0;_delay(250000);if(ko=0)k=1;else if(ky=0)k=0;_delay(250000);if(ko=0)k=1;else if(ky=0)k=0; /_/*中断服务程序*void isr_ad()_adf=0; /清除ad中断标志位light=_adrh; /读取ad数据寄存器高八位;count+;