找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2158|回复: 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 单片机教程网

快速回复 返回顶部 返回列表