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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3641|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

超聲波測距模塊和語音模塊同時使用,但是2個單片機定時器問題解決不了,求大神指教

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:291819 發(fā)表于 2018-9-19 21:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <REG52.h>       //調(diào)用51單片機的頭文件
  2. #include <intrins.h>
  3. #include <math.h>
  4. #include <string.h>
  5. //---------------------------------------
  6. //1602液晶相關(guān)I/O設(shè)置
  7. sbit E=P0^5;               //1602液晶的E腳接在P2.3口上
  8. sbit RW=P0^6;              //1602液晶的RW腳接在P2.4口上
  9. sbit RS=P0^7;              //1602液晶的RS腳接在P2.5口上
  10. //---------------------------------------
  11. //---------------------------------------
  12. //HC-SR04相關(guān)I/O設(shè)置
  13. sbit TIRG=P3^4;                   //定義IO口,具體可以去查看原理圖
  14. sbit ECHO=P3^2;                   //定義IO口,具體可以去查看原理圖        
  15. //---------------------------------------
  16. sbit mang= P0^7;
  17. unsigned long BJS=50;//報警距離50CM
  18. //unsigned char disbuff[4]           ={0,0,0,0};
  19. //unsigned char disbuff_BJ[4]        ={0,0,0,0};//報警信息
  20. unsigned int  time=0;
  21. bit      flag =0;
  22. unsigned char k;
  23. //名稱:1602液晶用延時函數(shù)
  24. void Delay1602(unsigned int t)
  25. {
  26.      unsigned int k;      //定義一個16位寄存器用來做延時用
  27.      for(k=0;k<t;k++);    //延時
  28. }

  29. //名稱:1602液晶忙檢測函數(shù)
  30. void LCD1602_busy(void)
  31. {
  32.      mang=1;              //將P0.7置1,為讀狀態(tài)做準(zhǔn)備
  33.      RS=0;                //RS=0、RW=1、E=1時,忙信號輸出到DB7,由P0.7讀入
  34.      RW=1;                //RS=0、RW=1、E=1時,忙信號輸出到DB7,由P0.7讀入
  35.      E=1;                 //RS=0、RW=1、E=1時,忙信號輸出到DB7,由P0.7讀入
  36.      while(mang==1);      //由P0.7讀入1,表示1602液晶忙,需要等待
  37.      E=0;                 //讀完以后,恢復(fù)E的電平
  38. }

  39. //名稱:1600寫命令函數(shù)
  40. void LCD1602_Write_com(unsigned char combuf)
  41. {
  42.      RS=0;                //選擇指令寄存器
  43.      RW=0;                //選擇寫狀態(tài)
  44.      P2=combuf;           //將命令字通過P0口送至DB
  45.      E=1;                 //E高電平將命令字寫入1602液晶
  46.      E=0;                 //寫完以后,恢復(fù)E的電平
  47. }

  48. //名稱:1602寫命令函數(shù)(帶忙檢測)
  49. void LCD1602_Write_com_busy(unsigned char combuf)
  50. {
  51.      LCD1602_busy();            //調(diào)用忙檢測函數(shù)
  52.      LCD1602_Write_com(combuf); //調(diào)用忙檢測函數(shù)
  53. }

  54. //名稱:1602寫數(shù)據(jù)函數(shù)(帶忙檢測)
  55. void LCD1602_Write_data_busy(unsigned char databuf)
  56. {
  57.      LCD1602_busy();      //調(diào)用忙檢測函數(shù)
  58.      RS=1;                //選擇數(shù)據(jù)寄存器
  59.      RW=0;                //選擇寫狀態(tài)
  60.      P2=databuf;          //將命令字通過P0口送至DB
  61.      E=1;                 //E高電平將命令字寫入1602液晶
  62.      E=0;                 //寫完以后,恢復(fù)E的電平
  63. }

  64. //名稱:1602液晶顯示地址寫函數(shù)
  65. void LCD1602_Write_address(unsigned char x,unsigned char y)
  66. {
  67.      x&=0x0f;             //列地址限制在0-15間
  68.      y&=0x01;             //行地址限制在0-1間
  69.      if(y==0)             //如果是第一行
  70.          LCD1602_Write_com_busy(x|0x80);        //將列地址寫入
  71.      else                 //如果是第二行
  72.          LCD1602_Write_com_busy((x+0x40)|0x80); //將列地址寫入
  73. }


  74. //名稱:1602液晶初始化函數(shù)
  75. void LCD1602_init(void)
  76. {
  77.      Delay1602(1500);               //調(diào)用延時函數(shù)
  78.      LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點陣顯示
  79.      Delay1602(500);                //調(diào)用延時函數(shù)
  80.      LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點陣顯示
  81.      Delay1602(500);                //調(diào)用延時函數(shù)
  82.      LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點陣顯示
  83.      LCD1602_Write_com_busy(0x38);  //8位數(shù)據(jù)總線,兩行顯示模式,5*7點陣顯示
  84.      LCD1602_Write_com_busy(0x08);  //顯示功能關(guān),無光標(biāo)
  85.      LCD1602_Write_com_busy(0x01);  //清屏
  86.      LCD1602_Write_com_busy(0x06);  //寫入新的數(shù)據(jù)后,光標(biāo)右移,顯示屏不移動
  87.      LCD1602_Write_com_busy(0x0C);  //顯示功能開,無光標(biāo)
  88. }
  89. void chuankou()
  90. {
  91.           //    串口的初始化
  92.          TL1 = 0xFA;        // 在11.0592MHz 下,設(shè)置波特率9600bps,工作方式2
  93.          TH1 = 0xFA;              
  94.         TMOD|=0x21;
  95.                 TMOD = 0x21;
  96.                SCON = 0x50;       // 串口工作方式1,允許接收
  97.          PCON = 0x80;
  98.          EA  = 0;
  99.          REN = 1;
  100.          TI = 0;            //發(fā)送中斷標(biāo)志位置零
  101.          RI = 0;            //接收中斷標(biāo)志位置零
  102.          TR1 = 1;           //定時器1 用作波特率發(fā)生

  103. }


  104. //名稱:1602液晶指定地址顯示函數(shù)
  105. void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
  106. {
  107.      LCD1602_Write_address(x,y);    //先將地址信息寫入
  108.      LCD1602_Write_data_busy(buf);  //再寫入要顯示的數(shù)據(jù)
  109. }

  110. //名稱:定時器0中斷服務(wù)程序
  111. void Timer0(void) interrupt 1
  112. {                       
  113.    //
  114.         flag=0;
  115.                  
  116.    //******************************************
  117. }

  118. void yuyin()
  119. {
  120.          //需要發(fā)送的文本
  121.                  char code text[] =  {"觀看時間太長了!"};
  122.                  unsigned  char  headOfFrame[5];
  123.          unsigned  char  length;  
  124.                  unsigned  char  ecc  = 0;                          //定義校驗字節(jié)
  125.              unsigned  int i=0;
  126.                  length =sizeof(text);                         //需要發(fā)送文本的長度
  127.                  chuankou();
  128.         //發(fā)送過程/           
  129.                  headOfFrame[0] = 0xFD ;                         //構(gòu)造幀頭FD
  130.                  headOfFrame[1] = 0x00 ;                         //構(gòu)造數(shù)據(jù)區(qū)長度的高字節(jié)
  131.                  headOfFrame[2] = length + 3;                 //構(gòu)造數(shù)據(jù)區(qū)長度的低字節(jié)
  132.                  headOfFrame[3] = 0x01 ;                         //構(gòu)造命令字:合成播放命令
  133.        //帶背景音樂                  
  134.             // headOfFrame[4] = 0x21 ;                         //構(gòu)造命令參數(shù):編碼格式為GBK

  135.       //不帶背景音樂                  
  136.                 headOfFrame[4] = 0x01 ;                         //構(gòu)造命令參數(shù):編碼格式為GBK

  137.                  for(i = 0; i<5; i++)                                   //依次發(fā)送構(gòu)造好的5個幀頭字節(jié)
  138.              {  
  139.                  ecc=ecc^(headOfFrame[i]);                 //對發(fā)送的字節(jié)進行異或校驗        
  140.                  SBUF = headOfFrame[i];
  141.                  while (TI== 0) {;}                           //等待發(fā)送中斷標(biāo)志位置位
  142.                  TI = 0;                                                 //發(fā)送中斷標(biāo)志位清零
  143.              }

  144.                     for(i = 0; i<length; i++)                   //依次發(fā)送待合成的文本數(shù)據(jù)
  145.              {  
  146.                  ecc=ecc^(text[i]);                                 //對發(fā)送的字節(jié)進行異或校驗        
  147.                  SBUF = text[i];
  148.                  while (TI== 0) {;}
  149.                  TI = 0;                                 
  150.              }
  151.                    SBUF=ecc;                                                        //最后發(fā)送校驗字節(jié)
  152.                    while (TI== 0) {;}
  153.                 TI=0;         
  154.                   while(1);
  155. }

  156. void main(void)            //主函數(shù),單片機開機后就是從這個函數(shù)開始運行
  157. {
  158.         long S;
  159.         unsigned int i;
  160.         unsigned int  Timeout;
  161.     LCD1602_init();        //調(diào)用1602液晶初始化函數(shù)
  162.         //***定時器Timer0初始化***
  163.    TMOD&=0xF0;                    //將TMOD的低4位定時器0控制部分清零
  164.    TMOD|=0x01;                    //設(shè)置定時器0為方式1
  165.    TMOD=0x01;
  166.    TL0=0;                              //設(shè)置定時器0初值低8位
  167.    TH0=0;                              //設(shè)置定時器0初值高8位
  168.    TR0=0;                         //停止定時器0
  169.    ET0=1;                         //Timer0中斷允許
  170.    //**********************
  171.    //***開全局中斷設(shè)置****
  172.    //定時器Timer0設(shè)置了中斷允許,此處要開全局中斷
  173.    EA=1;                          //開全局中斷
  174.   // ES=1;
  175.    //*********************
  176.         while(1)
  177.         {               
  178.                 TIRG=1;                                             //發(fā)一個脈沖觸發(fā)信號
  179.                   i=4;                                             //維持約17US,符合不低于10US的要求
  180.       while(i>0)                                  //維持約17US,符合不低于10US的要求
  181.               i--;                                     //維持約17US,符合不低于10US的要求               
  182.                   TIRG=0;                                             //撤銷觸發(fā)信號
  183.                 TR0=0;                                                //關(guān)閉定時器
  184.                 TL0=0;                             //設(shè)置定時器0初值低8位為0
  185.              TH0=0;                              //設(shè)置定時器0初值高8位為0
  186.                 k=0;                         //清除溢出標(biāo)志
  187.                 flag=0;
  188.                 Timeout=0;
  189.            while((ECHO==0)&&((Timeout++)<50000));                                //等待回響高電平               
  190.            TR0=1;                                            //回響高電平來后啟動定時器
  191.                 Timeout=0;
  192.            while((ECHO==1)&&((Timeout++)<50000));                                //等待回響高電平結(jié)束后
  193.            TR0=0;                                                //關(guān)閉定時器
  194.       S=((TH0*256+TL0)*1.7)/100;
  195.           if(S<=50)
  196.           {
  197.                  yuyin();
  198.           }        
  199.                 if(flag==1||S>400)                //超出測量范圍顯示“-”
  200.                 {                                                         
  201.                            LCD1602_Disp(0, 0, '-');                                  //顯示百位-
  202.                            LCD1602_Disp(1, 0, '-');                                  //顯示十位-
  203.                            LCD1602_Disp(2, 0, '-');                                  //顯示個位-
  204.                            LCD1602_Disp(3, 0, 'C');                                  //顯示C
  205.                            LCD1602_Disp(4, 0, 'M');                                //顯示M
  206.                 }
  207.                 else                                                                  
  208.                 {         
  209.                         if(S<=50){
  210.                         //yuyin();               
  211.                         LCD1602_Disp(0, 0, S%1000/100+'0');                  //顯示百位
  212.                            LCD1602_Disp(1, 0, S%1000%100/10+'0');  //顯示十位
  213.                            LCD1602_Disp(2, 0, S%1000%100%10+'0');        //顯示個位
  214.                            LCD1602_Disp(3, 0, 'C');                                          //顯示C
  215.                            LCD1602_Disp(4, 0, 'M');                                        //顯示M
  216.                     
  217.                         }
  218.                 }
  219.                 i=18000;                                          //維持約77400US,符合不低于60MS的要求
  220.       while(i>0)                                  //維持約77400US,符合不低于60MS的要求
  221.               i--;                                     //維持約77400US,符合不低于60MS的要求

  222.         }
  223. }

復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:291819 發(fā)表于 2018-9-19 21:37 | 只看該作者
超聲波測距功能與語音模塊單獨分開都能實現(xiàn)功能,放在一起就什么功能不能實現(xiàn),我知道用到了倆個定時器,但就是這倆個定時器程序不太會
回復(fù)

使用道具 舉報

板凳
ID:303383 發(fā)表于 2018-9-20 09:18 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
回復(fù)

使用道具 舉報

地板
ID:387733 發(fā)表于 2018-9-20 17:21 | 只看該作者
函數(shù)“chuankou()”中 EA=0; 把全局中斷關(guān)閉了,這樣調(diào)用一次以后,就不會再有中斷了,這里沒必要關(guān)閉全局中斷的。
把 EA=0;去掉應(yīng)該就可以了。
回復(fù)

使用道具 舉報

5#
ID:291819 發(fā)表于 2018-9-27 16:19 | 只看該作者
sxhwdz 發(fā)表于 2018-9-20 17:21
函數(shù)“chuankou()”中 EA=0; 把全局中斷關(guān)閉了,這樣調(diào)用一次以后,就不會再有中斷了,這里沒必要關(guān)閉全 ...

把EA=0去掉也不行
回復(fù)

使用道具 舉報

6#
ID:291819 發(fā)表于 2018-9-27 16:20 | 只看該作者
小貓貓愛吃魚 發(fā)表于 2018-9-20 09:18
你好!兩次定時器的使用出現(xiàn)了沖突,要重新寫一部分程序了。。。

是不是需要寫這倆個定時器的中斷優(yōu)先級程序
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美1区| 日韩精品一区二区三区老鸭窝 | 国产婷婷色综合av蜜臀av | 亚洲精品电影在线观看 | 一区二区三区av | 亚洲国产精品一区二区三区 | 97超碰站| 九九九视频在线观看 | 日韩一 | 性色av一区二区三区 | 成人教育av| 国产精品久久午夜夜伦鲁鲁 | 欧美在线一区视频 | 国产精品久久久久久久免费观看 | 国产视频福利一区 | 欧美一二区| 国产精品揄拍一区二区 | 亚洲欧美国产毛片在线 | 综合五月 | 亚洲国产精品一区二区第一页 | 99re99 | 成年女人免费v片 | 欧美黄色精品 | 亚洲毛片| 成人区精品一区二区婷婷 | 3级毛片 | 香蕉视频在线播放 | 日韩在线免费 | 亚洲精品久久区二区三区蜜桃臀 | 久久久精品一区 | 亚洲国产精品激情在线观看 | 国产精品久久久久aaaa樱花 | 久久精品国产一区二区三区不卡 | 国产福利一区二区 | 亚洲视频国产视频 | 91资源在线| 国产一级毛片视频 | 男女爱爱福利视频 | 午夜精品一区二区三区在线视频 | 久久久精品一区二区三区 | 国产亚洲一区二区三区 |