欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 簡易的引體向上計(jì)數(shù)器 單片機(jī)紅外對管測數(shù)程序 [打印本頁]

作者: 新人求帶    時(shí)間: 2019-8-5 20:35
標(biāo)題: 簡易的引體向上計(jì)數(shù)器 單片機(jī)紅外對管測數(shù)程序
利用紅外對管測數(shù),之后把數(shù)據(jù)通過lcd1602顯示出來

單片機(jī)源程序如下:
  1. /*============================================================
  2. /
  3. ==============================================================
  4. SMC1602A(16*2)模擬口線接線方式
  5. 連接線圖:       
  6.        ---------------------------------------------------
  7.        |LCM-----51   |        LCM-----51   |        LCM------51      |
  8.        --------------------------------------------------|
  9.        |DB0-----P1.0 |        DB4-----P1.4 |        RW-------P3.4    |
  10.        |DB1-----P1.1 |        DB5-----P1.5 |        RS-------P3.3    |
  11.        |DB2-----P1.2 |        DB6-----P1.6 |        E--------P3.5    |
  12.        |DB3-----P1.3 |        DB7-----P1.7 |        VLCD接1K電阻到GND|
  13.        ---------------------------------------------------
  14. 接線:模塊TRIG接 P2.6  ECH0 接P2.7


  15. =============================================================*/
  16. #include <AT89x51.H>                //器件配置文件
  17. #include <intrins.h>
  18. #define  Rin  P3_7

  19. #define LCM_RW  P1_1 //定義LCD引腳
  20. #define LCM_RS  P1_0
  21. #define LCM_E   P1_5
  22. #define LCM_Data  P0

  23. #define Key_Data P2_0 //定義Keyboard引腳
  24. #define Key_CLK  P3_2

  25. #define Busy    0x80 //用于檢測LCM狀態(tài)字中的Busy標(biāo)識

  26. void LCMInit(void);
  27. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  28. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  29. void Delay5Ms(void);
  30. void Delay400Ms(void);
  31. void Decode(unsigned char ScanCode);
  32. void WriteDataLCM(unsigned char WDLCM);
  33. void WriteCommandLCM(unsigned char WCLCM,BuysC);
  34. void Conut(void);

  35. unsigned char ReadDataLCM(void);
  36. unsigned char ReadStatusLCM(void);
  37. unsigned char code mcustudio[] ={"number:"};
  38. unsigned char code Cls[] =      {"                "};
  39. unsigned char code ASCII[10] =    {'0','1','2','3','4','5','6','7','8','9'};

  40. static unsigned char DisNum = 0; //顯示用指針       
  41. unsigned int  time=0;
  42. bit      flag =0;
  43. unsigned char disbuff[4]={ 0,0,0,0,};
  44. unsigned long S = 0;
  45. volatile bit FlagSucceed=0;     //測量成功標(biāo)志
  46. sbit Beep=P2^0;          //報(bào)警蜂鳴器
  47. sbit LedAlarm = P2^1;

  48. void WriteDataLCM(unsigned char WDLCM)
  49. {
  50.         ReadStatusLCM(); //檢測忙
  51.         LCM_Data = WDLCM;
  52.         LCM_RS = 1;
  53.         LCM_RW = 0;
  54.         LCM_E = 0; //若晶振速度太高可以在這后加小的延時(shí)
  55.         LCM_E = 0; //延時(shí)
  56.         LCM_E = 1;
  57. }

  58. //寫指令
  59. void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時(shí)忽略忙檢測
  60. {
  61.         if (BuysC) ReadStatusLCM(); //根據(jù)需要檢測忙
  62.         LCM_Data = WCLCM;
  63.         LCM_RS = 0;
  64.         LCM_RW = 0;       
  65.         LCM_E = 0;
  66.         LCM_E = 0;
  67.         LCM_E = 1;       
  68.   }

  69. //讀數(shù)據(jù)
  70. unsigned char ReadDataLCM(void)
  71. {
  72.         LCM_RS = 1;
  73.         LCM_RW = 1;
  74.         LCM_E = 0;
  75.         LCM_E = 0;
  76.         LCM_E = 1;
  77.         return(LCM_Data);
  78. }

  79. //讀狀態(tài)
  80. unsigned char ReadStatusLCM(void)
  81. {
  82.         LCM_Data = 0xFF;
  83.         LCM_RS = 0;
  84.         LCM_RW = 1;
  85.         LCM_E = 0;
  86.         LCM_E = 0;
  87.         LCM_E = 1;
  88.         while (LCM_Data & Busy); //檢測忙信號
  89.         return(LCM_Data);
  90. }

  91. void LCMInit(void) //LCM初始化
  92. {
  93.         LCM_Data = 0;
  94.         WriteCommandLCM(0x38,0); //三次顯示模式設(shè)置,不檢測忙信號
  95.         Delay5Ms();
  96.         WriteCommandLCM(0x38,0);
  97.         Delay5Ms();
  98.         WriteCommandLCM(0x38,0);
  99.         Delay5Ms();

  100.         WriteCommandLCM(0x38,1); //顯示模式設(shè)置,開始要求每次檢測忙信號
  101.         WriteCommandLCM(0x08,1); //關(guān)閉顯示
  102.         WriteCommandLCM(0x01,1); //顯示清屏
  103.         WriteCommandLCM(0x06,1); // 顯示光標(biāo)移動(dòng)設(shè)置
  104.         WriteCommandLCM(0x0F,1); // 顯示開及光標(biāo)設(shè)置
  105. }

  106. //按指定位置顯示一個(gè)字符
  107. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  108. {
  109.         Y &= 0x1;
  110.         X &= 0xF; //限制X不能大于15,Y不能大于1
  111.         if (Y) X |= 0x40; //當(dāng)要顯示第二行時(shí)地址碼+0x40;
  112.         X |= 0x80; //算出指令碼
  113.         WriteCommandLCM(X, 1); //發(fā)命令字
  114.         WriteDataLCM(DData); //發(fā)數(shù)據(jù)
  115. }

  116. //按指定位置顯示一串字符
  117. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  118. {
  119.         unsigned char ListLength;

  120.   ListLength = 0;
  121.         Y &= 0xFE;
  122.         X &= 0xFF; //限制X不能大于15,Y不能大于1
  123.         while (DData[ListLength]>0x19) //若到達(dá)字串尾則退出
  124.                 {
  125.                         if (X <= 0xF) //X坐標(biāo)應(yīng)小于0xF
  126.                                 {
  127.                                         DisplayOneChar(X, Y, DData[ListLength]); //顯示單個(gè)字符
  128.                                         ListLength++;
  129.                                         X++;
  130.                                 }
  131.                 }
  132. }

  133. //5ms延時(shí)
  134. void Delay5Ms(void)
  135. {
  136.         unsigned int TempCyc = 5552;
  137.         while(TempCyc--);
  138. }

  139. //400ms延時(shí)
  140. void Delay400Ms(void)
  141. {
  142.         unsigned char TempCycA = 5;
  143.         unsigned int TempCycB;
  144.         while(TempCycA--)
  145.                 {
  146.                         TempCycB=7269;
  147.                         while(TempCycB--);
  148.                 };
  149. }
  150. /********************************************************/
  151. void Conut(void)
  152.         {                                       
  153.          time=TH0*256+TL0;
  154.          TH0=0;
  155.          TL0=0;
  156.          S+=1;     //算出來是
  157.          Beep = 0;       


  158.          if((S>=1000)||flag==1) //超出測量范圍顯示“-”
  159.          {         
  160.           flag=0;
  161.          
  162.           DisplayOneChar(0, 1, ASCII[0]);
  163.           DisplayOneChar(1, 1, ASCII[1]);
  164.           DisplayOneChar(2, 1, ASCII[2]);
  165.          }
  166.          else
  167.          {
  168.           disbuff[0]=S/100%10;
  169.           disbuff[1]=S/10%10;
  170.           disbuff[2]=S%10;
  171.           DisplayOneChar(0, 1, ASCII[disbuff[0]]);
  172.           DisplayOneChar(1, 1, ASCII[disbuff[1]]);
  173.           DisplayOneChar(2, 1, ASCII[disbuff[2]]);
  174.          }

  175.         }                       
  176.         /********************************************************/
  177.      void zd0() interrupt 1                  //T0中斷用來計(jì)數(shù)器溢出,超過測距范圍
  178.   {
  179.     flag=1;                                                         //中斷溢出標(biāo)志
  180.        
  181.   }
  182. /********************************************************/
  183.      void  StartModule()                          //啟動(dòng)模塊
  184.   {
  185.            Rin=0;                                             //啟動(dòng)一次模塊
  186.           _nop_();
  187.           _nop_();
  188.           _nop_();
  189.           _nop_();
  190.           _nop_();
  191.           _nop_();
  192.           _nop_();
  193.           _nop_();
  194.           _nop_();
  195.           _nop_();
  196.           _nop_();
  197.           _nop_();
  198.           _nop_();
  199.           _nop_();
  200.           _nop_();
  201.           _nop_();
  202.           _nop_();
  203.           _nop_();
  204.           _nop_();
  205.           _nop_();
  206.           _nop_();
  207.           Rin=1;
  208.   }
  209. /********************************************************/
  210. void delayms(unsigned int ms)
  211. {
  212.         unsigned char i=100,j;
  213.         for(;ms;ms--)
  214.         {
  215.                 while(--i)
  216.                 {
  217.                         j=10;
  218.                         while(--j);
  219.                 }
  220.         }
  221. }
  222. /*********************************************************/
  223. void main(void)
  224. {

  225.        
  226.         unsigned char TempCyc;
  227.         LedAlarm = 1;
  228.         Delay400Ms(); //啟動(dòng)等待,等LCM講入工作狀態(tài)
  229.         LCMInit(); //LCM初始化
  230.         Delay5Ms(); //延時(shí)片刻(可不要)
  231.         DisplayListChar(0, 0, mcustudio);
  232.         ReadDataLCM();//測試用句無意義
  233.         for (TempCyc=0; TempCyc<10; TempCyc++)
  234.         Delay400Ms(); //延時(shí)                       
  235.         while(1)
  236.           {
  237.              StartModule();
  238.                  DisplayOneChar(0, 1, ASCII[0]);

  239.              while(!Rin);                //當(dāng)RX為零時(shí)等待
  240.                  TR0=0;                                //關(guān)閉計(jì)數(shù)
  241.                  
  242.          Conut();                        //計(jì)算
  243.                  Beep = 1;
  244.                  delayms(80);                //80MS

  245.              while(Rin);                        //當(dāng)RX為1計(jì)數(shù)并等待
  246.                  EA=0;
  247.                         //以下為一次檢測過程;先發(fā)出Trin電平,打開外部中斷,清零T1
  248.                         //最后在外部中斷下降沿觸發(fā)時(shí)取出T1當(dāng)前值,計(jì)算出Trig脈沖寬度
  249.              TR0=1;                            //開啟計(jì)數(shù)
  250.                  Beep = 0;
  251.           }
  252.                         }       
  253.                                                 
復(fù)制代碼

所有程序51hei提供下載:
調(diào)試.zip (173.52 KB, 下載次數(shù): 18)



作者: bemc    時(shí)間: 2019-8-6 09:51
采用多路紅外檢測才可靠吧
作者: 新人求帶    時(shí)間: 2019-8-6 15:27
bemc 發(fā)表于 2019-8-6 09:51
采用多路紅外檢測才可靠吧

多路的我沒試過,這是我大一下學(xué)期做的的一個(gè)東西,我的這個(gè)應(yīng)該算是很簡單的吧




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1