久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3585|回復(fù): 3
收起左側(cè)

MSP430超聲波測距+LCD1602/LCD12864

[復(fù)制鏈接]
ID:202326 發(fā)表于 2017-5-18 20:42 | 顯示全部樓層 |閱讀模式
很久以前測試過的超聲波測距,用MSP430F149+超聲波測距+LCD1602/LCD12864顯示

0.png

12864液晶顯示代碼:
  1. #include <msp430x14x.h>

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

  4. #define DataIn    P4DIR=0x00    //數(shù)據(jù)口方向設(shè)置為輸入
  5. #define DataOut   P4DIR=0xff    //數(shù)據(jù)口方向設(shè)置為輸出
  6. #define MCU_Data  P4IN
  7. #define LCD_Data  P4OUT
  8. #define CMDOut    P6DIR|=0xfc      //P6口的低23456位設(shè)置為輸出
  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溢出次數(shù)存放變量
  17. unsigned long int Period;//脈寬存放結(jié)果變量
  18. unsigned long int S;
  19. unsigned int distance;
  20. unsigned int RiseCapVal;//上升沿時刻捕獲值存放變量
  21. unsigned char Edge=1;//當(dāng)前觸發(fā)沿
  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. 函數(shù)名稱: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. 函數(shù)名稱:Delay_Nms
  45. 功    能:延時N個1ms的時間
  46. 參    數(shù):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. 函數(shù)名稱:Write_Cmd
  55. 功    能:向液晶中寫控制命令
  56. 參    數(shù):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. 函數(shù)名稱:Write_Data
  83. 功    能:向液晶中寫顯示數(shù)據(jù)
  84. 參    數(shù):dat--顯示數(shù)據(jù)
  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. 函數(shù)名稱:Ini_Lcd
  112. 功    能:初始化液晶模塊
  113. ********************************************/
  114. void Init_Lcd(void)
  115. {                  
  116.     CMDOut;    //液晶控制端口設(shè)置為輸出
  117.     PSB_RST_H; //設(shè)置并行顯示方式;
  118.    
  119.     Delay_Nms(500);
  120.     Write_Cmd(0x30);   //基本指令集
  121.     Delay_1ms();
  122.     Write_Cmd(0x02);   // 地址歸位
  123.     Delay_1ms();
  124.     Write_Cmd(0x0c);   //整體顯示打開,游標(biāo)關(guān)閉
  125.     Delay_1ms();
  126.     Write_Cmd(0x01);   //清除顯示
  127.     Delay_1ms();
  128.     Write_Cmd(0x06);   //游標(biāo)右移
  129.     Delay_1ms();
  130.     Write_Cmd(0x80);   //設(shè)定顯示的起始地址
  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. 函數(shù)名稱:Disp_HZ
  138. 功    能:控制液晶顯示漢字
  139. 參    數(shù):addr--顯示位置的首地址
  140.           pt--指向顯示數(shù)據(jù)的指針
  141.           num--顯示字符個數(shù)
  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. //初始化系統(tǒng)時鐘函數(shù)
  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;//清除振蕩錯誤標(biāo)志
  159.       for(i=0;i<0xff;i++) _NOP();//延時等待
  160.     }
  161.     while((IFG1 & OFIFG) != 0);//如果標(biāo)志為1繼續(xù)循環(huán)等待
  162.     IFG1&=~OFIFG;
  163. }
  164. //初始化定時器A函數(shù)
  165. void init_timerA()
  166. {
  167.   TACTL |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,連續(xù)計(jì)數(shù),中斷允許,計(jì)數(shù)器清零
  168.   TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//捕獲模式,上升沿捕獲,CCI1A輸入,同步捕獲,中斷允許
  169. }
  170. //初始化端口函數(shù)
  171. void init_IO()
  172. {
  173.   P1DIR |= BIT1;//P1.1輸出
  174.   P1DIR &=~ BIT2;//P1.2輸入
  175.   P1SEL |=  BIT2;//P1.2第二功能,捕獲輸入
  176.   
  177.   //P2DIR |= 0xff;      //設(shè)置P2口方向?yàn)檩敵?br />
  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服務(wù)程序
  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;//下降沿捕獲標(biāo)志
  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;//上升沿捕獲標(biāo)志  
  256.                 _EINT();
  257.               }
  258.              break;
  259.     case 4 : break;
  260.     case 10: TA_Overflow_Cnt++;break;
  261.   }   
  262. }
復(fù)制代碼

1602液晶顯示代碼:
  1. //////////////////////////////////////////////////////////////////
  2. /******************基于MSP430f149的超聲波測距儀******************/
  3. //////////////////////////////////////////////////////////////////
  4. #include "msp430f149.h"
  5. #define uint unsigned int
  6. #define uchar unsigned char

  7. #define DataIn    P4DIR=0x00    //數(shù)據(jù)口方向設(shè)置為輸入
  8. #define DataOut   P4DIR=0xff    //數(shù)據(jù)口方向設(shè)置為輸出
  9. #define MCU_Data  P4IN
  10. #define LCD_Data  P4OUT
  11. #define CMDOut    P6DIR|=0x1c      //P6口的低234位設(shè)置為輸出
  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. 函數(shù)名稱: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. 函數(shù)名稱:Delay_Nms
  31. 功    能:延時N個1ms的時間
  32. 參    數(shù):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. 函數(shù)名稱:xml
  41. 功    能:向1602液晶寫入命令
  42. 參    數(shù):無參數(shù)
  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. 函數(shù)名稱:xsj
  56. 功    能:向1602液晶中寫入數(shù)據(jù)
  57. 參    數(shù):無參數(shù)
  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. 函數(shù)名稱:csh
  71. 功    能:初始化1602液晶
  72. 參    數(shù):無參數(shù)
  73. ********************************************/
  74. void csh()
  75. {
  76.     Delay_Nms(500);
  77.     xml(0x38);   //基本指令集
  78.     Delay_1ms();
  79.     xml(0x01);   // 地址歸位
  80.     Delay_1ms();
  81.     xml(0x0c);   //整體顯示打開,游標(biāo)關(guān)閉
  82.     Delay_1ms();
  83.     xml(0x06);   //游標(biāo)右移
  84.     Delay_1ms();
  85.     xml(0x80);   //設(shè)定顯示的起始地址
  86. }
  87. /********************************************
  88. 函數(shù)名稱:xs
  89. 功    能:1602液晶顯示函數(shù)
  90. 參    數(shù):無參數(shù)
  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. 函數(shù)名稱:main
  108. 功    能:主函數(shù)
  109. 參    數(shù):無參數(shù)
  110. *********************************************/
  111. void main( void )
  112. {
  113.   WDTCTL = WDTPW + WDTHOLD;//關(guān)閉看門狗

  114.   csh();
  115.   while(1)
  116.   {
  117.     xs();
  118.   }
  119. }
復(fù)制代碼


以上2個代碼下載,如有錯誤請指教:
MSP430 超聲波.rar (43.44 KB, 下載次數(shù): 79)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:305917 發(fā)表于 2018-4-11 21:46 | 顯示全部樓層
樓主,我沒有看到有超聲波模塊的代碼哦
回復(fù)

使用道具 舉報

ID:420570 發(fā)表于 2018-12-1 14:42 | 顯示全部樓層
.。。。資料不齊全
回復(fù)

使用道具 舉報

ID:142698 發(fā)表于 2022-4-4 14:46 | 顯示全部樓層
沒有超聲部分的代碼
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本一区二区三区四区 | 色偷偷噜噜噜亚洲男人 | av片免费| 伊人伊人 | japan25hdxxxx日本| 国产成人在线一区 | 久久亚洲国产精品 | 国产成人小视频 | 欧美一区不卡 | 91porn成人精品 | 手机av在线| 亚洲国产精品成人无久久精品 | 亚洲综合首页 | 偷拍自拍网址 | 亚洲国产欧美一区二区三区久久 | 亚洲精品乱码 | 亚洲一区二区三区观看 | 一级黄色片在线看 | 免费的网站www | 黄色国产 | 一级黄色片毛片 | 欧美性生交大片免费 | 日本在线观看视频 | 中文字幕免费观看 | 亚洲一区二区三区免费视频 | 久久久精品一区二区 | 影音先锋男 | 一级在线视频 | 精品一区电影 | 在线2区| 亚洲精品视频一区二区三区 | 亚洲精品久久久久久国产精华液 | www.国产| 国产精品欧美一区二区三区不卡 | 日日夜夜av | 亚洲啊v在线 | av中文字幕在线观看 | 天天夜碰日日摸日日澡 | 久久久高清| 国产欧美一区二区三区久久 | 欧美国产在线一区 |