MSP430f149调DHT11的程序,液晶上温度显示50以上怎么回事

2019-07-15 15:58发布

这是程序
  1. #include  <msp430x14x.h>
  2. #include "1602.c"
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define HIGH P2OUT|=BIT1;
  6. #define LOW P2OUT&=~BIT1;
  7. char temph,templ,humdh,humdl,check,cal;
  8. uchar shuzu[]={0,1,2,3,4,5,6};

  9. void delay_1ms(uint z)
  10. {
  11.    uint i,j;
  12.    for(i=z;i>0;i--)  
  13.         for(j=80;j>0;j--);
  14. }        

  15. void DelayNus(uint n)//延时1US函数
  16. {
  17.    
  18.     TACTL|= TASSEL_2+TACLR+ID_3;//定时器A,时钟为SCLK,8分频;   
  19.     TACTL |= MC_1;           //增计数到CCR0
  20.     TACCR0 = n;
  21.     while((TACTL & BIT0)!=0x01);  //等待
  22.     TACTL &= ~MC_1;          //停止计数
  23.     TACTL &= ~BIT0;          //清除中断标志
  24. }

  25. void init_clk()
  26. {
  27.     int i;
  28.     WDTCTL=WDTPW+WDTHOLD;
  29.     BCSCTL1&=~XT2OFF;
  30.     do
  31.     {
  32.       IFG1 &=~OFIFG;
  33.       for(i=0xff;i>0;i--);
  34.     }
  35.     while(IFG1&OFIFG);
  36.     BCSCTL2|= SELM_2+SELS;//SCLK,MCLK都选择为外部时钟     
  37. }

  38. char receive(void)               //接受函数
  39. {
  40.   char temp,cnt=0;                      //临时变量用于存储接受数据
  41.   while(cnt<8)
  42.   {
  43.       while((P2IN&BIT1)==0);              //等待50us的低电平结束
  44.       DelayNus(35);  
  45.       if(P2IN&BIT1)                       //长于30us定义为1
  46.       {
  47.         temp++;                       
  48.         temp<<=1;
  49.         while(P2IN&BIT1);             //结束高电平,即下一位数据的到来
  50.       }
  51.       else
  52.       {
  53.         temp<<=1;
  54.       }
  55.       if(cnt!=7)
  56.          while(!(P2IN&BIT1));              //最后一次给函数返回留下时间
  57.       cnt++;
  58.   }
  59.   return temp;
  60. }
  61. void work_data(void)
  62. {
  63.   P2DIR |= BIT1;    //设置P2.1为输出状态
  64.   HIGH;
  65.   _NOP();_NOP();_NOP();
  66.   LOW;
  67.   DelayNus(18000);    //开始信号
  68.   HIGH;
  69.   DelayNus(30);
  70.   P2DIR&=~BIT1;    //设置P2.1为输入状态,检测传感器响应
  71.   DelayNus(20);     //20US后  P2IN  是否为低电平,不为低电平 说明复位失败,重新开始
  72.   while((P2IN&BIT1)!=0)//如果没有检测到响应信号 继续发送开始信号
  73.   {
  74.       P2DIR |= BIT1;    //设置P2.1为输出状态
  75.       HIGH;
  76.       _NOP();_NOP();_NOP();
  77.       LOW;
  78.       DelayNus(18000);    //开始信号
  79.       HIGH;
  80.       DelayNus(30);
  81.       P2DIR&=~BIT1;    //设置P2.1为输入状态,检测传感器响应
  82.       DelayNus(20);
  83.   }
  84.   while((P2IN&BIT1)==0);//等待拉高,准备输出数据
  85.   while(P2IN&BIT1);  //等待低电平,输出数据
  86.                      //下面开始接受数据  
  87.   humdh=receive();
  88.   humdl=receive();
  89.   temph=receive();
  90.   templ=receive();
  91.   check=receive();
  92.   cal=humdh+humdl+temph+templ;
  93. }

  94. void main()
  95. {            
  96.     char R_shi,R_ge,T_shi,T_ge,T_xs1,T_xs2,R_xs;
  97.     WDTCTL=WDTPW+WDTHOLD;
  98.     P2DIR=0XFF;
  99.     P2OUT=0X00;
  100.     init_clk();
  101.     yejing_init();
  102.     while(1)
  103.      {
  104.       work_data();
  105.       if(check==cal)
  106.       {
  107.         R_shi = 0x30+humdh / 10;
  108.         R_ge = 0x30+humdh % 10;
  109.         R_xs = 0x30+humdl / 10;
  110.         T_shi = 0x30+temph /10;
  111.         T_ge = 0x30+temph % 10;
  112.         T_xs1 = 0x30+templ / 10;
  113.         T_xs2 = 0x30+templ % 10;
  114.         
  115.         
  116.         shuzu[0] = R_shi;
  117.         shuzu[1] = R_ge;
  118.         shuzu[2] = R_xs;
  119.         shuzu[3] = T_shi;
  120.         shuzu[4] = T_ge;
  121.         shuzu[5] = T_xs1;
  122.         shuzu[6] = T_xs2;
  123.         
  124.       LCD_write_char(0,0,shuzu[0]);
  125.       LCD_write_char(1,0,shuzu[1]);
  126.       LCD_write_str(2,0,".");
  127.       LCD_write_char(3,0,shuzu[2]);
  128.       
  129.       LCD_write_char(0,1,shuzu[3]);
  130.       LCD_write_char(1,1,shuzu[4]);
  131.       LCD_write_str(2,1,".");
  132.       LCD_write_char(3,1,shuzu[5]);
  133.       LCD_write_char(4,1,shuzu[6]);
  134.       delay_1ms(3000);//等待下次采样
  135.     }
  136. }
  137. }


  138. /***********************************************
  139. 1602液晶显示程序,主程序中如下写
  140. unsigned char dis[]={1,2,3,4,5,6};
  141. yejing_init(  )初始化
  142. LCD_write_str(0,0,"welloooo");//输出字符串
  143. LCD_write_char(4,1,48+dis[0]);//输出数组

  144. IO P4 RS P25 RW  P24  EN P23
  145. ************************************************/
  146. #include <msp430x14x.h>

  147. #define CPU_F ((double)8000000)
  148. #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) //延时
  149. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

  150. #define RS_CLR                P2OUT &= ~BIT5           //RS置低
  151. #define RS_SET                P2OUT |=  BIT5           //RS置高
  152. #define RW_CLR                P2OUT &= ~BIT4           //RW置低
  153. #define RW_SET                P2OUT |=  BIT4          //RW置高
  154. #define EN_CLR                P2OUT &= ~BIT3           //E置低
  155. #define EN_SET                P2OUT |=  BIT3           //E置高
  156. #define DataPort        P4OUT                     //P4口为数据口

  157. #define uchar unsigned char
  158. #define uint  unsigned int
  159. #define ulong unsigned long

  160. /***************************初始化IO口子程序***********************/
  161. void Port_init()
  162. {

  163.         P4SEL = 0x00;
  164.         P4DIR = 0xFF;                   //数据口输出模式
  165.         P2SEL = 0x00;
  166.         P2DIR|= BIT5 + BIT4 + BIT3;     //控制口设置为输出模式
  167. }

  168. /**************************显示屏命令写入函数***********************/
  169. void LCD_write_com(unsigned char com)
  170. {        
  171.         RS_CLR;
  172.         RW_CLR;
  173.         EN_SET;
  174.         DataPort = com;                 //命令写入端口
  175.         delay_ms(5);
  176.         EN_CLR;
  177. }

  178. /************************显示屏数据写入函数************/
  179. void LCD_write_data(unsigned char data)
  180. {
  181.         RS_SET;
  182.         RW_CLR;
  183.         EN_SET;
  184.         DataPort = data;                //数据写入端口
  185.         delay_ms(5);
  186.         EN_CLR;
  187. }

  188. /*****************************显示屏清空显示*********************/
  189. void LCD_clear(void)
  190. {
  191.         LCD_write_com(0x01);            //清屏幕显示
  192.         delay_ms(5);
  193. }

  194. /****************************显示屏字符串写入函数************************/
  195. void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
  196. {
  197.         
  198.     if (y == 0)
  199.     {
  200.             LCD_write_com(0x80 + x);        //第一行显示
  201.     }
  202.     else
  203.     {
  204.             LCD_write_com(0xC0 + x);        //第二行显示
  205.     }
  206.    
  207.     while (*s)
  208.     {
  209.             LCD_write_data( *s);
  210.             s ++;
  211.     }
  212. }

  213. //***********************************************************************
  214. //        显示屏单字符写入函数
  215. //***********************************************************************
  216. void LCD_write_char(unsigned char x,unsigned char y,unsigned char data)
  217. {
  218.         
  219.     if (y == 0)
  220.     {
  221.             LCD_write_com(0x80 + x);        //第一行显示
  222.     }
  223.     else
  224.     {
  225.             LCD_write_com(0xC0 + x);        //第二行显示
  226.     }
  227.    
  228.     LCD_write_data( data);  
  229. }


  230. /*********************系统时钟初始化*********************/
  231. void Clock_Init()
  232. {
  233.   uchar i;
  234.   BCSCTL1&=~XT2OFF;                 //打开XT2振荡器
  235.   BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ
  236.   do{
  237.     IFG1&=~OFIFG;                   //清楚振荡器错误标志
  238.     for(i=0;i<100;i++)
  239.        _NOP();
  240.   }
  241.   while((IFG1&OFIFG)!=0);           //如果标志位1,则继续循环等待
  242.   IFG1&=~OFIFG;
  243. }

  244. /***************显示屏初始化函数***********************/
  245. void LCD_init(void)
  246. {
  247.     LCD_write_com(0x38);                //显示模式设置  
  248.     delay_ms(5);
  249.     LCD_write_com(0x08);                //显示关闭
  250.     delay_ms(5);
  251.     LCD_write_com(0x01);                //显示清屏
  252.     delay_ms(5);
  253.     LCD_write_com(0x06);                //显示光标移动设置
  254.     delay_ms(5);
  255.     LCD_write_com(0x0C);                //显示开及光标设置
  256.     delay_ms(5);
  257. }
  258. void yejing_init(void)
  259. {
  260.     // Clock_Init();                       //系统时钟设置
  261.      Port_init();                        //系统初始化,设置IO口属性
  262.      delay_ms(100);                      //延时100ms
  263.      LCD_init();                         //液晶参数初始化设置
  264.      LCD_clear();                        //清屏
  265. }
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
jiru000000
2019-07-16 03:36
arbzc 发表于 2014-12-2 02:00
while((P2IN&BIT1)==0);//等待拉高,准备输出数据
改成
while((P2IN&BIT1)==1);//等待拉高,准备输出数据 ...

while((P2IN&BIT1)==1);//等待拉高,准备输出数据
这句话不就是相当于直接屏蔽,下面有while((P2IN&BIT1);
DHT11不是有响应80us时间吗,程序貌似直接跳过这一步了,楼主怎么认为,怎么解释时序

一周热门 更多>