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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

簡易同位升降系統的單片機源碼(用超聲波測距實現)

[復制鏈接]
跳轉到指定樓層
樓主


全部資料51hei下載地址:
程序.zip (130.97 KB, 下載次數: 8)
Project Logs for 電鋼.zip (5.68 KB, 下載次數: 6)
  1. /*******************************************************************/
  2. /*******************超聲波測距儀************************************/
  3. /*******************(液晶屏顯示)************************************/
  4. /*******************晶振 11.0592MHz********************************/
  5. #include <reg52.h>
  6. #include "12864.h"
  7. #include <l298.h>
  8. typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable           無符號8位整型變量  */
  9. typedef signed   char  S8;       /* defined for signed 8-bits integer variable                  有符號8位整型變量  */
  10. typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable           無符號16位整型變量 */
  11. typedef signed   int   S16;      /* defined for signed 16-bits integer variable           有符號16位整型變量 */
  12. typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable           無符號32位整型變量 */
  13. //typedef signed   long  S32;      /* defined for signed 32-bits integer variable           有符號32位整型變量 */
  14. //typedef float          F32;      /* single precision floating point variable (32bits) 單精度浮點數(32位長度) */
  15. //typedef double         F64;      /* double precision floating point variable (64bits) 雙精度浮點數(64位長度) */
  16. //定時器0的定時值為1mS,即11059/12=922個時鐘脈沖,其補為65536-922=64614
  17. #define SYSTEMCLK      921600       //11059200/12
  18. #define T0CLK          921600       //11059200/12
  19. #define T1CLK          921600       //11059200/12
  20. #define T1PERIOD       1000000/921600   //T1周期時間,以微秒為單位,約為1.085uS
  21. #define TIMER0H        0xFC   //64614/256=252
  22. #define TIMER0L        0x66   //54447%256=102

  23. //管腳定義
  24. sbit Trig = P1^3;
  25. sbit Echo = P3^2;                      //回波必須接在外部中斷引腳上
  26. sbit Beep = P2^6;                 //報警蜂鳴器
  27. sbit k1=P3^0;
  28. sbit k2=P3^1;
  29. sbit k3=P3^3;
  30. sbit k4=P3^4;
  31. sbit k5=P3^5;
  32. sbit k6=P2^5;
  33. sbit k7=P2^7;
  34. sbit hy=P1^1;
  35. unsigned char code tab[]="0123456789 :.%";
  36. uint h=0,v=0;
  37. uint V1=0,s=0;
  38. uchar time1,puk1=100,k=1,w=0,m=0,puk=0;

  39. //定義標志
  40. volatile bit FlagSucceed = 0;     //測量成功標志
  41. volatile bit FlagDisplay = 0;     //顯示標志

  42. //定義全局變量
  43. U16 DisplayCount=0;
  44. U32 time=0;
  45. U32 distance=0;


  46. //函數聲明
  47. void delay_20us();
  48. void Start_Module();
  49. void INT0_Init(void);
  50. void Data_Init();
  51. void Timer0_Init();
  52. void Timer1_Init();

  53. //20us延時程序,不一定很準
  54. void delay_20us()
  55. {  
  56.     U16 bt ;
  57.     for(bt=0;bt<190;bt++);           //8M晶振是100
  58. }
  59. void delayms(uchar t)
  60. {
  61.         uchar a,b;
  62.         for(a=t;a>0;a--)
  63.          for(b=110;b>0;b--);
  64. }
  65. void speak()
  66. {
  67.         Beep=0;
  68.         delayms(200);
  69.         Beep=1;
  70. }
  71. //數據初始化
  72. void Data_Init()
  73. {
  74.         Trig = 0;
  75.         distance = 0;
  76.         DisplayCount = 0;

  77. }

  78. //外部中斷初始化函數
  79. void INT0_Init(void)
  80. {
  81.    IT0 = 0;          //負邊沿觸發中斷
  82.    EX0=0;            //關閉外部中斷
  83. }

  84. //外部中斷處理用做判斷回波電平
  85. void INT0_ISR (void) interrupt 0
  86. {      
  87.      time =TH1*256+TL1;    //取出定時器的值
  88.      FlagSucceed = 1;      //置成功測量的標志
  89.          if(s==1)
  90.          V1=3*puk1;
  91.          else
  92.          V1=0;
  93.          co_display (3,5,V1/100,V1%100/10,tab);
  94.          
  95.            EX0=0;   //關閉外部中斷
  96. }
  97. /////////////初始化定時器///////////////////
  98. void InitTimer0(void)
  99. {
  100.     TMOD = 0x11;
  101.     TH0=0xff;
  102.         TL0=0xfe;
  103.     EA = 1;
  104.     ET0 = 1;
  105.     TR0 = 1;
  106. }
  107. //////////////////PWM產生函數//////////////////////////////
  108. void Timer0Interrupt(void) interrupt 1
  109. {
  110.     TH0=0xff;
  111.         TL0=0xfe;                 //從新賦值
  112.     time1++;                                                  
  113.         if(time1<puk1)pwm1=1;         //time小于給的那個值時就是高電平
  114.         else
  115.                 if((time1>=puk1)&&(time1<=100))pwm1=0;                  // 如果puk1到100的就是低電平
  116.                 else
  117.                         if(time1>=100)time1=0;                                        //time大于100就清0                                 
  118. }                              



  119. //定時器1初始化,16位計數模式,時鐘為11059200/12=921600Hz
  120. //60ms計數為55296,即0xD800
  121. void Timer1_Init()
  122. {
  123.         TMOD = 0x11;    //定時器0和1工作在16位方式
  124.         TH1 =0;
  125.         TL1= 0;
  126.         ET1 = 1;
  127. }



  128. //啟動模塊,Trig管腳20us正脈沖
  129. void  Start_Module()                          //啟動模塊
  130. {
  131.    Trig=1;                                             //啟動一次模塊
  132.    delay_20us();
  133.    Trig=0;
  134. }


  135. /********************************************************************
  136. * 名稱 : Main()
  137. * 功能 : 主函數
  138. ***********************************************************************/
  139. void key()
  140. {
  141.   if(k1==0||hy==0)
  142.   {
  143.           pwm(w);
  144. //        puk1=puk;
  145.         cn_display(1,6,0,"啟");
  146.         s=1;
  147.   }
  148.   if(k2==0)
  149.   {
  150.     delay_20us();
  151.         delay_20us();
  152.         pwm(2);
  153.         s=0;
  154.         {
  155.           if(k==1)
  156.           cn_display(1,4,0,"伸"),w=1,k=0;
  157.           else if(k==0)
  158.           cn_display(1,4,0,"縮"),w=0,k=1;
  159.          // else
  160.          // cn_display(1,4,0,"停"),pwm(w),k=1;      
  161.         }
  162.   }      
  163.   if(k3==0)
  164.   {
  165.         h++;
  166.         if(h>=30)
  167.         h=30;
  168.   }
  169.    if(k4==0)
  170.   {
  171.         h--;
  172.         if(h==0)
  173.         h=30;
  174.   }
  175.   if(k5==0)
  176.   {
  177.         v++;
  178.         if(v>=30)
  179.         v=30;
  180.   }
  181.    if(k6==0)
  182.   {
  183.         v--;
  184.         if(v==0)
  185.         v=30;
  186.   }      
  187.   if(k7==0)
  188.   {
  189.     m++;
  190.     if(m>6)
  191.         m=0;
  192.   }
  193. }
  194. void chaosheng()
  195. {
  196.         EA= 0;        
  197.             //以下為一次檢測過程:先發出Trig電平,打開外部中斷,清零T1,
  198.                 //最后在外部中斷下降沿觸發時取出T1當前值,計算出Trig脈沖寬度。
  199.         while (Echo == 1) ;
  200.                 Start_Module();
  201.         while(Echo==0) ;//等待Echo回波引腳變高電平
  202.                 FlagSucceed = 0;
  203.                 EX0=1;
  204.                 TH1= 0;
  205.                 TL1= 0;
  206.                 TF1= 0;
  207.         TR1=1;          //啟動定時器1開始計數
  208.                 EA = 1;
  209.                 while (TH1<83) ; //盲區
  210.                 TR1 = 0 ;       //關閉定時器1
  211.                 EX0 = 0;        //關閉外部中斷
  212.         if(FlagSucceed==1)  //一次測試成功,則計算距離,單位為厘米
  213.             {        
  214.            distance = time * 1.085 ;       //計算得到脈沖時間(以微秒為單位)
  215.                    //將微秒時間轉變成厘米距離的算法:        Y米=(X秒*344)/2
  216.                    // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
  217.            distance /=58;
  218.                    //如果距離小于20cm,則聲光報警
  219.                    distance*=10;
  220.                    distance-=35;
  221.                    distance-=520;
  222.                    co_display (2,6,distance%1000/100,distance%100/10,tab);         
  223.                 }
  224. }
  225. void init()
  226. {
  227.     U16 i;
  228.         init_lcd ();
  229.     InitTimer0();
  230.         for(i=0;i<8;i++)
  231.         cn_display(1,i,i,"  陜西首屆高校  ");
  232.         for(i=0;i<8;i++)
  233.         cn_display(2,i,i,"教師電子設計競賽");
  234.         delayms(2000);
  235.         clrram ();
  236.     EA = 0;
  237.     INT0_Init();
  238.         Timer1_Init();  //定時器1初始化
  239.     Data_Init();
  240.         EA = 1;
  241.         for(i=0;i<8;i++)
  242.         cn_display(0,i,i,"同位伸縮控制系統");
  243.         for(i=0;i<8;i++)
  244.         cn_display(1,i,i," A狀態:        ");
  245.         pwm(2);
  246.         for(i=0;i<2;i++)
  247.         cn_display(2,i,i,"SET:");
  248.         cn_display(2,3,0,"cm");
  249.         cn_display(2,4,0,"RU");
  250.         cn_display(2,5,0,"N:");
  251.         cn_display(2,7,0,"cm");
  252.         cn_display(3,0,0,"V:");
  253.         cn_display(3,2,0,"mm");
  254.         cn_display(3,3,0,"/s");
  255.         cn_display(3,4,0,"V:");
  256.         cn_display(3,6,0,"mm");
  257.         cn_display(3,7,0,"/s");      
  258. }
  259. void main()
  260. {
  261.    uint l=1,pt=1;
  262.     init();
  263.         while(1)
  264.         {
  265.         chaosheng();
  266.         co_display (1,3,11,m%10,tab);
  267.         co_display (2,2,h/10,h%10,tab);
  268.         co_display (3,1,v/10,v%10,tab);
  269.       
  270.         if(m==0)
  271.         {
  272.         if((distance/10==h))      
  273.         {
  274.         pwm(2),w=2;
  275.         speak();
  276.         }                                                                          
  277.         }
  278.         if(m==1)
  279.         {
  280.           if((v*10)>V1)
  281.           {
  282.            puk1+=1;
  283.            if(puk1>=100)
  284.            puk1=100;
  285.           }
  286.           else
  287.           if((v*10)<V1)
  288.           {
  289.            puk1-=1;
  290.            if(puk1==40)
  291.            puk1=40;
  292.           }
  293.       else
  294.           {
  295.            speak();
  296.           }         
  297.         }
  298.         if(m==2)
  299.         {
  300.            if(distance/10==20)
  301.              pwm(0),pt=0;
  302.                  else if((distance/10<=1) &&pt==0)
  303.                  pwm(2),speak(),pt=1;
  304.         }
  305.         key();
  306.         }      
  307. }
復制代碼


評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久综合久色欧美综合狠狠 | 日韩精品无码一区二区三区 | 国产精品美女久久久久久久网站 | 亚洲一页 | 国产精品久久久久久久久久软件 | 一区二区在线 | 毛片免费观看视频 | 国产一区二区免费电影 | 三级av网址 | 日韩欧美在线不卡 | 亚洲一区二区精品 | 国产在线成人 | 欧美精品一级 | www.日韩| 欧美日韩视频 | 国产精品国产 | 777毛片| 国产成人jvid在线播放 | 国产精品久久久久久久久久久免费看 | 黄色免费在线观看网址 | 国产精品久久av | 亚洲精品视频一区二区三区 | 成人天堂| 成人精品视频 | 九九福利 | 国产成人综合亚洲欧美94在线 | 国产日韩欧美二区 | 国产aa | av黄色国产 | 欧美日在线 | 三级视频在线观看 | 中文字幕日韩欧美 | 一区二区在线观看免费视频 | 国产精彩视频 | 精品欧美在线观看 | 精品91久久久 | 国产精品久久久久久福利一牛影视 | 日本视频中文字幕 | 国产日本精品视频 | 国产精品免费看 | 国产成人一区二区三区 |