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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1766|回復: 1
打印 上一主題 下一主題
收起左側

51單片機脈寬測量程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:390798 發表于 2018-8-28 15:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
  1. #include <reg51.H>  //器件配置文件
  2. #include <intrins.h>
  3. sbit  RX = P3^6;
  4. sbit TX = P3^7 ;
  5. sbit LCM_RW = P2^5; //定義LCD引腳
  6. sbit LCM_RS = P2^6 ;
  7. sbit LCM_E = P2^4 ;
  8. #define LCM_Data P0
  9. sbit Key_Data = P3^3 ;//定義Keyboard引腳
  10. sbit Key_CLK = P3^2 ;
  11. #define Busy    0x80 //用于檢測LCM狀態字中的Busy標識
  12. void LCMInit(void);
  13. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  14. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  15. void Delay5Ms(void);
  16. void Delay400Ms(void);
  17. void Decode(unsigned char ScanCode);
  18. void WriteDataLCM(unsigned char WDLCM);
  19. void WriteCommandLCM(unsigned char WCLCM,BuysC);
  20. unsigned char ReadDataLCM(void);
  21. unsigned char ReadStatusLCM(void);
  22. unsigned char code mcustudio[] ={"==Range Finder=="};
  23. unsigned char code email[] =    {"heyaodz@163.com "};
  24. unsigned char code Cls[] =      {"                "};
  25. unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
  26. static unsigned char DisNum = 0; //顯示用指針      
  27.        unsigned int  time=0;
  28.     unsigned long S=0;
  29.     bit      flag =0;
  30.     unsigned char disbuff[4]    ={ 0,0,0,0,};

  31. //寫數據
  32. void WriteDataLCM(unsigned char WDLCM)
  33. {
  34. ReadStatusLCM(); //檢測忙
  35. LCM_Data = WDLCM;
  36. LCM_RS = 1;
  37. LCM_RW = 0;
  38. LCM_E = 0; //若晶振速度太高可以在這后加小的延時
  39. LCM_E = 0; //延時
  40. LCM_E = 1;
  41. }
  42. //寫指令
  43. void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測
  44. {
  45. if (BuysC) ReadStatusLCM(); //根據需要檢測忙
  46. LCM_Data = WCLCM;
  47. LCM_RS = 0;
  48. LCM_RW = 0;
  49. LCM_E = 0;
  50. LCM_E = 0;
  51. LCM_E = 1;
  52. }
  53. //讀數據
  54. unsigned char ReadDataLCM(void)
  55. {
  56. LCM_RS = 1;
  57. LCM_RW = 1;
  58. LCM_E = 0;
  59. LCM_E = 0;
  60. LCM_E = 1;
  61. return(LCM_Data);
  62. }
  63. //讀狀態
  64. unsigned char ReadStatusLCM(void)
  65. {
  66. LCM_Data = 0xFF;
  67. LCM_RS = 0;
  68. LCM_RW = 1;
  69. LCM_E = 0;
  70. LCM_E = 0;
  71. LCM_E = 1;
  72. while (LCM_Data & Busy); //檢測忙信號
  73. return(LCM_Data);
  74. }
  75. void LCMInit(void) //LCM初始化
  76. {
  77. LCM_Data = 0;
  78. WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
  79. Delay5Ms();
  80. WriteCommandLCM(0x38,0);
  81. Delay5Ms();
  82. WriteCommandLCM(0x38,0);
  83. Delay5Ms();
  84. WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
  85. WriteCommandLCM(0x08,1); //關閉顯示
  86. WriteCommandLCM(0x01,1); //顯示清屏
  87. WriteCommandLCM(0x06,1); // 顯示光標移動設置
  88. WriteCommandLCM(0x0F,1); // 顯示開及光標設置
  89. }
  90. //按指定位置顯示一個字符
  91. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  92. {
  93. Y &= 0x1;
  94. X &= 0xF; //限制X不能大于15,Y不能大于1
  95. if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
  96. X |= 0x80; //算出指令碼
  97. WriteCommandLCM(X, 1); //發命令字
  98. WriteDataLCM(DData); //發數據
  99. }
  100. //按指定位置顯示一串字符
  101. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  102. {
  103. unsigned char ListLength;
  104.   ListLength = 0;
  105. Y &= 0x1;
  106. X &= 0xF; //限制X不能大于15,Y不能大于1
  107. while (DData[ListLength]>0x19) //若到達字串尾則退出
  108.   {
  109.    if (X <= 0xF) //X坐標應小于0xF
  110.     {
  111.      DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
  112.      ListLength++;
  113.      X++;
  114.     }
  115.   }
  116. }
  117. //5ms延時
  118. void Delay5Ms(void)
  119. {
  120. unsigned int TempCyc = 5552;
  121. while(TempCyc--);
  122. }
  123. //400ms延時
  124. void Delay400Ms(void)
  125. {
  126. unsigned char TempCycA = 5;
  127. unsigned int TempCycB;
  128. while(TempCycA--)
  129.   {
  130.    TempCycB=7269;
  131.    while(TempCycB--);
  132.   };
  133. }
  134. /********************************************************/
  135.     void Conut(void)
  136. {
  137.   time=TH0*256+TL0;
  138.   TH0=0;
  139.   TL0=0;

  140.   S=(time*1.8)/10;     //算出來是MM
  141.   if((S>=7000)||flag==1) //超出測量范圍顯示“-”
  142.   {  
  143.    flag=0;
  144.   
  145.    DisplayOneChar(0, 1, ASCII[11]);
  146.    DisplayOneChar(1, 1, ASCII[10]); //顯示點
  147.    DisplayOneChar(2, 1, ASCII[11]);
  148.    DisplayOneChar(3, 1, ASCII[11]);
  149.    DisplayOneChar(4, 1, ASCII[11]);
  150.    DisplayOneChar(5, 1, ASCII[12]); //顯示M
  151.   }
  152.   else
  153.   {
  154.    disbuff[0]=S/1000;
  155.    disbuff[1]=S/100%10;
  156.    disbuff[2]=S/10%10;
  157.    disbuff[3]=S%10;
  158.    DisplayOneChar(0, 1, ASCII[disbuff[0]]);
  159.    DisplayOneChar(1, 1, ASCII[10]); //顯示點
  160.    DisplayOneChar(2, 1, ASCII[disbuff[1]]);
  161.    DisplayOneChar(3, 1, ASCII[disbuff[2]]);
  162.    DisplayOneChar(4, 1, ASCII[disbuff[3]]);
  163.    DisplayOneChar(5, 1, ASCII[12]); //顯示M
  164.   }
  165. }
  166. /********************************************************/
  167.      void zd0() interrupt 1    //T0中斷用來計數器溢出,超過測距范圍
  168.   {
  169.     flag=1;        //中斷溢出標志
  170. RX=0;
  171.   }
  172. /********************************************************/
  173.      void  StartModule()            //啟動模塊
  174.   {
  175.    TX=1;                        //啟動一次模塊
  176.    _nop_();
  177.    _nop_();
  178.    _nop_();
  179.    _nop_();
  180.    _nop_();
  181.    _nop_();
  182.    _nop_();
  183.    _nop_();
  184.    _nop_();
  185.    _nop_();
  186.    _nop_();
  187.    _nop_();
  188.    _nop_();
  189.    _nop_();
  190.    _nop_();
  191.    _nop_();
  192.    _nop_();
  193.    _nop_();
  194.    _nop_();
  195.    _nop_();
  196.    _nop_();
  197.    TX=0;
  198.   }
  199. void Timer_Count(void)
  200. {
  201.    TR0=1;       //開啟計數
  202.       while(RX);   //當RX為1計數并等待
  203.       TR0=0;    //關閉計數
  204.          Conut();   //計算
  205. }
  206. /********************************************************/
  207. void delayms(unsigned int ms)
  208. {
  209. unsigned char i=100,j;
  210. for(;ms;ms--)
  211. {
  212.   while(--i)
  213.   {
  214.    j=10;
  215.    while(--j);
  216.   }
  217. }
  218. }
  219. /*********************************************************/
  220. void main(void)
  221. {
  222.     unsigned int valA;
  223. unsigned char TempCyc;
  224. Delay400Ms(); //啟動等待,等LCM講入工作狀態
  225. LCMInit(); //LCM初始化
  226. Delay5Ms(); //延時片刻(可不要)
  227. DisplayListChar(0, 0, mcustudio);
  228. DisplayListChar(0, 1, email);
  229. ReadDataLCM();//測試用句無意義
  230. for (TempCyc=0; TempCyc<10; TempCyc++)
  231. Delay400Ms(); //延時
  232. DisplayListChar(0, 1, Cls);
  233.   TMOD=0x01;     //設T0為方式1,GATE=1;
  234.   TH0=0;
  235.   TL0=0;         
  236.   ET0=1;             //允許T0中斷
  237.   EA=1;      //開啟總中斷   

  238.   while(1)
  239.    {
  240.   
  241.   delayms(60);
  242.   RX=1;
  243.      StartModule();
  244.         for(valA=7510;valA>0;valA--)
  245.      {
  246.      
  247.         if(RX==1)
  248.      {
  249.            Timer_Count();
  250.      }
  251.       }
  252.    }
  253. }


復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2018-8-28 18:45 | 只看該作者
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚州精品成人 | 久久69精品久久久久久久电影好 | 免费观看色 | 精品欧美一区二区三区久久久小说 | 一区日韩 | 欧美综合久久久 | 手机av在线 | 国产高清精品在线 | 91爱爱·com| 欧美一级视频 | 免费一看一级毛片 | 亚洲欧美激情精品一区二区 | 中文字幕在线观看一区二区 | 国产在视频一区二区三区吞精 | 日韩电影中文字幕在线观看 | 日韩综合一区 | 午夜影院 | 中文字幕日韩在线 | 国产精品久久亚洲7777 | 久久亚洲一区二区 | 亚洲视频免费在线观看 | 欧美一区二区三区久久精品 | 日韩区| 亚洲国产精品一区二区三区 | 九九热在线视频观看这里只有精品 | 色999视频 | 91久久久久久久久久久久久 | 青青草这里只有精品 | 欧美国产精品一区二区三区 | 国产一区二区三区精品久久久 | 中文字幕1区 | 亚洲精品一区二区在线观看 | 国产永久免费 | 久久国产精品久久 | 欧美性受xxx | 久久9久 | 99热热精品| 在线观看中文字幕 | 午夜电影网 | 天天夜碰日日摸日日澡 | 日韩成年人视频在线 |