找回密码
 立即注册

QQ登录

只需一步,快速开始

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

MSP430超声波测距+LCD1602/LCD12864

[复制链接]
跳转到指定楼层
楼主
很久以前测试过的超声波测距,用MSP430F149+超声波测距+LCD1602/LCD12864显示



12864液晶显示代码:
  1. #include <msp430x14x.h>

  2. #define  RISE  1
  3. #define  FALL  0

  4. #define DataIn    P4DIR=0x00    //数据口方向设置为输入
  5. #define DataOut   P4DIR=0xff    //数据口方向设置为输出
  6. #define MCU_Data  P4IN
  7. #define LCD_Data  P4OUT
  8. #define CMDOut    P6DIR|=0xfc      //P6口的低23456位设置为输出
  9. #define RS_H      P6OUT|=BIT2      //P6.2
  10. #define RS_L      P6OUT&=~BIT2     //P6.2
  11. #define RW_H      P6OUT|=BIT3      //P6.3
  12. #define RW_L      P6OUT&=~BIT3     //P6.3
  13. #define EN_H      P6OUT|=BIT4      //P6.4
  14. #define EN_L      P6OUT&=~BIT4     //P6.4
  15. #define PSB_RST_H  P6OUT|=BIT5+BIT6 //P6.5 P6.6为高

  16. unsigned int TA_Overflow_Cnt;//TA溢出次数存放变量
  17. unsigned long int Period;//脉宽存放结果变量
  18. unsigned long int S;
  19. unsigned int distance;
  20. unsigned int RiseCapVal;//上升沿时刻捕获值存放变量
  21. unsigned char Edge=1;//当前触发沿
  22. const unsigned char hang1[]={"<<超声波测距仪>>"};
  23. const unsigned char hang2[]={"距离:"};
  24. const unsigned char hang3[]={"米"};
  25. unsigned char disbuff[4]={"0.00"};


  26. void Write_Cmd(unsigned char cmd);
  27. void Write_Data(unsigned char dat);
  28. void Init_Lcd(void);
  29. void Disp_HZ(unsigned char addr,const unsigned char * pt,unsigned char num);
  30. void init_clk();
  31. void init_timerA();
  32. void init_IO();
  33. void display_juli();
  34. /*******************************************
  35. 函数名称:Delay_1ms
  36. 功    能:延时约1ms的时间
  37. ********************************************/
  38. void Delay_1ms(void)
  39. {
  40.    unsigned char i;
  41.    for(i=150;i>0;i--) _NOP();
  42. }
  43. /*******************************************
  44. 函数名称:Delay_Nms
  45. 功    能:延时N个1ms的时间
  46. 参    数:n--延时长度
  47. ********************************************/
  48. void Delay_Nms(unsigned int n)
  49. {
  50.     unsigned int i;
  51.     for(i=n;i>0;i--) Delay_1ms();
  52. }

  53. /*******************************************
  54. 函数名称:Write_Cmd
  55. 功    能:向液晶中写控制命令
  56. 参    数:cmd--控制命令
  57. ********************************************/
  58. void Write_Cmd(unsigned char cmd)
  59. {
  60.     unsigned char lcdtemp=0;
  61.             
  62.     RS_L;
  63.     RW_H;
  64.     DataIn;  
  65.     do                       //判忙
  66.     {   
  67.         EN_H;
  68.            _NOP();                    
  69.            lcdtemp = MCU_Data;
  70.            EN_L;  
  71.     }
  72.     while(lcdtemp & 0x80);
  73.    
  74.     DataOut;   
  75.     RW_L;         
  76.     LCD_Data = cmd;
  77.     EN_H;
  78.     _NOP();                                      
  79.     EN_L;
  80. }
  81. /*******************************************
  82. 函数名称:Write_Data
  83. 功    能:向液晶中写显示数据
  84. 参    数:dat--显示数据
  85. ********************************************/
  86. void  Write_Data(unsigned char dat)
  87. {
  88.     unsigned char lcdtemp = 0;   
  89.         
  90.     RS_L;
  91.     RW_H;  
  92.     DataIn;   
  93.     do                       //判忙
  94.     {   
  95.         EN_H;
  96.         _NOP();                        
  97.         lcdtemp = MCU_Data;
  98.         EN_L;      
  99.     }
  100.     while(lcdtemp & 0x80);  
  101.    
  102.     DataOut;
  103.     RS_H;
  104.     RW_L;  
  105.     LCD_Data = dat;
  106.     EN_H;
  107.     _NOP();
  108.     EN_L;
  109. }  
  110. /*******************************************
  111. 函数名称:Ini_Lcd
  112. 功    能:初始化液晶模块
  113. ********************************************/
  114. void Init_Lcd(void)
  115. {                  
  116.     CMDOut;    //液晶控制端口设置为输出
  117.     PSB_RST_H; //设置并行显示方式;
  118.    
  119.     Delay_Nms(500);
  120.     Write_Cmd(0x30);   //基本指令集
  121.     Delay_1ms();
  122.     Write_Cmd(0x02);   // 地址归位
  123.     Delay_1ms();
  124.     Write_Cmd(0x0c);   //整体显示打开,游标关闭
  125.     Delay_1ms();
  126.     Write_Cmd(0x01);   //清除显示
  127.     Delay_1ms();
  128.     Write_Cmd(0x06);   //游标右移
  129.     Delay_1ms();
  130.     Write_Cmd(0x80);   //设定显示的起始地址
  131. //   Write_Cmd(0x01);
  132.     Disp_HZ(0x80,hang1,8);
  133.     Disp_HZ(0x91,hang2,3);
  134.     Disp_HZ(0x96,hang3,1);
  135. }
  136. /*******************************************
  137. 函数名称:Disp_HZ
  138. 功    能:控制液晶显示汉字
  139. 参    数:addr--显示位置的首地址
  140.           pt--指向显示数据的指针
  141.           num--显示字符个数
  142. ********************************************/
  143. void Disp_HZ(unsigned char addr,const unsigned char * pt,unsigned char num)
  144. {
  145.     unsigned char i;
  146.     Write_Cmd(addr);
  147.     for(i = 0;i < (num*2);i++)
  148.       Write_Data(*(pt++));
  149. }

  150. //初始化系统时钟函数
  151. void init_clk()
  152. {
  153.     unsigned char i;
  154.     BCSCTL1&=~XT2OFF;//打开XT振荡器
  155.     BCSCTL2|=SELM_2+SELS;//MCLK 8M and SMCLK 8M  
  156.     do
  157.     {
  158.       IFG1 &= ~OFIFG;//清除振荡错误标志
  159.       for(i=0;i<0xff;i++) _NOP();//延时等待
  160.     }
  161.     while((IFG1 & OFIFG) != 0);//如果标志为1继续循环等待
  162.     IFG1&=~OFIFG;
  163. }
  164. //初始化定时器A函数
  165. void init_timerA()
  166. {
  167.   TACTL |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,连续计数,中断允许,计数器清零
  168.   TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//捕获模式,上升沿捕获,CCI1A输入,同步捕获,中断允许
  169. }
  170. //初始化端口函数
  171. void init_IO()
  172. {
  173.   P1DIR |= BIT1;//P1.1输出
  174.   P1DIR &=~ BIT2;//P1.2输入
  175.   P1SEL |=  BIT2;//P1.2第二功能,捕获输入
  176.   
  177.   //P2DIR |= 0xff;      //设置P2口方向为输出
  178.   
  179.   P4DIR |= 0xff;
  180.   P6DIR |= 0xfc;
  181.   
  182.   P1OUT &=~BIT1;
  183.   Delay_Nms(1000);
  184. }

  185. void display_juli()
  186. {
  187.   if(S/100)
  188.   {
  189.     disbuff[0]=S/100+'0';
  190.     disbuff[2]=S/10%10+'0';
  191.     disbuff[3]=S%10+'0';
  192.   }
  193.   else if(S/10)
  194.   {
  195.     disbuff[2]=S/10+'0';
  196.     disbuff[3]=S%10+'0';
  197.     disbuff[0]='0';
  198.   }
  199.   else
  200.   {
  201.     disbuff[3]=S%10+'0';
  202.     disbuff[0]='0';
  203.     disbuff[2]='0';
  204.   }
  205. }

  206. void main()
  207. {
  208.   WDTCTL = WDTPW + WDTHOLD;//停狗
  209.   init_IO();
  210.   Init_Lcd();
  211.   init_timerA();
  212.   TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
  213.   _EINT();
  214.   while(1)
  215.   {   
  216.     P1OUT |= BIT1;
  217.     Delay_Nms(10);
  218.     P1OUT &=~BIT1;
  219.     Delay_Nms(80);
  220.     //P2OUT = 0x00;
  221.     P6OUT &= ~BIT1;
  222.     display_juli();
  223.     Disp_HZ(0x94,disbuff,2);

  224.     if(S<10)
  225.     {
  226.       //P2OUT = 0xff;
  227.       P6DIR |= BIT1;
  228.       P6OUT |= BIT1;
  229.     }
  230.    
  231.   }
  232. }

  233. //定时器A服务程序
  234. #pragma vector=TIMERA1_VECTOR
  235. __interrupt void Timer_A(void)
  236. {

  237.   switch(TAIV)
  238.   {
  239.     case 2 :if(Edge==RISE)
  240.               {
  241.                 RiseCapVal = TACCR1;
  242.                 TACCTL1 |= CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕获
  243.                 //TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
  244.                 Edge = FALL;//下降沿捕获标志
  245.               }
  246.              else
  247.               {
  248.                
  249.                 _DINT();
  250.             
  251.                 Period = TACCR1-RiseCapVal;
  252.                 S=(Period*17)/100;
  253.                 TACCR1 = 0;
  254.                 TACCTL1|= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
  255.                 Edge = RISE;//上升沿捕获标志  
  256.                 _EINT();
  257.               }
  258.              break;
  259.     case 4 : break;
  260.     case 10: TA_Overflow_Cnt++;break;
  261.   }   
  262. }
复制代码

1602液晶显示代码:
  1. //////////////////////////////////////////////////////////////////
  2. /******************基于MSP430f149的超声波测距仪******************/
  3. //////////////////////////////////////////////////////////////////
  4. #include "msp430f149.h"
  5. #define uint unsigned int
  6. #define uchar unsigned char

  7. #define DataIn    P4DIR=0x00    //数据口方向设置为输入
  8. #define DataOut   P4DIR=0xff    //数据口方向设置为输出
  9. #define MCU_Data  P4IN
  10. #define LCD_Data  P4OUT
  11. #define CMDOut    P6DIR|=0x1c      //P6口的低234位设置为输出
  12. #define RS_H      P6OUT|=BIT2      //P6.2
  13. #define RS_L      P6OUT&=~BIT2     //P6.2
  14. #define RW_H      P6OUT|=BIT3      //P6.3
  15. #define RW_L      P6OUT&=~BIT3     //P6.3
  16. #define EN_H      P6OUT|=BIT4      //P6.4
  17. #define EN_L      P6OUT&=~BIT4     //P6.4

  18. unsigned char xs1[]={"Distance:"};
  19. unsigned char xs2[]={"Test error"};
  20. /*******************************************
  21. 函数名称:Delay_1ms
  22. 功    能:延时约1ms的时间
  23. ********************************************/
  24. void Delay_1ms(void)
  25. {
  26.   unsigned char i;
  27.   for(i=150;i>0;i--) _NOP();
  28. }
  29. /*******************************************
  30. 函数名称:Delay_Nms
  31. 功    能:延时N个1ms的时间
  32. 参    数:n--延时长度
  33. ********************************************/
  34. void Delay_Nms(unsigned int n)
  35. {
  36.   unsigned int i;
  37.   for(i=n;i>0;i--) Delay_1ms();
  38. }
  39. /********************************************
  40. 函数名称:xml
  41. 功    能:向1602液晶写入命令
  42. 参    数:无参数
  43. ********************************************/
  44. void xml(uchar cmd)
  45. {
  46.   RS_L;
  47.   RW_L;
  48.   EN_H;
  49.   Delay_1ms();
  50.   LCD_Data = cmd;
  51.   EN_L;
  52.   Delay_1ms();
  53. }
  54. /********************************************
  55. 函数名称:xsj
  56. 功    能:向1602液晶中写入数据
  57. 参    数:无参数
  58. ********************************************/
  59. void xsj(uchar dat)
  60. {
  61.   RS_H;
  62.   RW_L;
  63.   EN_H;
  64.   Delay_1ms();
  65.   LCD_Data = dat;
  66.   EN_L;
  67.   Delay_1ms();
  68. }
  69. /********************************************
  70. 函数名称:csh
  71. 功    能:初始化1602液晶
  72. 参    数:无参数
  73. ********************************************/
  74. void csh()
  75. {
  76.     Delay_Nms(500);
  77.     xml(0x38);   //基本指令集
  78.     Delay_1ms();
  79.     xml(0x01);   // 地址归位
  80.     Delay_1ms();
  81.     xml(0x0c);   //整体显示打开,游标关闭
  82.     Delay_1ms();
  83.     xml(0x06);   //游标右移
  84.     Delay_1ms();
  85.     xml(0x80);   //设定显示的起始地址
  86. }
  87. /********************************************
  88. 函数名称:xs
  89. 功    能:1602液晶显示函数
  90. 参    数:无参数
  91. ********************************************/
  92. void xs()
  93. {
  94.   uchar i;
  95.   xml(0x80);
  96.   for(i=0;i<16;i++)
  97.   {
  98.     xsj(xs1[i]);
  99.   }
  100.   xml(0x90);
  101.   for(i=0;i<16;i++)
  102.   {
  103.     xsj(xs2[i]);
  104.   }
  105. }
  106. /*********************************************
  107. 函数名称:main
  108. 功    能:主函数
  109. 参    数:无参数
  110. *********************************************/
  111. void main( void )
  112. {
  113.   WDTCTL = WDTPW + WDTHOLD;//关闭看门狗

  114.   csh();
  115.   while(1)
  116.   {
  117.     xs();
  118.   }
  119. }
复制代码


以上2个代码下载,如有错误请指教:
MSP430 超声波.rar (43.44 KB, 下载次数: 79)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:305917 发表于 2018-4-11 21:46 | 只看该作者
楼主,我没有看到有超声波模块的代码哦
回复

使用道具 举报

板凳
ID:420570 发表于 2018-12-1 14:42 | 只看该作者
.。。。资料不齐全
回复

使用道具 举报

地板
ID:142698 发表于 2022-4-4 14:46 | 只看该作者
没有超声部分的代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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