|
单片机温湿度资料有问题 无法仿真
有错误 求指导:
错误的温湿度设计.7z
(178.67 KB, 下载次数: 299)
单片机温湿度仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
拿到仿真文件后请运行下,我有安装文件提供给亲。很多买家直接一句话运行不了要求退款,或者有些人提出我原理图只要99se格式,给转换后又说打不开直接退货。我碰到了很多。虽然这没什么钱也不多一碗面的钱都不够。作为IT民工加攻城狮来说自己写的程序就这么被人忽悠了实在懵逼。如果亲确认需要,确认收货后我把源文件发送给亲。防小人,望亲谅解。
附带下面的论文:
单片机温湿度毕业设计.docx
基于AT89C52单片机和SHT10温湿度传感器的温、湿度监测系统的设计.doc
基于C52单片机花房温湿度控制系统的是合计与仿真.doc
基于单片机的温度显示报警系统设计.docx
基于单片机的温度检测和报警系统.doc
基于单片机的温度采集系统设计4.doc
基于单片机的温湿度报警器设计.doc
基于单片机的温湿度检测报警系统.doc
室内温度控制报警器-(优秀毕业设计).doc
温度报警器毕业论文.docx
亲你好:
拿到仿真文件后请运行下,我有安装文件提供给亲。很多买家直接一句话运行不了要求退款,或者有些人提出我原理图只要99se格式,给转换后又说打不开直接退货。我碰到了很多。虽然这没什么钱也不多一碗面的钱都不够。作为IT民工加攻城狮来说自己写的程序就这么被人忽悠了实在懵逼。如果亲确认需要,确认收货后我把源文件发送给亲。防小人,望亲谅解。
单片机源程序如下:
- #include "reg52.H"
- #include "stdio.h"
- #include "intrins.h"
- #include <math.h>
- #define DB P0//液晶并行数据接口
- sbit RS = P2^0;//液晶指令数据信号
- sbit RW = P2^1;//液晶读写信号
- sbit E = P2^2;//液晶使能信号
- unsigned char key_value;//获取到按键的值
- sbit Sck_P = P1^1; // SHT11传感器的时钟管脚
- sbit Data_P = P1^0; // SHT11传感器的数据管脚
- unsigned char temp; // 保存温度
- unsigned char humi; // 保存湿度
- enum { TEMP,HUMI };
- typedef union //定义共用同类型
- {
- unsigned int i;
- float f;
- }value;
- //是否应答
- #define NACK 0
- #define ACK 1
- //SHT75传感器命令集 地址 命令 读/写
- #define MEASURE_TEMP 0x03 //000 0001 1
- #define MEASURE_HUMI 0x05 //000 0010 1
- #define STATUS_REG_W 0x06 //000 0011 0
- #define STATUS_REG_R 0x07 //000 0011 1
- #define RESET 0x1E //000 1111 0
- unsigned char now_window;//当前显示窗口
- unsigned char curr_menu;
- #define normal_mode 0x10//输入密码状态
- #define set_mode 0x20//输入密码状态
- signed char AlarmTL=10; // 温度下限报警值
- signed char AlarmTH=30; // 温度上限报警值
- signed char AlarmHL=40; // 湿度下限报警值
- signed char AlarmHH=80; // 湿度上限报警值
- unsigned char i;
- unsigned char cnt_100ms;
- unsigned char time_100ms_flag;
- unsigned char open_del;//开锁成功延时计数
- unsigned char open_flag;//锁状态标志
- sbit beep = P1^2;
- sbit LedTL_P = P1^3; // 温度过低报警指示灯
- sbit LedTH_P = P1^4; // 温度过高报警指示灯
- sbit LedHL_P = P1^5; // 湿度过低报警指示灯
- sbit LedHH_P = P1^6; // 湿度过高报警指示灯
- /*******************************************************************************
- * 函 数 名 : delay_ms
- * 函数功能 : 延时函数,延时1ms
- * 输 入 : cnt
- * 输 出 : 无
- * 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
- *******************************************************************************/
- void delay_ms(unsigned int cnt) //
- {
- unsigned int x;
- for( ; cnt>0; cnt--)
- {
- for(x=110; x>0; x--);//软件延时为1MS
- }
- }
- #if 0
- void delay_us(unsigned int cnt) //
- {
- while(cnt--);
- }
- #endif
- /******************************************************
- ** 函数名:time_init
- ** 描述 :定时器初始化
- ** 输入 :无
- ** 输出 :无
- ******************************************************/
- void time_init(void)
- {
- TMOD |= 0x01;//time0 工作方式为1
- TH0 = 0xf8;//装载初值
- TL0 = 0x2f;//装载初值,为2ms(65535-63535)
- TR0 = 1;//开启定时器
- ET0 = 1;//打开中断
- EA=1;
- }
- /******************************************************
- ** 函数名:key_scan
- ** 描述 :按键扫描
- ** 输入 :无
- ** 输出 :无
- ******************************************************/
- void key_scan(void)
- {
- static unsigned char key_in_flag = 0;//按键按下标志
- unsigned char key_l;//存储扫描到行列值。
- key_value = 20;//按键值清除
- if((P3 & 0x0f) != 0x0f)//按键按下
- {
- delay_ms(1);//按键消抖动
- if(((P3 & 0x0f) != 0x0f) && (key_in_flag == 1))
- {
- key_in_flag = 0;//松手检测防止一直触发
- P3 = 0x0f;
- //delay_ms(1);//按键消抖动
- key_l = P3;//扫描得到按键值
- switch(key_l)
- {
- //获取按键值
- case 0x0e:
- {
- key_value = 1;
- }
- break;
- case 0x0d:
- {
- key_value = 2;
- }
- break;
- case 0x0b:
- {
- key_value = 3;
- }
- break;
- //case 0x70:
- //break;
- }
- }
- }
- else
- {
- key_in_flag = 1;//(按键松开标志)
- }
- }
- /*******************************************************************************
- * 函 数 名 : LcdWriteCom
- * 函数功能 : 向LCD写入一个字节的命令
- * 输 入 : u8com
- * 输 出 : 无
- *******************************************************************************/
- void lcd_wri_com(unsigned char com) //写入命令
- {
- E = 0; //使能清零
- RS = 0; //选择写入命令
- RW = 0; //选择写入
- DB = com;
- delay_ms(1);
- E = 1; //写入时序
- delay_ms(5);
- E = 0;
- }
- /*******************************************************************************
- * 函 数 名 : LcdWriteData
- * 函数功能 : 向LCD写入一个字节的数据
- * 输 入 : u8dat
- * 输 出 : 无
- *******************************************************************************/
- void lcd_wri_data(unsigned char dat)//写入数据
- {
- E = 0; //使能清零
- RS = 1; //选择写入数据
- RW = 0; //选择写入
- DB = dat;
- delay_ms(1);
- E = 1; //写入时序
- delay_ms(5);
- E = 0;
- }
- /*******************************************************************************
- * 函 数 名 : WriString
- * 函数功能 : 刷新屏幕显示
- * 输 入 : hang,add,*p
- * 输 出 : 无
- *******************************************************************************/
- void wri_string(unsigned char y,unsigned char x,unsigned char *p)
- {
- if(y==1)//如果选择第一行
- lcd_wri_com(0x80+x);//选中地址
- else
- lcd_wri_com(0xc0+x);//选中地址
- while(*p)
- {
- lcd_wri_data(*p);//写入数据
- p++;
- }
- }
- /*******************************************************************************
- * 函 数 名 : lcd_write_char
- * 函数功能 :
- * 输 入 :
- * 输 出 : 无
- *******************************************************************************/
- void lcd_write_char(unsigned char y, unsigned char x, unsigned char dat) //列x=0~15,行y=0,1
- {
- unsigned char temp_l, temp_h;
- if(y==1)//如果选择第一行
- lcd_wri_com(0x80+x);//选中地址
- else
- lcd_wri_com(0xc0+x);//选中地址
- temp_l = dat % 10;
- temp_h = dat / 10;
- lcd_wri_data(temp_h + 0x30); //convert to ascii
- lcd_wri_data(temp_l + 0x30);
- }
- /*********************光标控制***********************/
- void lcd1602_guanbiao(unsigned char y, unsigned char x,unsigned char on_off)
- {
- if(on_off == 1) //开光标
- {
- if(y==1)//如果选择第一行
- lcd_wri_com(0x80+x);
- else
- lcd_wri_com(0xc0+x);//将光标移动到秒个位
- lcd_wri_com(0x0f);//显示光标并且闪烁
- }
- else
- {
- if(y==1)//如果选择第一行
- lcd_wri_com(0x80+x);
- else
- lcd_wri_com(0xc0+x);//将光标移动到秒个位
- lcd_wri_com(0x0c); //关光标
- }
- }
- /*******************************************************************************
- * 函 数 名 : LcdInit()
- * 函数功能 : 初始化LCD屏
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void lcd_init(void) //LCD初始化子程序
- {
- lcd_wri_com(0x38);//置功能8位双行
- lcd_wri_com(0x0c);//显示开关光标
- lcd_wri_com(0x06);//字符进入模式屏幕不动字符后移
- delay_ms(5);//延时5ms
- lcd_wri_com(0x01); //清屏
- wri_string(1,0,"welcome user DHT");//初始化显示
- wri_string(2,0,"H: %RH T: C ");//初始化显示
- }
- /*********************************************************/
- // 往SHT11写入一个字节
- /*********************************************************/
- char ShtWriteByte(unsigned char value)
- {
- unsigned char i,error=0;
- for(i=128;i>0;i>>=1) // 高位为1,循环右移
- {
- if (i&value)
- Data_P=1; // 和要发送的数相与,结果为发送的位
- else
- Data_P=0;
- Sck_P=1;
- _nop_(); // 延时3us
- _nop_();
- _nop_();
- Sck_P=0;
- }
- Data_P=1; // 释放数据线
- Sck_P=1;
- error=Data_P; // 检查应答信号,确认通讯正常
- _nop_();
- _nop_();
- _nop_();
- Sck_P=0;
- Data_P=1;
- return error; // error=1 通讯错误
- }
- /*********************************************************/
- // 从SHT11读出一个字节
- /*********************************************************/
- char ShtReadByte(unsigned char ack)
- {
- unsigned char i,val=0;
- Data_P=1; // 释放数据线
- for(i=0x80;i>0;i>>=1) // 高位为1,循环右移
- {
- Sck_P=1;
- if(Data_P)
- val=(val|i); // 读一位数据线的值
- Sck_P=0;
- }
- Data_P=!ack; // 如果是校验,读取完后结束通讯
- Sck_P=1;
- _nop_(); // 延时3us
- _nop_();
- _nop_();
- Sck_P=0;
- _nop_();
- _nop_();
- _nop_();
- Data_P=1; // 释放数据线
- return val;
- }
- /*********************************************************/
- // SHT11启动传输
- /*********************************************************/
- void ShtTransStart(void)
- {
- Data_P=1;
- Sck_P=0;
- _nop_();
- Sck_P=1;
- _nop_();
- Data_P=0;
- _nop_();
- Sck_P=0;
- _nop_();
- _nop_();
- _nop_();
- Sck_P=1;
- _nop_();
- Data_P=1;
- _nop_();
- Sck_P=0;
- }
- /*********************************************************/
- // SHT11连接复位
- /*********************************************************/
- void ShtConnectReset(void)
- {
- unsigned char i;
- Data_P=1; //准备
- Sck_P=0;
- for(i=0;i<9;i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
- {
- Sck_P=1;
- Sck_P=0;
- }
- ShtTransStart(); //启动传输
- }
- /*********************************************************/
- // SHT11温湿度检测
- /*********************************************************/
- char ShtMeasure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
- {
- unsigned error=0;
- unsigned int i;
- ShtTransStart(); // 启动传输
- switch(mode) // 选择发送命令
- {
- case 1 : // 测量温度
- error+=ShtWriteByte(0x03);
- break;
- case 2 : // 测量湿度
- error+=ShtWriteByte(0x05);
- break;
- default:
- break;
- }
- for(i=0;i<65535;i++)
- if(Data_P==0)
- break; // 等待测量结束
- if(Data_P)
- error+=1; // 如果长时间数据线没有拉低,说明测量错误
- *(p_value) =ShtReadByte(1); // 读第一个字节,高字节 (MSB)
- *(p_value+1)=ShtReadByte(1); // 读第二个字节,低字节 (LSB)
- *p_checksum =ShtReadByte(0); // read CRC校验码
- return error; // error=1 通讯错误
- }
- /*********************************************************/
- // SHT11温湿度值标度变换及温度补偿
- /*********************************************************/
- void CalcSHT11(float *p_humidity ,float *p_temperature)
- {
- const float C1=-4.0; // 12位湿度精度 修正公式
- const float C2=+0.0405; // 12位湿度精度 修正公式
- const float C3=-0.0000028; // 12位湿度精度 修正公式
- const float T1=+0.01; // 14位温度精度 5V条件 修正公式
- const float T2=+0.00008; // 14位温度精度 5V条件 修正公式
- float rh=*p_humidity; // rh: 12位 湿度
- float t=*p_temperature; // t: 14位 温度
- float rh_lin; // rh_lin: 湿度 linear值
- float rh_true; // rh_true: 湿度 ture值
- float t_C; // t_C : 温度 ℃
- t_C=t*0.01 - 40; //补偿温度
- rh_lin=C3*rh*rh + C2*rh + C1; //相对湿度非线性补偿
- rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相对湿度对于温度依赖性补偿
- *p_temperature=t_C; //返回温度结果
- *p_humidity=rh_true; //返回湿度结果
- }
- /*********************************************************/
- // 温度校正
- /*********************************************************/
- unsigned char TempCorrect(int temp)
- {
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
|
-
0.png
(16.58 KB, 下载次数: 46)
评分
-
查看全部评分
|