找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4913|回复: 4
打印 上一主题 下一主题
收起左侧

单片机温湿度报警单片机设计 仿真源码等资料有错误

  [复制链接]
跳转到指定楼层
楼主
ID:255364 发表于 2017-12-4 22:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机温湿度资料有问题 无法仿真

有错误 求指导:
错误的温湿度设计.7z (178.67 KB, 下载次数: 299)

单片机温湿度仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

  拿到仿真文件后请运行下,我有安装文件提供给亲。很多买家直接一句话运行不了要求退款,或者有些人提出我原理图只要99se格式,给转换后又说打不开直接退货。我碰到了很多。虽然这没什么钱也不多一碗面的钱都不够。作为IT民工加攻城狮来说自己写的程序就这么被人忽悠了实在懵逼。如果亲确认需要,确认收货后我把源文件发送给亲。防小人,望亲谅解。

附带下面的论文:
单片机温湿度毕业设计.docx
基于AT89C52单片机和SHT10温湿度传感器的温、湿度监测系统的设计.doc
基于C52单片机花房温湿度控制系统的是合计与仿真.doc
基于单片机的温度显示报警系统设计.docx
基于单片机的温度检测和报警系统.doc
基于单片机的温度采集系统设计4.doc
基于单片机的温湿度报警器设计.doc
基于单片机的温湿度检测报警系统.doc
室内温度控制报警器-(优秀毕业设计).doc
温度报警器毕业论文.docx
    亲你好:
        拿到仿真文件后请运行下,我有安装文件提供给亲。很多买家直接一句话运行不了要求退款,或者有些人提出我原理图只要99se格式,给转换后又说打不开直接退货。我碰到了很多。虽然这没什么钱也不多一碗面的钱都不够。作为IT民工加攻城狮来说自己写的程序就这么被人忽悠了实在懵逼。如果亲确认需要,确认收货后我把源文件发送给亲。防小人,望亲谅解。

单片机源程序如下:
  1. #include "reg52.H"
  2. #include "stdio.h"
  3. #include "intrins.h"
  4. #include <math.h>

  5. #define DB P0//液晶并行数据接口
  6. sbit  RS = P2^0;//液晶指令数据信号
  7. sbit  RW = P2^1;//液晶读写信号
  8. sbit  E  = P2^2;//液晶使能信号


  9. unsigned char  key_value;//获取到按键的值

  10. sbit Sck_P     = P1^1;                        // SHT11传感器的时钟管脚
  11. sbit Data_P    = P1^0;                        // SHT11传感器的数据管脚

  12. unsigned char temp;                                                        // 保存温度
  13. unsigned char humi;                                                  // 保存湿度

  14. enum { TEMP,HUMI };
  15. typedef union                              //定义共用同类型
  16. {
  17.         unsigned int i;
  18.         float f;
  19. }value;

  20. //是否应答
  21. #define NACK        0
  22. #define ACK                1
  23. //SHT75传感器命令集                地址                命令        读/写
  24. #define MEASURE_TEMP        0x03        //000 0001  1
  25. #define MEASURE_HUMI        0x05        //000 0010  1
  26. #define STATUS_REG_W        0x06        //000 0011  0
  27. #define STATUS_REG_R        0x07        //000 0011  1
  28. #define RESET                        0x1E        //000 1111  0

  29. unsigned char now_window;//当前显示窗口
  30. unsigned char curr_menu;
  31. #define  normal_mode  0x10//输入密码状态
  32. #define  set_mode  0x20//输入密码状态

  33. signed char AlarmTL=10;                                // 温度下限报警值
  34. signed char AlarmTH=30;                                // 温度上限报警值
  35. signed char AlarmHL=40;                             // 湿度下限报警值
  36. signed char AlarmHH=80;                                // 湿度上限报警值

  37. unsigned char i;
  38. unsigned char cnt_100ms;
  39. unsigned char time_100ms_flag;
  40. unsigned char open_del;//开锁成功延时计数
  41. unsigned char open_flag;//锁状态标志
  42. sbit beep = P1^2;

  43. sbit LedTL_P   = P1^3;                        // 温度过低报警指示灯
  44. sbit LedTH_P   = P1^4;                        // 温度过高报警指示灯
  45. sbit LedHL_P   = P1^5;                        // 湿度过低报警指示灯
  46. sbit LedHH_P   = P1^6;                        // 湿度过高报警指示灯

  47. /*******************************************************************************
  48. * 函 数 名         : delay_ms
  49. * 函数功能                   : 延时函数,延时1ms
  50. * 输    入         : cnt
  51. * 输    出         : 无
  52. * 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
  53. *******************************************************************************/
  54. void delay_ms(unsigned int cnt)   //
  55. {
  56.         unsigned int x;
  57.         for( ; cnt>0; cnt--)
  58.         {
  59.                 for(x=110; x>0; x--);//软件延时为1MS
  60.         }
  61. }
  62. #if 0
  63. void delay_us(unsigned int cnt)   //
  64. {
  65.         while(cnt--);
  66. }
  67. #endif
  68. /******************************************************
  69. ** 函数名:time_init
  70. ** 描述  :定时器初始化
  71. ** 输入  :无
  72. ** 输出  :无
  73. ******************************************************/
  74. void time_init(void)
  75. {
  76.           TMOD |= 0x01;//time0 工作方式为1
  77.           TH0 = 0xf8;//装载初值
  78.           TL0 = 0x2f;//装载初值,为2ms(65535-63535)
  79.       TR0 = 1;//开启定时器
  80.           ET0 = 1;//打开中断
  81.           EA=1;
  82. }
  83. /******************************************************
  84. ** 函数名:key_scan
  85. ** 描述  :按键扫描
  86. ** 输入  :无
  87. ** 输出  :无
  88. ******************************************************/
  89. void key_scan(void)
  90. {
  91.         static unsigned char key_in_flag = 0;//按键按下标志
  92.         unsigned char key_l;//存储扫描到行列值。
  93.         key_value = 20;//按键值清除
  94.         if((P3 & 0x0f) != 0x0f)//按键按下
  95.         {
  96.                 delay_ms(1);//按键消抖动
  97.                 if(((P3 & 0x0f) != 0x0f) && (key_in_flag == 1))
  98.                 {
  99.                         key_in_flag = 0;//松手检测防止一直触发
  100.                         P3 = 0x0f;
  101.             //delay_ms(1);//按键消抖动
  102.                         key_l = P3;//扫描得到按键值
  103.                         switch(key_l)
  104.                         {
  105.                                 //获取按键值
  106.                                 case 0x0e:
  107.                                 {
  108.                                         key_value = 1;
  109.                                 }
  110.                                 break;
  111.                                 case 0x0d:
  112.                                 {
  113.                                         key_value = 2;
  114.                                 }
  115.                                 break;
  116.                                 case 0x0b:
  117.                                 {
  118.                                         key_value = 3;
  119.                                 }
  120.                                 break;
  121.                                 //case 0x70:
  122.                                 //break;
  123.                         }
  124.                 }
  125.         }
  126.         else
  127.         {
  128.                 key_in_flag = 1;//(按键松开标志)
  129.         }

  130. }

  131. /*******************************************************************************
  132. * 函 数 名         : LcdWriteCom
  133. * 函数功能                   : 向LCD写入一个字节的命令
  134. * 输    入         : u8com
  135. * 输    出         : 无
  136. *******************************************************************************/
  137. void lcd_wri_com(unsigned char com)          //写入命令
  138. {
  139.         E = 0;         //使能清零
  140.         RS = 0;         //选择写入命令
  141.         RW = 0;         //选择写入

  142.         DB = com;
  143.         delay_ms(1);

  144.         E = 1;         //写入时序
  145.         delay_ms(5);
  146.         E = 0;
  147. }

  148. /*******************************************************************************
  149. * 函 数 名         : LcdWriteData
  150. * 函数功能                   : 向LCD写入一个字节的数据
  151. * 输    入         : u8dat
  152. * 输    出         : 无
  153. *******************************************************************************/

  154. void lcd_wri_data(unsigned char dat)//写入数据
  155. {
  156.         E = 0;          //使能清零
  157.         RS = 1;          //选择写入数据
  158.         RW = 0;          //选择写入
  159.         DB = dat;
  160.         delay_ms(1);
  161.         E = 1;          //写入时序
  162.         delay_ms(5);
  163.         E = 0;
  164. }
  165. /*******************************************************************************
  166. * 函 数 名         : WriString
  167. * 函数功能                   : 刷新屏幕显示
  168. * 输    入         : hang,add,*p
  169. * 输    出         : 无
  170. *******************************************************************************/
  171. void wri_string(unsigned char y,unsigned char x,unsigned char *p)
  172. {
  173.         if(y==1)//如果选择第一行
  174.                 lcd_wri_com(0x80+x);//选中地址
  175.         else
  176.                 lcd_wri_com(0xc0+x);//选中地址
  177.                 while(*p)
  178.                 {
  179.                         lcd_wri_data(*p);//写入数据
  180.                         p++;
  181.                 }
  182. }
  183. /*******************************************************************************
  184. * 函 数 名         : lcd_write_char
  185. * 函数功能                   :
  186. * 输    入         :
  187. * 输    出         : 无
  188. *******************************************************************************/
  189. void lcd_write_char(unsigned char y, unsigned char x, unsigned char dat) //列x=0~15,行y=0,1
  190. {
  191.         unsigned char temp_l, temp_h;
  192.         if(y==1)//如果选择第一行
  193.                 lcd_wri_com(0x80+x);//选中地址
  194.         else
  195.                 lcd_wri_com(0xc0+x);//选中地址
  196.         temp_l = dat % 10;
  197.     temp_h = dat / 10;
  198.     lcd_wri_data(temp_h + 0x30);          //convert to ascii
  199.     lcd_wri_data(temp_l + 0x30);
  200. }
  201. /*********************光标控制***********************/
  202. void lcd1602_guanbiao(unsigned char y, unsigned char x,unsigned char on_off)
  203. {
  204.         if(on_off == 1)   //开光标
  205.         {
  206.                 if(y==1)//如果选择第一行
  207.                 lcd_wri_com(0x80+x);
  208.             else
  209.                 lcd_wri_com(0xc0+x);//将光标移动到秒个位
  210.                 lcd_wri_com(0x0f);//显示光标并且闪烁
  211.         }
  212.         else
  213.         {
  214.         if(y==1)//如果选择第一行
  215.                 lcd_wri_com(0x80+x);
  216.             else
  217.                 lcd_wri_com(0xc0+x);//将光标移动到秒个位
  218.                 lcd_wri_com(0x0c);   //关光标
  219.         }
  220. }

  221. /*******************************************************************************
  222. * 函 数 名       : LcdInit()
  223. * 函数功能                 : 初始化LCD屏
  224. * 输    入       : 无
  225. * 输    出       : 无
  226. *******************************************************************************/
  227. void lcd_init(void)                                                  //LCD初始化子程序
  228. {
  229.         lcd_wri_com(0x38);//置功能8位双行
  230.         lcd_wri_com(0x0c);//显示开关光标
  231.         lcd_wri_com(0x06);//字符进入模式屏幕不动字符后移
  232.         delay_ms(5);//延时5ms
  233.         lcd_wri_com(0x01);  //清屏
  234.         wri_string(1,0,"welcome user DHT");//初始化显示
  235.         wri_string(2,0,"H:   %RH T:   C ");//初始化显示
  236. }

  237. /*********************************************************/
  238. // 往SHT11写入一个字节
  239. /*********************************************************/
  240. char ShtWriteByte(unsigned char value)
  241. {
  242.         unsigned char i,error=0;
  243.         for(i=128;i>0;i>>=1)  // 高位为1,循环右移
  244.         {
  245.                 if (i&value)
  246.                         Data_P=1;               // 和要发送的数相与,结果为发送的位
  247.                 else
  248.                         Data_P=0;
  249.                 Sck_P=1;
  250.                 _nop_();                                                // 延时3us
  251.                 _nop_();
  252.                 _nop_();
  253.                 Sck_P=0;
  254.         }
  255.         Data_P=1;                                            // 释放数据线
  256.         Sck_P=1;
  257.         error=Data_P;                                  // 检查应答信号,确认通讯正常
  258.         _nop_();
  259.         _nop_();
  260.         _nop_();
  261.         Sck_P=0;
  262.         Data_P=1;
  263.         return error;                                 // error=1 通讯错误
  264. }


  265. /*********************************************************/
  266. // 从SHT11读出一个字节
  267. /*********************************************************/
  268. char ShtReadByte(unsigned char ack)
  269. {
  270.         unsigned char i,val=0;
  271.         Data_P=1;                                                 // 释放数据线
  272.         for(i=0x80;i>0;i>>=1)        // 高位为1,循环右移
  273.         {
  274.                 Sck_P=1;
  275.                 if(Data_P)
  276.                         val=(val|i);            // 读一位数据线的值
  277.                 Sck_P=0;
  278.         }
  279.         Data_P=!ack;                            // 如果是校验,读取完后结束通讯
  280.         Sck_P=1;
  281.         _nop_();                                                        // 延时3us
  282.         _nop_();
  283.         _nop_();
  284.         Sck_P=0;
  285.         _nop_();
  286.         _nop_();
  287.         _nop_();
  288.         Data_P=1;                                                 // 释放数据线
  289.         return val;
  290. }


  291. /*********************************************************/
  292. // SHT11启动传输
  293. /*********************************************************/
  294. void ShtTransStart(void)
  295. {
  296.         Data_P=1;
  297.         Sck_P=0;
  298.         _nop_();
  299.         Sck_P=1;
  300.         _nop_();
  301.         Data_P=0;
  302.         _nop_();
  303.         Sck_P=0;
  304.         _nop_();
  305.         _nop_();
  306.         _nop_();
  307.         Sck_P=1;
  308.         _nop_();
  309.         Data_P=1;
  310.         _nop_();
  311.         Sck_P=0;
  312. }


  313. /*********************************************************/
  314. // SHT11连接复位
  315. /*********************************************************/
  316. void ShtConnectReset(void)
  317. {
  318.         unsigned char i;
  319.         Data_P=1;                                    //准备
  320.         Sck_P=0;
  321.         for(i=0;i<9;i++)          //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
  322.         {
  323.                 Sck_P=1;
  324.                 Sck_P=0;
  325.         }
  326.         ShtTransStart();           //启动传输
  327. }
  328. /*********************************************************/
  329. // SHT11温湿度检测
  330. /*********************************************************/
  331. char ShtMeasure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
  332. {
  333.         unsigned error=0;
  334.         unsigned int i;
  335.         ShtTransStart();                  // 启动传输
  336.         switch(mode)                       // 选择发送命令
  337.         {
  338.                 case 1 :                                           // 测量温度
  339.                         error+=ShtWriteByte(0x03);
  340.                         break;
  341.                 case 2 :                                           // 测量湿度
  342.                         error+=ShtWriteByte(0x05);
  343.                         break;
  344.                 default:
  345.                         break;
  346.         }
  347.         for(i=0;i<65535;i++)
  348.                 if(Data_P==0)
  349.                         break;                                          // 等待测量结束
  350.                 if(Data_P)
  351.                         error+=1;                           // 如果长时间数据线没有拉低,说明测量错误
  352.         *(p_value) =ShtReadByte(1);                  // 读第一个字节,高字节 (MSB)
  353.         *(p_value+1)=ShtReadByte(1);                 // 读第二个字节,低字节 (LSB)
  354.         *p_checksum =ShtReadByte(0);          // read CRC校验码
  355.         return error;                                                                          // error=1 通讯错误
  356. }
  357. /*********************************************************/
  358. // SHT11温湿度值标度变换及温度补偿
  359. /*********************************************************/
  360. void CalcSHT11(float *p_humidity ,float *p_temperature)
  361. {
  362.         const float C1=-4.0;                                 // 12位湿度精度 修正公式
  363.         const float C2=+0.0405;                        // 12位湿度精度 修正公式
  364.         const float C3=-0.0000028;        // 12位湿度精度 修正公式
  365.         const float T1=+0.01;                                 // 14位温度精度 5V条件 修正公式
  366.         const float T2=+0.00008;                 // 14位温度精度 5V条件 修正公式
  367.         float rh=*p_humidity;                                 // rh: 12位 湿度
  368.         float t=*p_temperature;                        // t:  14位 温度
  369.         float rh_lin;                                                                // rh_lin: 湿度 linear值
  370.         float rh_true;                                                        // rh_true: 湿度 ture值
  371.         float t_C;                                                                         // t_C : 温度 ℃
  372.         t_C=t*0.01 - 40;                                                 //补偿温度
  373.         rh_lin=C3*rh*rh + C2*rh + C1;                                        //相对湿度非线性补偿
  374.         rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;                //相对湿度对于温度依赖性补偿
  375.         *p_temperature=t_C;                                         //返回温度结果
  376.         *p_humidity=rh_true;                                 //返回湿度结果
  377. }
  378. /*********************************************************/
  379. // 温度校正
  380. /*********************************************************/
  381. unsigned char TempCorrect(int temp)
  382. {
  383.         
  384. ……………………

  385. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

0.png (16.58 KB, 下载次数: 40)

0.png

评分

参与人数 2黑币 +55 收起 理由
dingqinhong + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶3 踩2
回复

使用道具 举报

沙发
ID:290912 发表于 2018-3-12 17:51 | 只看该作者
同求
回复

使用道具 举报

板凳
ID:652786 发表于 2019-12-1 15:32 | 只看该作者
可以私聊一下吗,程序复制到keil里面翻译没错误,但是没法生成hex文件
回复

使用道具 举报

地板
ID:654535 发表于 2019-12-19 10:51 | 只看该作者
学习单片机12 发表于 2019-12-1 15:32
可以私聊一下吗,程序复制到keil里面翻译没错误,但是没法生成hex文件

你的keil估计没弄好
回复

使用道具 举报

5#
ID:570077 发表于 2020-5-23 00:25 | 只看该作者
感谢分析666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表