基于MSP430F552912864上显示dht的数据,遇到了些问题

2019-03-24 08:36发布

P70323-201749.jpg
config.h
  1. #define CPU_F   ((double)8000000)       //外部高频晶振8MHZ
  2. //#define CPU_F ((double)32768)         //外部低频晶振32.768KHZ
  3. #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  4. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

  5. //自定义数据结构,方便使用
  6. #define uchar   unsigned char
  7. #define uint    unsigned int
  8. #define ulong   unsigned long

  9. //12864液晶控制管脚
  10. #define RS_CLR          P2OUT &= ~BIT0           //RS置低
  11. #define RS_SET          P2OUT |=  BIT0           //RS置高
  12. #define RW_CLR          P2OUT &= ~BIT2           //RW置低
  13. #define RW_SET          P2OUT |=  BIT2           //RW置高
  14. #define EN_CLR          P2OUT &= ~BIT4           //E置低
  15. #define EN_SET          P2OUT |=  BIT4           //E置高
  16. #define DataDIR         P3DIR                     //数据口方向
  17. #define DataPort        P3OUT                     //P4口为数据口

  18. //12864应用指令集
  19. #define CLEAR_SCREEN    0x01                    //清屏指令:清屏且AC值为00H
  20. #define AC_INIT         0x02                    //将AC设置为00H。且游标移到原点位置
  21. #define CURSE_ADD       0x06                    //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
  22. #define FUN_MODE        0x30                    //工作模式:8位基本指令集
  23. #define DISPLAY_ON      0x0c                    //显示开,显示游标,且游标位置反白
  24. #define DISPLAY_OFF     0x08                    //显示关
  25. #define CURSE_DIR       0x14                    //游标向右移动:AC=AC+1
  26. #define SET_CG_AC       0x40                    //设置AC,范围为:00H~3FH
  27. #define SET_DD_AC       0x80                    //设置DDRAM AC
  28. //#define FUN_MODEK       0x36                    //工作模式:8位扩展指令集

  29. //DHT11控制脚,单脚控制
  30. #define DHT_IN          P1DIR &= ~BIT4          //设置输入
  31. #define DHT_OUT         P1DIR |= BIT4           //设置输出
  32. #define DHT_CLR         P1OUT &= ~BIT4          //置低电平
  33. #define DHT_SET         P1OUT |= BIT4           //置高电平
  34. #define DHT_R           (P1IN & BIT4)           //读电平

  35. //***********************************************************************
  36. //                   系统时钟初始化,外部8M晶振
  37. //***********************************************************************

  38. void Clock_Init()
  39. {
  40.       UCSCTL1 = DCORSEL_2;                             //  设置DCO范围
  41.       UCSCTL3 |= SELREF_2;                             //  选择FLL参考源自REFO
  42.       UCSCTL4 = SELM_3 + SELA_2 + SELS_4;              //  配置 MCLK = DCOC,SMCLK =DCODIV,ACLK=REFO
  43.       while (SFRIFG1 & OFIFG)                          //  清除 OFIFG,and  XT1OFFG ,DCOFFG
  44.         {
  45.           UCSCTL7 &= ~(  XT1LFOFFG + DCOFFG);
  46.           SFRIFG1 &= ~OFIFG;
  47.         }
  48. }

  49. /*
  50. //***********************************************************************
  51. //                   系统时钟初始化,内部RC晶振
  52. //***********************************************************************
  53. void Clock_Init_Inc()
  54. {

  55.   DCOCTL = 0x60 + 0x00;                       //DCO约3MHZ,3030KHZ
  56.   BCSCTL1 = DIVA_0 + 0x07;
  57.   BCSCTL2 = SELM_2 + DIVM_0 + SELS + DIVS_0;
  58. }

  59. //***********************************************************************
  60. //                   系统时钟初始化,外部32.768K晶振
  61. //***********************************************************************

  62. void Clock_Init_Ex32768()
  63. {
  64.   uchar i;

  65.   BCSCTL2|=SELM1 + SELM0 + SELS;    //MCLK为32.768KHZ,SMCLK为8MHZ
  66.   do{
  67.     IFG1&=~OFIFG;                   //清楚振荡器错误标志
  68.     for(i=0;i<100;i++)
  69.        _NOP();
  70.   }
  71.   while((IFG1&OFIFG)!=0);           //如果标志位1,则继续循环等待
  72.   IFG1&=~OFIFG;
  73. }
  74. */

  75. //***********************************************************************
  76. //               MSP430内部看门狗初始化
  77. //***********************************************************************
  78. void WDT_Init()
  79. {
  80.    WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
  81. }
复制代码


main.c
  1. #include <msp430.h>
  2. #include "Config.h"

  3. typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable      无符号8位整型变量  */
  4. typedef signed   char  S8;       /* defined for signed 8-bits integer variable        有符号8位整型变量  */
  5. typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable     无符号16位整型变量 */
  6. typedef signed   int   S16;      /* defined for signed 16-bits integer variable       有符号16位整型变量 */
  7. typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable     无符号32位整型变量 */
  8. typedef signed   long  S32;      /* defined for signed 32-bits integer variable       有符号32位整型变量 */
  9. typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
  10. typedef double         F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */

  11. #define uchar unsigned char
  12. #define uint unsigned int

  13. //***********************************************************************
  14. //  DHT11温湿度数据存储变量定义
  15. //----温度高8位== U8T_data_H------
  16. //----温度低8位== U8T_data_L------
  17. //----湿度高8位== U8RH_data_H-----
  18. //----湿度低8位== U8RH_data_L-----
  19. //----校验 8 位 == U8checkdata-----
  20. //***********************************************************************
  21. U8  U8FLAG,k;
  22. U8  U8count,U8temp;
  23. U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  24. U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  25. U8  U8comdata;

  26. //延时函数
  27. void  Delay_10us(void)
  28. {
  29.   delay_us(10);
  30. }

  31. //响应函数
  32. void COM(void)
  33. {
  34.   U8 i;
  35.   DHT_IN;
  36.   for(i=0;i<8;i++)
  37.   {
  38.     U8FLAG=2;
  39.     while((!DHT_R) && U8FLAG++);
  40.     Delay_10us();
  41.     Delay_10us();
  42.     Delay_10us();
  43.     U8temp=0;
  44.     if(DHT_R)
  45.         U8temp=1;
  46.     U8FLAG=2;
  47.     while((DHT_R) && U8FLAG++);
  48.     //超时则跳出for循环
  49.     if(U8FLAG==1)
  50.         break;
  51.     //判断数据位是0还是1
  52.     // 如果高电平高过预定0高电平值则数据位为 1
  53.     U8comdata<<=1;
  54.     U8comdata|=U8temp;        //0
  55.   }
  56. }

  57. //温湿度读取函数
  58. void RH(void)
  59. {
  60.       //主机拉低18ms
  61.       DHT_OUT;
  62.       DHT_CLR;
  63.       delay_ms(18);
  64.       DHT_SET;
  65.       //总线由上拉电阻拉高 主机延时20us
  66.       Delay_10us();
  67.       Delay_10us();
  68.       //主机设为输入 判断从机响应信号
  69.       DHT_SET;
  70.       //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
  71.       DHT_IN;
  72.       if(!DHT_R)
  73.       {
  74.       U8FLAG=2;
  75.       //判断从机是否发出 80us 的低电平响应信号是否结束
  76.       while((!DHT_R)&&U8FLAG++);
  77.       U8FLAG=2;
  78.       //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  79.       while((DHT_R)&&U8FLAG++);
  80.       //数据接收状态
  81.       COM();
  82.       U8RH_data_H_temp=U8comdata;
  83.       COM();
  84.       U8RH_data_L_temp=U8comdata;
  85.       COM();
  86.       U8T_data_H_temp=U8comdata;
  87.       COM();
  88.       U8T_data_L_temp=U8comdata;
  89.       COM();
  90.       U8checkdata_temp=U8comdata;
  91.       DHT_OUT;
  92.       DHT_SET;
  93.       //数据校验
  94.       U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  95.       if(U8temp==U8checkdata_temp)
  96.       {
  97.           U8RH_data_H=U8RH_data_H_temp;
  98.           U8RH_data_L=U8RH_data_L_temp;
  99.           U8T_data_H=U8T_data_H_temp;
  100.           U8T_data_L=U8T_data_L_temp;
  101.           U8checkdata=U8checkdata_temp;
  102.        }
  103.        }

  104. }

  105. //液晶显示温度值,xx.xC格式
  106. void LCD_DisplayTemp(void)
  107. {
  108.   LCD_write_char(0x00,0,0x30+U8T_data_H/10);
  109.   LCD_write_char(0x01,0,0x30+U8T_data_H%10);
  110.   LCD_write_char(0x02,0,'.');
  111.   LCD_write_char(0x03,0,0X30+U8T_data_L);
  112.   LCD_write_char(0x04,0,'C');
  113. }

  114. //液晶显示湿度度值,xx.x%格式
  115. void LCD_DisplayRH(void)
  116. {
  117.   LCD_write_char(0x00,1,0x30+U8RH_data_H/10);
  118.   LCD_write_char(0x01,1,0x30+U8RH_data_H%10);
  119.   LCD_write_char(0x02,1,'.');
  120.   LCD_write_char(0x03,1,0X30+U8RH_data_L);
  121.   LCD_write_char(0x04,1,'%');
  122. }


  123. //初始化IO口子程序
  124. void Port_init()
  125. {

  126.         P3SEL = 0x00;
  127.         P3DIR = 0xFF;                   //数据口输出模式
  128.         P2SEL = 0x00;
  129.         P2DIR|= BIT0 + BIT2 + BIT4;     //控制口设置为输出模式
  130. }

  131. //***********************************************************************
  132. //  显示屏命令写入函数
  133. //***********************************************************************
  134. void LCD_write_com(unsigned char com)
  135. {
  136.     RS_CLR;
  137.     RW_CLR;
  138.     EN_SET;
  139.     DataPort = com;                 //命令写入端口
  140.     delay_ms(5);
  141.     EN_CLR;
  142. }

  143. //***********************************************************************
  144. //  显示屏数据写入函数
  145. //***********************************************************************
  146. void LCD_write_data(unsigned char data)
  147. {
  148.     RS_SET;
  149.     RW_CLR;
  150.     EN_SET;
  151.     DataPort = data;                //数据写入端口
  152.     delay_ms(5);
  153.     EN_CLR;
  154. }

  155. //***********************************************************************
  156. //  显示屏清空显示
  157. //***********************************************************************
  158. void LCD_clear(void)
  159. {
  160.     LCD_write_com(0x01);            //清屏幕显示
  161.     delay_ms(5);
  162. }

  163. //***********************************************************************
  164. //  显示屏字符串写入函数
  165. //***********************************************************************
  166. void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
  167. {

  168.     if (y == 0)
  169.     {
  170.         LCD_write_com(0x80 + x);        //第一行显示
  171.     }
  172.     else if(y==1)
  173.     {
  174.         LCD_write_com(0x90 + x);
  175.     }else if(y==2)
  176.     {
  177.         LCD_write_com(0x88 + x);        //第三行显示
  178.     }else if(y==3)
  179.     {
  180.         LCD_write_com(0x98 + x);
  181.     }

  182.     while (*s)
  183.     {
  184.         LCD_write_data( *s);
  185.         s++;
  186.         delay_ms(5);
  187.     }
  188. }

  189. //***********************************************************************
  190. //  显示屏单字符写入函数
  191. //***********************************************************************
  192. void LCD_write_char(unsigned char x,unsigned char y,unsigned char data)
  193. {

  194.     if (y == 0)
  195.     {
  196.         LCD_write_com(0x93 + x);        //第一行显示
  197.     }
  198.     else
  199.     {
  200.         LCD_write_com(0x8B + x);        //第二行显示
  201.     }

  202.     LCD_write_data(data);
  203. }

  204. //***********************************************************************
  205. //  显示屏初始化函数
  206. //***********************************************************************
  207. void LCD_init(void)
  208. {
  209.     LCD_write_com(0x38);        //显示模式设置
  210.     delay_ms(5);
  211.     LCD_write_com(0x08);        //显示关闭
  212.     delay_ms(5);
  213.     LCD_write_com(0x01);        //显示清屏
  214.     delay_ms(5);
  215.     LCD_write_com(0x06);        //显示光标移动设置
  216.     delay_ms(5);
  217.     LCD_write_com(0x0C);        //显示开及光标设置
  218.     delay_ms(5);
  219. }

  220. //***********************************************************************
  221. //      液晶显示界面初始化
  222. //***********************************************************************
  223. void LCD_Desk(void)
  224. {
  225.   LCD_clear();
  226.   LCD_write_str(0,0,"你好哇!");
  227.   LCD_write_str(0,1,"温度:");
  228.   LCD_write_str(0,2,"湿度:");
  229.   LCD_write_str(0,3,"再见啦!");
  230.   delay_ms(50);
  231. }


  232. //***********************************************************************
  233. //      主程序
  234. //***********************************************************************
  235. void main(void)
  236. {
  237.     uchar j;

  238.     WDT_Init();                         //看门狗设置
  239.     Clock_Init();                       //系统时钟设置
  240.     Port_init();                        //系统初始化,设置IO口属性
  241.     delay_ms(100);                      //延时100ms
  242.     LCD_init();                         //液晶参数初始化设置
  243.     LCD_clear();                        //清屏



  244.     while(1)
  245.     {
  246.         RH();//调用温湿度读取函数
  247.         LCD_Desk();
  248.         for(j=0;j<30;j++)
  249.         {
  250.             LCD_DisplayTemp();                 //温度显示到液晶屏
  251.             LCD_DisplayRH();
  252.         }
  253.     }
  254. }
复制代码
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
硕果累累
2019-03-24 16:11
不错,不错,个人觉得430单片机编程有点乱!

一周热门 更多>

相关问题

    相关文章