这个装置中51单片机读取温湿度传感器模块的数值,然后通过串口发送给vb上位机
AM2301温湿度的下位机单片机源码:
- #include <reg52.h>
- unsigned char tmp;
- void send_char(unsigned char txd);
- void send_str();
- void delayms(unsigned char ms);
- void send_char(unsigned char txd);
- void delay_us(unsigned int i);
- void dht_init();
- unsigned char read_byte();
- void read_hum_temp();
- void zhuanhuan();
- unsigned int hum,temp; //定义湿度、温度(全局)
- unsigned char hum_h,hum_l,temp_h,temp_l,check; //湿度高、低8位,温度高、低8位,校验位
- unsigned char bai,shi,ge,bai1,shi1,ge1;
- sbit dht=P1^1;
- int main()
- {
- TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
- TH1 = 0xFD; // 波特率9600
- TL1 = 0xFD;
- SCON = 0x50; // 设定串行口工作方式
- PCON &= 0xef; // 波特率不倍增
-
- TR1 = 1; // 启动定时器1
- IE = 0x0; // 禁止任何中断
- dht_init();
- while(1)
- {
- read_hum_temp();
- zhuanhuan();
- send_str();
- delayms(255);
- delayms(255);
- }
- }
- //传感器初始化
- void dht_init()
- {
- dht=0;
- delay_us(50); //拉低延时500微秒,发送开始信号
- dht=1; //释放总线,延时30微秒
- delay_us(4);
- while(!dht); //拉低等待
- while(dht); // 拉高等待,即将传送数据
- }
- //读取一个字节数据
- unsigned char read_byte()
- {
- unsigned char n,byte=0,dat;
- for(n=0;n<8;n++)
- {
- while(!dht);
- delay_us(4); //理论上28us<延时<70us,此处写2--6都可以
- dat=0;
- if(dht)
- dat=1;
- while(dht);
- byte<<=1;
- byte|=dat;
- }
- return byte;
- }
- //读取40位数据
- void read_hum_temp()
- {
- dht_init();
- hum_h=read_byte(); //读湿度
- hum_l=read_byte();
- temp_h=read_byte(); //读温度
- temp_l=read_byte();
- check=read_byte(); //读校验
- while(!dht); // 等待低电平结束
- dht=1; //最后拉高总线
- }
- //数据转换,提取各位数字
- void zhuanhuan()
- {
- unsigned char a;
- a=hum_h+hum_l+temp_h+temp_l;
- if(a==check)
- {
- hum=temp=0;
- hum=((hum|hum_h)<<8)|hum_l;
- temp=((temp|temp_h)<<8)|temp_l;
- bai=temp/100+0x30;
- shi=temp%100/10+0x30;
- ge=temp%10+0x30;
- bai1=hum/100+0x30;
- shi1=hum%100/10+0x30;
- ge1=hum%10+0x30;
- }
- else bai=shi=ge=bai1=shi1=ge1=0;
- }
- // 传送一个字符
- void send_char(unsigned char txd)
- {
- SBUF = txd;
- while(!TI); // 等特数据传送
- TI = 0; // 清除数据传送标志
- }
- // 传送字串
- void send_str()
- {
- send_char(bai);
- send_char(shi);
- send_char('.');
- send_char(ge);
- //delay_us(200);
- send_char(bai1);
- send_char(shi1);
- send_char('.');
- send_char(ge1);
- }
- //延时
- void delay_us(unsigned int i)
- {
- while(i--);
- }
- // 延时子程序
- void delayms(unsigned char ms)
- {
- unsigned char i;
- while(ms--)
- {
- for(i = 0; i < 255; i++);
- }
- }
复制代码
蓝牙,电脑端进行实时显示
全部资料51hei下载地址:
温湿度.zip
(33.98 KB, 下载次数: 121)
|