温湿度传感器程序_第1页
温湿度传感器程序_第2页
温湿度传感器程序_第3页
温湿度传感器程序_第4页
温湿度传感器程序_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、/* 基于盛群单片机开发的获得温湿传感器dht11 和光敏电阻的数据并且发送到1602 显示屏的程序*/#include <ht46r232.h>#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

2、1/initialize registers 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#define ep _pc0#define rw _pc1#define dht _pb1#define ko _pb2#define ky _pb3#define LED

3、_DATA_CRL _pac#define DHT_DATA_CRL _pbc#define LED_DATA_DATA _pa/ 屏幕的控制rs/ 屏幕的控制rs/ 屏幕的控制rs/ 外部按键定义/ 屏幕数据管脚的I/O 控制/dht 数据管脚的I/O 控制/ 屏幕数据管脚的数据传递#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(unsi

4、gned char);void data(int);signed char U8FLAG,U8temp,U8comdata;intU8T_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_

5、g;/ 外部按键常量/ 光强的数字值/ 百位/ 十位/ 个位int count;void ADtrans()/ad 转换开始ad_start=0;ad_start=1;ad_start=0;/屏幕部分,*屏幕初始*cmd(0x08);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);bus

6、ycheck();busycheck();cmd(0x01);busycheck();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;

7、_delay(100);ep = 1;_delay(100);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;11*void pos(u8 x)/*写入地址*cmd(x|0x80);/*/dht21部分 /*获取 8 位二进制数*/*COM 获取一个8 位二进制数*/void COM(v

8、oid)u8 i;for(i=0;i<8;i+)U8FLAG=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 高电平值则数据位为1U8comdata<<=1;U8comdata|=U8temp;/rof/*/*/* 温湿度读取子程序*/*/* 以下变量均为全局变量*/* 温度高8 位 = U8T_da

9、ta_H*/* 温度低8 位 = U8T_data_L*/* 湿度高8 位 = U8RH_data_H*/* 湿度低8 位 = U8RH_data_L*/* 校验 8 位 = U8checkdata*/void RH(void) int c=0;DHT_DATA_CRL=0;dht=0;_delay(20000);/ 主机拉低500usDHT_DATA_CRL=0xff;/ 主机设为输入(电平由上拉电阻拉高)在2040us 后判断从机响应信号while(dht=1)&&(c+<100);/ 判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!dht)U8FL

10、AG=2;while(!dht)&&U8FLAG+);/判断从机是否发出80us 的低电平响应信号是否结束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=U8comdat

11、a;/ 数据校验U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_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=&#

12、39;r'u8 h='h'u8 t='t'u8 c='c'u8 l='l'u8 z=':'u8 si='4'u8 wu='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 转换

13、 8 分频_adcr=0x08;/ 设置通道pb0 an0 作为 ad 输入ad_start=1;/ 设置分频和通道ad_start=0;_emi=0;/ 关总中断_adf=0;/ 清除 ad 中断标志位_eadi=1;/ 开 ad 中断使能_emi=1;/ 开总中断/*while(1)RH();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|0x3

14、0)&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=(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|0

15、x30)&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;/ 查询键盘else if(ky=0)k=0;pos(0);/ 显示温度data(h);data(z);data(rhdatas);data(rhdatag);if(ko=0)k=1;/ 查询键盘/ 显示湿度els

16、e 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);data(wu);if(U8T_data_H<30&&U8T_data_H>=25) if (k=1) data(si);data(wu);else data(wu

17、);data(ling);if (U8T_data_H<25) 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);/ 开显示屏! ! ! ! ! ! ! ! ! ! ! ! ! !_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=

温馨提示

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

评论

0/150

提交评论