完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
//**************************
//程序说明:stc15f2k60s2采集dht11温湿度传感器数据,并从串口输出,另附加该程序工程文件下载地址:download.csdn.net/detail/liyu3519/9873073 //采用的是22.1184M晶振 //************************** #include //IO口声明 #define dht11_io P20 //P2.0口作为数据读取接口 //常量声明 #define MAIN_Fosc 22118400L //主时钟 #define baud_rate 115200L //波特率 #define timer1_Reload (65536UL -(MAIN_Fosc / 4 / baud_rate)) //Timer1重装值 //变量定义 u16 U8FLAG; u8 U8temp; u8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; u8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp; u8 U8comdata; u8 datas=0; //函数声明 void Delay30us(); //22.1184M晶振精确延时30微秒 void Delay40us(); //22.1184M晶振精确延时40微秒 void Delay18ms(); //22.1184M晶振精确延时30毫秒 void Delay1000ms(); //22.1184M晶振精确延时1000毫秒 void read_byte(); //读取一字节的数据,并赋值给U8comdata u8 read_temp(); //读取温度,返回温度值 u8 read_humi(); //读取湿度,返回湿度值 void serial_init(); //串口初始化 void serial_send_byte(u8 dat); //串口发送一个字节的数据 void serial_send_string(u8 *dat);//串口发送字符串 void main() { Delay1000ms(); serial_init();//串口初始化 dht11_io = 1; while(1) { datas=read_temp(); serial_send_string("温度:"); serial_send_byte(datas%100/10+'0');//十位 serial_send_byte(datas%10+'0'); //个位 serial_send_byte(' '); datas=read_humi(); serial_send_string("湿度:"); serial_send_byte(datas%100/10+'0');//十位 serial_send_byte(datas%10+'0'); //个位 serial_send_string("rn"); Delay1000ms(); } } void read_byte() { u8 i; for(i=0;i<8;i++) { U8FLAG=2; while((!dht11_io)&&U8FLAG++);//超时3毫秒跳出 Delay30us(); U8temp=0; if(dht11_io)U8temp=1; U8FLAG=2; while((dht11_io)&&U8FLAG++);//超时3毫秒跳出 if(U8FLAG==1)break; U8comdata<<=1; U8comdata|=U8temp; } } u8 read_temp() { dht11_io=0; Delay18ms(); dht11_io=1; Delay40us(); dht11_io=1; if(!dht11_io) { U8FLAG=2; while((!dht11_io)&&U8FLAG++);//超时3毫秒跳出 U8FLAG=2; while((dht11_io)&&U8FLAG++);//超时3毫秒跳出 read_byte(); U8RH_data_H_temp=U8comdata; read_byte(); U8RH_data_L_temp=U8comdata; read_byte(); U8T_data_H_temp=U8comdata; read_byte(); U8T_data_L_temp=U8comdata; read_byte(); U8checkdata_temp=U8comdata; dht11_io=1; U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); if(U8temp==U8checkdata_temp) { 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; } } return U8T_data_H; } u8 read_humi() { dht11_io=0; Delay18ms(); dht11_io=1; Delay40us(); dht11_io=1; if(!dht11_io) { U8FLAG=2; while((!dht11_io)&&U8FLAG++);//超时3毫秒跳出 U8FLAG=2; while((dht11_io)&&U8FLAG++);//超时3毫秒跳出 read_byte(); U8RH_data_H_temp=U8comdata; read_byte(); U8RH_data_L_temp=U8comdata; read_byte(); U8T_data_H_temp=U8comdata; read_byte(); U8T_data_L_temp=U8comdata; read_byte(); U8checkdata_temp=U8comdata; dht11_io=1; U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); if(U8temp==U8checkdata_temp) { 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; } } return U8RH_data_H; } void serial_init() { S1_8bit(); //8位数据 S1_USE_P30P31(); //UART1 使用P30 P31口 默认 TR1 = 0; AUXR &= ~0x01; //S1 BRT Use Timer1; TMOD &= ~(1<<6); //Timer1 set As Timer TMOD &= ~0x30; //Timer1_16bitAutoReload;2 AUXR |= (1<<6); //Timer1 set as 1T mode TH1 = (u8)(Timer1_Reload >> 8); TL1 = (u8)Timer1_Reload; TR1 = 1; PS = 1; //高优先级中断 REN = 1; //允许接收 ES = 1; //允许中断 EA = 1; //允许全局中断 } void serial_send_byte(u8 dat) { SBUF=dat; while(!TI); TI=0; } void serial_send_string(u8 *dat) { while(*dat) { serial_send_byte(*dat++); } } /********************* 串口1中断函数************************/ void UART1_int (void) interrupt UART1_VECTOR { if(RI) { RI = 0; } if(TI) { } } void Delay30us() //@22.1184MHz精确延时30微秒 { unsigned char i, j; i = 1; j = 162; do { while (--j); } while (--i); } void Delay40us() //@22.1184MHz精确延时40微秒 { unsigned char i, j; _nop_(); i = 1; j = 217; do { while (--j); } while (--i); } void Delay18ms() //@22.1184MHz精确延时18毫秒 { unsigned char i, j, k; _nop_(); i = 2; j = 132; k = 67; do { do { while (--k); } while (--j); } while (--i); } void Delay1000ms() //@22.1184MHz { unsigned char i, j, k; _nop_(); _nop_(); i = 85; j = 12; k = 155; do { do { while (--k); } while (--j); } while (--i); } |
|
相关推荐 |
|
1007 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-通用文件I/O模型之close
1065 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第十五章 按键中断实验
1007 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第十一章 FPIOA管理器实验
1153 浏览 0 评论
890 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11466 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-15 18:13 , Processed in 0.688157 second(s), Total 44, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号