找回密码
 立即注册

QQ登录

只需一步,快速开始

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

Proteus仿真1602部分全部都是高电平怎么办啊?

[复制链接]
跳转到指定楼层
楼主
新手小白的问题
如图,1602引脚均为高电平,是怎么回事啊?

下面是程序:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. //#include <math.h>    //Keil library
  4. #define uchar unsigned char
  5. enum {TEMP,HUMI};
  6. sbit DATA = P1^1;
  7. sbit SCK = P1^0;
  8. sbit RS = P2^0;
  9. sbit RW = P2^1;
  10. sbit E = P2^2;
  11. sfr DBPort = 0x80;    //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
  12. /********     DS1602函数声明     ********/
  13. void LCD_Initial();
  14. void GotoXY(unsigned char x, unsigned chary);
  15. void Print(unsigned char *str);
  16. void LCD_Write(bit style, unsigned charinput);
  17. /********     SHT10函数声明      ********/
  18. void s_connectionreset(void);
  19. char s_measure(unsigned char *p_value,unsigned char *p_checksum, unsigned char mode);
  20. void calc_sth10(float *p_humidity ,float*p_temperature);
  21. //float calc_dewpoint(float h,float t);
  22. #endif
  23. /***********************************************************************************************************************************************************/
  24. //SHT10程序(SHT10.c):
  25. //#include<tou.h>
  26. #define noACK 0                       //继续传输数据,用于判断是否结束通讯
  27. #define ACK   1            //结束数据传输;
  28.                                                  //地址 命令  读/写
  29. #define STATUS_REG_W 0x06   //000  0011    0
  30. #define STATUS_REG_R 0x07   //000  0011    1
  31. #define MEASURE_TEMP 0x03   //000  0001    1
  32. #define MEASURE_HUMI 0x05   //000  0010    1
  33. #define RESET        0x1e  //000   1111    0
  34. //写字节程序
  35. char s_write_byte(unsigned char value)   
  36. {
  37.        unsignedchar i,error=0;
  38.        for(i=0x80;i>0;i>>=1)            //高位为1,循环右移
  39.        {
  40.               if (i&value) DATA=1;          //和要发送的数相与,结果为发送的位
  41.            else DATA=0;                        
  42.            SCK=1;                          
  43.            _nop_();_nop_();_nop_();        //延时3us
  44.            SCK=0;
  45.        }
  46.        DATA=1;                           //释放数据线
  47.        SCK=1;                           
  48.        error=DATA;                       //检查应答信号,确认通讯正常
  49.        _nop_();_nop_();_nop_();
  50.        SCK=0;        
  51.        DATA=1;
  52.        returnerror;                     //error=1 通讯错误
  53. }
  54. //读字节程序
  55. char s_read_byte(unsigned char ack)
  56. //----------------------------------------------------------------------------------
  57. {
  58.        unsignedchar i,val=0;
  59.        DATA=1;                           //释放数据线
  60.        for(i=0x80;i>0;i>>=1)             //高位为1,循环右移
  61.        {
  62.               SCK=1;                        
  63.            if(DATA) val=(val|i);        //读一位数据线的值
  64.            SCK=0;      
  65.        }
  66.        DATA=!ack;                        //如果是校验,读取完后结束通讯;
  67.        SCK=1;                           
  68.        _nop_();_nop_();_nop_();          //延时3us
  69.        SCK=0;   
  70.        _nop_();_nop_();_nop_();      
  71.        DATA=1;                           //释放数据线
  72.        returnval;
  73. }
  74. //启动传输
  75. void s_transstart(void)
  76. // generates a transmission start
  77. //      _____         ________
  78. // DATA:      |_______|
  79. //          ___     ___
  80. // SCK : ___|   |___|  |______
  81. {
  82.      DATA=1; SCK=0;                   //准备
  83.      _nop_();
  84.      SCK=1;
  85.      _nop_();
  86.      DATA=0;
  87.      _nop_();
  88.      SCK=0;
  89.       _nop_();_nop_();_nop_();
  90.      SCK=1;
  91.      _nop_();
  92.      DATA=1;   
  93.      _nop_();
  94.      SCK=0;   
  95. }
  96. //连接复位
  97. void s_connectionreset(void)
  98. // communication reset: DATA-line=1 and atleast 9 SCK cycles followed by transstart
  99. //      _____________________________________________________         ________
  100. // DATA:                                                     |_______|
  101. //         _    _    _   _    _    _   _    _    _       ___     ___
  102. // SCK : __| |__| |__| |__| |__| |__| |__||__| |__| |______|   |___|   |______
  103. {
  104.        unsignedchar i;
  105.        DATA=1;SCK=0;                    //准备
  106.        for(i=0;i<9;i++)                  //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
  107.        {
  108.               SCK=1;
  109.            SCK=0;
  110.        }
  111.        s_transstart();                   //启动传输
  112. }
  113. //软复位程序
  114. char s_softreset(void)
  115. // resets the sensor by a softreset
  116. {
  117.        unsignedchar error=0;
  118.        s_connectionreset();              //启动连接复位
  119.        error+=s_write_byte(RESET);       //发送复位命令
  120.        returnerror;                     //error=1 通讯错误
  121. }
  122. /*读状态寄存器
  123. char s_read_statusreg(unsigned char*p_value, unsigned char *p_checksum)
  124. //----------------------------------------------------------------------------------
  125. // reads the status register with checksum(8-bit)
  126. {
  127.        unsignedchar error=0;
  128.        s_transstart();                   //transmission start
  129.        error=s_write_byte(STATUS_REG_R);//send command to sensor
  130.        *p_value=s_read_byte(ACK);        //read status register (8-bit)
  131.        *p_checksum=s_read_byte(noACK);   //read checksum (8-bit)
  132.        returnerror;                     //error=1 incase of no response form the sensor
  133. }
  134. //写状态寄存器
  135. char s_write_statusreg(unsigned char*p_value)
  136. // writes the status register with checksum(8-bit)
  137. {
  138.        unsignedchar error=0;
  139.        s_transstart();                   //transmission start
  140.        error+=s_write_byte(STATUS_REG_W);//sendcommand to sensor
  141.        error+=s_write_byte(*p_value);    //send value of status register
  142.        returnerror;                     //error>=1in case of no response form the sensor
  143. }                                                                                                                              */
  144.          
  145. //温湿度测量
  146. char s_measure(unsigned char *p_value,unsigned char *p_checksum, unsigned char mode)
  147. // 进行温度或者湿度转换,由参数mode决定转换内容;
  148. {
  149. //     enum{TEMP,HUMI};          //已经在头文件中定义
  150.        unsignederror=0;
  151.        unsignedint i;
  152.        s_transstart();                   //启动传输
  153.        switch(mode)                     //选择发送命令
  154.     {     
  155.               case TEMP : error+=s_write_byte(MEASURE_TEMP);break;                 //测量温度
  156.            case HUMI :error+=s_write_byte(MEASURE_HUMI); break;                //测量湿度
  157.            default     : break;
  158.        }
  159.        for(i=0;i<65535;i++) if(DATA==0) break; //等待测量结束
  160.        if(DATA)error+=1;                // 如果长时间数据线没有拉低,说明测量错误
  161.        *(p_value)=s_read_byte(ACK);    //读第一个字节,高字节 (MSB)
  162.        *(p_value+1)=s_read_byte(ACK);    //读第二个字节,低字节 (LSB)
  163.        *p_checksum=s_read_byte(noACK); //read CRC校验码
  164.        returnerror;                                // error=1 通讯错误
  165. }
  166. //温湿度值标度变换及温度补偿
  167. void calc_sth10(float *p_humidity ,float*p_temperature)
  168. {
  169.        constfloat C1=-4.0;              // 12位湿度精度 修正公式
  170.        constfloat C2=+0.0405;           // 12位湿度精度 修正公式
  171.        constfloat C3=-0.0000028;        // 12位湿度精度 修正公式
  172.        constfloat T1=+0.01;             // 14位温度精度 5V条件 修正公式
  173.        constfloat T2=+0.00008;          // 14位温度精度 5V条件  修正公式
  174.        floatrh=*p_humidity;             // rh:      12位湿度
  175.        floatt=*p_temperature;           // t:       14位温度
  176.        floatrh_lin;                     // rh_lin: 湿度 linear值
  177.        floatrh_true;                    // rh_true: 湿度 ture值
  178.        floatt_C;                        // t_C   : 温度 ℃
  179.        t_C=t*0.01- 40;                  //补偿温度
  180.        rh_lin=C3*rh*rh+ C2*rh + C1;     //相对湿度非线性补偿
  181.        rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //相对湿度对于温度依赖性补偿
  182.        if(rh_true>100)rh_true=100;       //湿度最大修正
  183.        if(rh_true<0.1)rh_true=0.1;       //湿度最小修正
  184.        *p_temperature=t_C;               //返回温度结果
  185.        *p_humidity=rh_true;              //返回湿度结果
  186. }
  187. //从相对温度和湿度计算露点
  188. /*float calc_dewpoint(float h,float t)
  189. {
  190.        floatlogEx,dew_point;
  191.        logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
  192.        dew_point= (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
  193.        returndew_point;
  194. }                                                                         */
  195. /***********************************************************************************************************************************************************/
  196. //DS1602程序(1602.c):
  197. //#include<tou.h>
  198. //内部等待函数**************************************************************
  199. unsigned char LCD_Wait(void)
  200. {
  201.    RS=0;
  202.    RW=1;    _nop_();
  203.    E=1;    _nop_();           
  204.    E=0;
  205.    return DBPort;  
  206. }
  207. //向LCD写入命令或数据********************************************************
  208. #define LCD_COMMAND         0     // Command
  209. #define LCD_DATA            1      // Data
  210. #define LCD_CLEAR_SCREEN    0x01     // 清屏
  211. #define LCD_HOMING          0x02      // 光标返回原点
  212. void LCD_Write(bit style, unsigned char input)
  213. {
  214.    E=0;
  215.    RS=style;
  216.    RW=0;        _nop_();
  217.    DBPort=input;   _nop_();//注意顺序
  218.    E=1;        _nop_();//注意顺序
  219.    E=0;        _nop_();
  220.    LCD_Wait();
  221. }
  222. //设置显示模式************************************************************
  223. #define LCD_SHOW            0x04   //显示开
  224. #define LCD_HIDE            0x00    //显示关
  225. #define LCD_CURSOR          0x02    //显示光标
  226. #define LCD_NO_CURSOR       0x00   //无光标        
  227. #define LCD_FLASH           0x01    //光标闪动
  228. #define LCD_NO_FLASH        0x00   //光标不闪动
  229. void LCD_SetDisplay(unsigned charDisplayMode)
  230. {
  231.    LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
  232. }
  233. //设置输入模式************************************************************
  234. #define LCD_AC_UP       0x02
  235. #define LCD_AC_DOWN         0x00      // default
  236. #define LCD_MOVE            0x01      // 画面可平移
  237. #define LCD_NO_MOVE         0x00      //default
  238. void LCD_SetInput(unsigned char InputMode)
  239. {
  240.    LCD_Write(LCD_COMMAND, 0x04|InputMode);
  241. }
  242. //初始化LCD************************************************************
  243. void LCD_Initial()
  244. {
  245.    E=0;
  246.    LCD_Write(LCD_COMMAND,0x38);          //8位数据端口,2行显示,5*7点阵
  247.    LCD_Write(LCD_COMMAND,0x38);
  248.    LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
  249.    LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  250.    LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
  251. }
  252. //液晶字符输入的位置************************
  253. void GotoXY(unsigned char x, unsigned chary)
  254. {
  255.    if(y==0)
  256.        LCD_Write(LCD_COMMAND,0x80|x);
  257.    if(y==1)
  258.        LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  259. }
  260. //将字符输出到液晶显示
  261. void Print(unsigned char *str)
  262. {
  263.    while(*str!='\0')
  264.     {
  265.        LCD_Write(LCD_DATA,*str);
  266.        str++;
  267.     }
  268. }
  269. /***********************************************************************************************************************************************************/
  270. //主函数(main.c):
  271. //#include<tou.h>
  272. typedef union                            //定义共用同类型
  273. {   
  274.        unsignedint i;
  275.        floatf;
  276. } value;
  277. //延时函数
  278. void delay(int z)           //z为毫秒数
  279. {
  280.        intx,y;
  281.        for(x=z;x>0;x--)
  282.               for(y=125;y>0;y--);
  283. }
  284. void main()
  285. {
  286.        unsignedint temp,humi;
  287.        valuehumi_val,temp_val;           //定义两个共同体,一个用于湿度,一个用于温度
  288. //     floatdew_point;                      //用于记录露点值
  289.        unsignedchar error;                 //用于检验是否出现错误
  290.        unsignedchar checksum;                   //CRC                    
  291.        ucharwendu[6];                               //用于记录温度
  292.        ucharshidu[6];                                 //用于记录湿度
  293.       
  294.                                     
  295.        LCD_Initial();                                     //初始化液晶            
  296.      GotoXY(0,0);                                //选择温度显示位置
  297.      Print("TEMP:     %C");                     //5格空格
  298.    GotoXY(0,1);                                //选择湿度显示位置
  299.      Print("HUMI:     %RH");                  //5格空格
  300.        s_connectionreset();                      //启动连接复位
  301.        while(1)
  302.        {
  303.               error=0;                                 //初始化error=0,即没有错误
  304.               error+=s_measure((unsignedchar*)&temp_val.i,&checksum,TEMP); //温度测量
  305.               error+=s_measure((unsignedchar*)&humi_val.i,&checksum,HUMI); //湿度测量
  306.            if(error!=0) s_connectionreset();                 ////如果发生错误,系统复位
  307.            else
  308.            {
  309.                      humi_val.f=(float)humi_val.i;                   //转换为浮点数
  310.                  temp_val.f=(float)temp_val.i;                   //转换为浮点数
  311.                  calc_sth10(&humi_val.f,&temp_val.f);            //修正相对湿度及温度
  312. //                 dew_point=calc_dewpoint(humi_val.f,temp_val.f);//计算e dew_point
  313.                    temp=temp_val.f*10;
  314.                  humi=humi_val.f*10;
  315.                  GotoXY(5,0);                                    //设置温度显示位置
  316.                wendu[0]=temp/1000+'0';               //温度百位
  317.                wendu[1]=temp%1000/100+'0';      //温度十位     
  318.                    wendu[2]=temp%100/10+'0';                     //温度个位
  319.                wendu[3]=0x2E;                                       //小数点
  320.                    wendu[4]=temp%10+'0';                           //温度小数点后第一位        
  321.                      Print(wendu);                                    //输出温度            
  322.                   GotoXY(5,1);                                    //设置湿度显示位置                                 
  323.                      shidu[0]=humi/1000+'0';                //湿度百位
  324.                shidu[1]=humi%1000/100+'0';        //湿度十位     
  325.                    shidu[2]=humi%100/10+'0';                //湿度个位
  326.                shidu[3]=0x2E;                                        //小数点
  327.                    shidu[4]=humi%10+'0';                      //湿度小数点后第一位
  328.                      Print(shidu);                                      //输出湿度        
  329.            }  
  330.               delay(800);                             //等待足够长的时间,以现行下一次转换                    
  331.        }
  332. }
复制代码


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

使用道具 举报

沙发
ID:96682 发表于 2019-4-18 16:50 | 只看该作者
芯片载入程序没有?
回复

使用道具 举报

板凳
ID:515587 发表于 2019-4-20 13:47 | 只看该作者
wc86110 发表于 2019-4-18 16:50
芯片载入程序没有?

载入了的
回复

使用道具 举报

地板
ID:213173 发表于 2019-4-20 21:40 | 只看该作者
你这个程序怎么搞得这么乱,整理了好半天才通过编译。



  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char

  4. #define noACK 0                       //继续传输数据,用于判断是否结束通讯
  5. #define ACK   1            //结束数据传输;
  6.                                                  //地址 命令  读/写
  7. #define STATUS_REG_W 0x06   //000  0011    0
  8. #define STATUS_REG_R 0x07   //000  0011    1
  9. #define MEASURE_TEMP 0x03   //000  0001    1
  10. #define MEASURE_HUMI 0x05   //000  0010    1
  11. #define RESET        0x1e  //000   1111    0

  12. #define LCD_COMMAND         0     // Command
  13. #define LCD_DATA            1      // Data
  14. #define LCD_CLEAR_SCREEN    0x01     // 清屏
  15. #define LCD_HOMING          0x02      // 光标返回原点

  16. #define LCD_SHOW            0x04   //显示开
  17. #define LCD_HIDE            0x00    //显示关
  18. #define LCD_CURSOR          0x02    //显示光标
  19. #define LCD_NO_CURSOR       0x00   //无光标        
  20. #define LCD_FLASH           0x01    //光标闪动
  21. #define LCD_NO_FLASH        0x00   //光标不闪动

  22. #define LCD_AC_UP           0x02
  23. #define LCD_AC_DOWN         0x00      // default
  24. #define LCD_MOVE            0x01      // 画面可平移
  25. #define LCD_NO_MOVE         0x00      //default

  26. enum {TEMP,HUMI};
  27. sbit DATA = P1^1;
  28. sbit SCK = P1^0;
  29. sbit RS = P2^0;
  30. sbit RW = P2^1;
  31. sbit E = P2^2;
  32. sfr DBPort = 0x80;    //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
  33. /********     DS1602函数声明     ********/
  34. void LCD_Initial();
  35. void GotoXY(unsigned char x, unsigned char y);
  36. void Print(unsigned char *str);
  37. void LCD_Write(bit style, unsigned char input);
  38. /********     SHT10函数声明      ********/
  39. void s_connectionreset(void);
  40. char s_measure(unsigned char *p_value,unsigned char *p_checksum, unsigned char mode);
  41. void calc_sth10(float *p_humidity ,float*p_temperature);
  42. char s_softreset(void);
  43. /***********************************************************************************************************************************************************/
  44. //写字节程序
  45. char s_write_byte(unsigned char value)   
  46. {
  47.         unsigned char i,error=0;
  48.         for(i=0x80;i>0;i>>=1)            //高位为1,循环右移
  49.         {
  50.                 if (i&value) DATA=1;          //和要发送的数相与,结果为发送的位
  51.                 else DATA=0;                        
  52.                 SCK=1;                          
  53.                 _nop_();_nop_();_nop_();        //延时3us
  54.                 SCK=0;
  55.         }
  56.         DATA=1;                           //释放数据线
  57.         SCK=1;                           
  58.         error=DATA;                       //检查应答信号,确认通讯正常
  59.         _nop_();_nop_();_nop_();
  60.         SCK=0;        
  61.         DATA=1;
  62.         return error;                     //error=1 通讯错误
  63. }
  64. //读字节程序
  65. char s_read_byte(unsigned char ack)
  66. {
  67.         unsigned char i,val=0;
  68.         DATA=1;                           //释放数据线
  69.         for(i=0x80;i>0;i>>=1)             //高位为1,循环右移
  70.         {
  71.                 SCK=1;                        
  72.                 if(DATA) val=(val|i);        //读一位数据线的值
  73.                 SCK=0;      
  74.         }
  75.         DATA=!ack;                        //如果是校验,读取完后结束通讯;
  76.         SCK=1;                           
  77.         _nop_();_nop_();_nop_();          //延时3us
  78.         SCK=0;   
  79.         _nop_();_nop_();_nop_();      
  80.         DATA=1;                           //释放数据线
  81.         return val;
  82. }
  83. //启动传输
  84. void s_transstart(void)
  85. {
  86.         DATA=1; SCK=0;                   //准备
  87.         _nop_();
  88.         SCK=1;
  89.         _nop_();
  90.         DATA=0;
  91.         _nop_();
  92.         SCK=0;
  93.         _nop_();_nop_();_nop_();
  94.         SCK=1;
  95.         _nop_();
  96.         DATA=1;   
  97.         _nop_();
  98.         SCK=0;   
  99. }
  100. //连接复位
  101. void s_connectionreset(void)
  102. {
  103.         unsigned char i;
  104.         DATA=1;SCK=0;                    //准备
  105.         for(i=0;i<9;i++)                  //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
  106.         {
  107.                 SCK=1;
  108.                 SCK=0;
  109.         }
  110.         s_transstart();                   //启动传输
  111. }
  112. //软复位程序
  113. /*
  114. char s_softreset(void)
  115. {
  116.         unsigned char error=0;
  117.         s_connectionreset();              //启动连接复位
  118.         error+=s_write_byte(RESET);       //发送复位命令
  119.         return  error;                     //error=1 通讯错误
  120. }*/
  121. /*读状态寄存器
  122. char s_read_statusreg(unsigned char*p_value, unsigned char *p_checksum)
  123. //----------------------------------------------------------------------------------
  124. // reads the status register with checksum(8-bit)
  125. {
  126.        unsignedchar error=0;
  127.        s_transstart();                   //transmission start
  128.        error=s_write_byte(STATUS_REG_R);//send command to sensor
  129.        *p_value=s_read_byte(ACK);        //read status register (8-bit)
  130.        *p_checksum=s_read_byte(noACK);   //read checksum (8-bit)
  131.        returnerror;                     //error=1 incase of no response form the sensor
  132. }
  133. //写状态寄存器
  134. char s_write_statusreg(unsigned char*p_value)
  135. // writes the status register with checksum(8-bit)
  136. {
  137.        unsignedchar error=0;
  138.        s_transstart();                   //transmission start
  139.        error+=s_write_byte(STATUS_REG_W);//sendcommand to sensor
  140.        error+=s_write_byte(*p_value);    //send value of status register
  141.        returnerror;                     //error>=1in case of no response form the sensor
  142. }                                                                                                                              */
  143.          
  144. //温湿度测量
  145. char s_measure(unsigned char *p_value,unsigned char *p_checksum, unsigned char mode)
  146. // 进行温度或者湿度转换,由参数mode决定转换内容;
  147. {
  148. // enum{TEMP,HUMI};          //已经在头文件中定义
  149.         unsigned char error=0;
  150.         unsigned int i;
  151.         s_transstart();                   //启动传输
  152.         switch(mode)                     //选择发送命令
  153.         {     
  154.                 case TEMP : error+=s_write_byte(MEASURE_TEMP);break;                 //测量温度
  155.                 case HUMI :error+=s_write_byte(MEASURE_HUMI); break;                //测量湿度
  156.                 default     : break;
  157.         }
  158.         for(i=0;i<65535;i++) if(DATA==0) break; //等待测量结束
  159.         if(DATA)error+=1;                // 如果长时间数据线没有拉低,说明测量错误
  160.         *(p_value)=s_read_byte(ACK);    //读第一个字节,高字节 (MSB)
  161.         *(p_value+1)=s_read_byte(ACK);    //读第二个字节,低字节 (LSB)
  162.         *p_checksum=s_read_byte(noACK); //read CRC校验码
  163.         return error;  // error=1 通讯错误
  164. }
  165. //温湿度值标度变换及温度补偿
  166. void calc_sth10(float *p_humidity ,float*p_temperature)
  167. {
  168.         const float C1=-4.0;              // 12位湿度精度 修正公式
  169.         const float C2=+0.0405;           // 12位湿度精度 修正公式
  170.         const float C3=-0.0000028;        // 12位湿度精度 修正公式
  171.         const float T1=+0.01;             // 14位温度精度 5V条件 修正公式
  172.         const float T2=+0.00008;          // 14位温度精度 5V条件  修正公式
  173.         float rh=*p_humidity;             // rh:      12位湿度
  174.         float t=*p_temperature;           // t:       14位温度
  175.         float rh_lin;                     // rh_lin: 湿度 linear值
  176.         float rh_true;                    // rh_true: 湿度 ture值
  177.         float t_C;                        // t_C   : 温度 ℃
  178.         t_C=t*0.01- 40;                  //补偿温度
  179.         rh_lin=C3*rh*rh+ C2*rh + C1;     //相对湿度非线性补偿
  180.         rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //相对湿度对于温度依赖性补偿
  181.         if(rh_true>100)rh_true=100;       //湿度最大修正
  182.         if(rh_true<0.1)rh_true=0.1;       //湿度最小修正
  183.         *p_temperature=t_C;               //返回温度结果
  184.         *p_humidity=rh_true;              //返回湿度结果
  185. }
  186. //从相对温度和湿度计算露点
  187. /*float calc_dewpoint(float h,float t)
  188. {
  189.         floatlogEx,dew_point;
  190.         logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
  191.         dew_point= (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
  192.         returndew_point;
  193. }                                                                         */
  194. /***********************************************************************************************************************************************************/

  195. //内部等待函数**************************************************************
  196. unsigned char LCD_Wait(void)
  197. {
  198.    RS=0;
  199.    RW=1;    _nop_();
  200.    E=1;    _nop_();           
  201.    E=0;
  202.    return DBPort;  
  203. }
  204. //向LCD写入命令或数据********************************************************
  205. void LCD_Write(bit style, unsigned char input)
  206. {
  207.         E=0;
  208.         RS=style;
  209.         RW=0;
  210.         _nop_();
  211.         DBPort=input;
  212.         _nop_();//注意顺序
  213.         E=1;      
  214.         _nop_();//注意顺序
  215.         E=0;      
  216.         _nop_();
  217.         LCD_Wait();
  218. }
  219. //设置显示模式************************************************************

  220. void LCD_SetDisplay(unsigned char DisplayMode)
  221. {
  222.    LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
  223. }
  224. //设置输入模式************************************************************


  225. void LCD_SetInput(unsigned char InputMode)
  226. {
  227.    LCD_Write(LCD_COMMAND, 0x04|InputMode);
  228. }
  229. //初始化LCD************************************************************
  230. void LCD_Initial()
  231. {
  232.    E=0;
  233.    LCD_Write(LCD_COMMAND,0x38);          //8位数据端口,2行显示,5*7点阵
  234.    LCD_Write(LCD_COMMAND,0x38);
  235.    LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
  236.    LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  237.    LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
  238. }
  239. //液晶字符输入的位置************************
  240. void GotoXY(unsigned char x, unsigned char y)
  241. {
  242.    if(y==0)
  243.        LCD_Write(LCD_COMMAND,0x80|x);
  244.    if(y==1)
  245.        LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  246. }
  247. //将字符输出到液晶显示
  248. void Print(unsigned char *str)
  249. {
  250.    while(*str!='\0')
  251.     {
  252.        LCD_Write(LCD_DATA,*str);
  253.        str++;
  254.     }
  255. }

  256. typedef union                            //定义共用同类型
  257. {   
  258.         unsigned int i;
  259.         float f;
  260. } value;
  261. //延时函数
  262. void delay(int z)           //z为毫秒数
  263. {
  264.         int x,y;
  265.         for(x=z;x>0;x--)
  266.                 for(y=125;y>0;y--);
  267. }
  268. void main()
  269. {
  270.         unsigned int temp,humi;
  271.         value humi_val,temp_val;           //定义两个共同体,一个用于湿度,一个用于温度
  272.         //floatdew_point;                      //用于记录露点值
  273.         unsigned char error;                 //用于检验是否出现错误
  274.         unsigned char checksum;                   //CRC                    
  275.         uchar wendu[6];                               //用于记录温度
  276.         uchar shidu[6];                                 //用于记录湿度
  277.        
  278.        
  279.         LCD_Initial();                                     //初始化液晶            
  280.         GotoXY(0,0);                                //选择温度显示位置
  281.         Print("TEMP:     %C");                     //5格空格
  282.         GotoXY(0,1);                                //选择湿度显示位置
  283.         Print("HUMI:     %RH");                  //5格空格
  284.         s_connectionreset();                      //启动连接复位
  285.         while(1)
  286.         {
  287.                 error=0;                                 //初始化error=0,即没有错误
  288.                 error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //温度测量
  289.                 error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //湿度测量
  290.                 if(error!=0) s_connectionreset();                 ////如果发生错误,系统复位
  291.                 else
  292.                 {
  293.                         humi_val.f=(float)humi_val.i;                   //转换为浮点数
  294.                         temp_val.f=(float)temp_val.i;                   //转换为浮点数
  295.                         calc_sth10(&humi_val.f,&temp_val.f);            //修正相对湿度及温度
  296.                         //dew_point=calc_dewpoint(humi_val.f,temp_val.f);//计算e dew_point
  297.                         temp=temp_val.f*10;
  298.                         humi=humi_val.f*10;
  299.                         GotoXY(5,0);                                    //设置温度显示位置
  300.                         wendu[0]=temp/1000+'0';               //温度百位
  301.                         wendu[1]=temp%1000/100+'0';      //温度十位     
  302.                         wendu[2]=temp%100/10+'0';                     //温度个位
  303.                         wendu[3]=0x2E;                                       //小数点
  304.                         wendu[4]=temp%10+'0';                           //温度小数点后第一位        
  305.                         Print(wendu);                                    //输出温度            
  306.                         GotoXY(5,1);                                    //设置湿度显示位置                                 
  307.                         shidu[0]=humi/1000+'0';                //湿度百位
  308.                         shidu[1]=humi%1000/100+'0';        //湿度十位     
  309.                         shidu[2]=humi%100/10+'0';                //湿度个位
  310.                         shidu[3]=0x2E;                                        //小数点
  311.                         shidu[4]=humi%10+'0';                      //湿度小数点后第一位
  312.                         Print(shidu);                                      //输出湿度        
  313.                 }  
  314.                 delay(800);                             //等待足够长的时间,以现行下一次转换                    
  315.         }
  316. }
复制代码



回复

使用道具 举报

5#
ID:515587 发表于 2019-4-23 10:37 | 只看该作者
wulin 发表于 2019-4-20 21:40
你这个程序怎么搞得这么乱,整理了好半天才通过编译。

谢谢您
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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