找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 968|回复: 1
打印 上一主题 下一主题
收起左侧

最近写了个单片机小车的程序分享一下

[复制链接]
跳转到指定楼层
楼主
ID:463527 发表于 2019-6-17 10:13 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
喜欢32的朋友可以看一下 ,遥控的32小车程序

单片机源程序如下:
  1. #include "reg52.h"
  2. #include<intrins.h>       
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar count;      //0.5ms次数标识
  6. uchar jd;         //角度标识

  7. sbit DJ0 = P1^0;
  8. sbit DJ1 = P1^1;
  9. sbit DJ2 = P1^2;
  10. sbit DJ3 = P1^3;

  11. sbit Trig = P2^2;                        //超声波引脚
  12. sbit Echo = P2^3;
  13. unsigned int  time=0;
  14. unsigned long S=0;
  15. bit      flag =0;
  16. unsigned char disbuff[4]           ={ 0,0,0};

  17. sbit pwm = P2^4;          //PWM信号输出
  18. sbit led = P1^4 ;          //led信号输出
  19. uchar code table[]="I LOVE MCU!";
  20. sbit lcden=P2^6;        //液晶 使能
  21. sbit lcdrs=P2^7;        //液晶 数据命令

  22. void delay(uint z)                //延时函数
  23. {
  24.         uint x,y;
  25.         for(x=z;x>0;x--)
  26.                 for(y=110;y>0;y--);
  27. }

  28. void Stop()                                //小车停止
  29. {
  30.         DJ0 = 0;
  31.         DJ1 = 0;
  32.         DJ2 = 0;
  33.         DJ3 = 0;
  34.        
  35. }
  36. void XiaoChe_GO()           //小车前进
  37. {               
  38.         DJ0 = 0;
  39.         DJ1 = 1;
  40.         DJ2 = 0;
  41.         DJ3 = 1;       
  42.        
  43. }
  44. void XiaoChe_Back()           //小车后退
  45. {               
  46.         DJ0 = 1;
  47.         DJ1 = 0;
  48.         DJ2 = 1;
  49.         DJ3 = 0;       
  50. }
  51. void XiaoChe_Zuo()           //小车左转
  52. {               
  53.         DJ0 = 1;
  54.         DJ1 = 0;
  55.         DJ2 = 0;
  56.         DJ3 = 1;       
  57. }
  58. void XiaoChe_You()           //小车右转
  59. {               
  60.         DJ0 = 0;
  61.         DJ1 = 1;
  62.         DJ2 = 1;
  63.         DJ3 = 0;       
  64. }


  65. void write_com(uchar com)
  66. {
  67.         lcdrs=0;
  68.         P0=com;
  69.         delay(5);
  70.         lcden=1;
  71.         delay(5);
  72.         lcden=0;
  73. }
  74. void write_data(uchar date)
  75. {
  76.         lcdrs=1;
  77.         P0=date;
  78.         delay(5);
  79.         lcden=1;
  80.         delay(5);
  81.         lcden=0;
  82. }
  83. void init()
  84. {
  85.         lcden=0;
  86.         write_com(0x38);
  87.         write_com(0x0c);
  88.         write_com(0x06);
  89.         write_com(0x01);
  90. }
  91. void Time0_Init()          //定时器初始化
  92. {
  93.         TMOD = 0x11;           //定时器0工作在方式1   定时器1工作在方式1   
  94.         TH0  = 0xfe;
  95.         TL0  = 0x33;                   //11.0592MZ晶振,0.5ms
  96.         TH1 = 0;
  97.         TL1 = 0;
  98.        
  99.         EA=1;
  100.         ET0=1;
  101.         ET1=1;
  102.         TR0=1;                 //定时器开始  用于舵机转向
  103. }
  104. /*
  105. void Time0_Int() interrupt 1 //中断程序
  106. {
  107.                 TH0  = 0xfe;             //重新赋值
  108.                 TL0  = 0x33;
  109.     if(count<jd)              //判断0.5ms次数是否小于角度标识
  110.       pwm=1;                  //确实小于,PWM输出高电平
  111.     else
  112.       pwm=0;                  //大于则输出低电平

  113.     count=(count+1);          //0.5ms次数加1
  114.     count=count%40;                          //次数始终保持为40 即保持周期为20ms
  115. }
  116. */
  117. void zd0() interrupt 3                  //T0中断用来计数器溢出,超过测距范围
  118.   {
  119.     flag=1;                                                         //中断溢出标志
  120.   }

  121. void  StartModule()                          //启动模块
  122.   {
  123.           Trig=1;                                             //启动一次模块
  124.           _nop_();
  125.           _nop_();
  126.           _nop_();
  127.           _nop_();
  128.           _nop_();
  129.           _nop_();
  130.           _nop_();
  131.           _nop_();
  132.           _nop_();
  133.           _nop_();
  134.           _nop_();
  135.           _nop_();
  136.           _nop_();
  137.           _nop_();
  138.           _nop_();
  139.           _nop_();
  140.           _nop_();
  141.           _nop_();
  142.           _nop_();
  143.           _nop_();
  144.           _nop_();
  145.           Trig=0;
  146.   }

  147. void Conut(void)                        //计算结果
  148. {
  149.          time=TH1*256+TL1;
  150.          TH1=0;
  151.          TL1=0;
  152.        
  153.          S=(time*1.7)/10;     //算出来是MM
  154.         if((S>=700)||flag==1) //超出测量范围显示“-”
  155.          {
  156.                  flag=0;
  157.                  XiaoChe_GO();
  158.                  disbuff[0]=45;
  159.            disbuff[1]=45;
  160.            disbuff[2]=45;                         
  161.          }
  162.          else if(S < 100)
  163.          {
  164.                  XiaoChe_Zuo();
  165.                  delay(300);
  166.                  Stop();
  167.                  disbuff[0]=S%1000/100 + 0x30;
  168.            disbuff[1]=S%1000%100/10 + 0x30;
  169.            disbuff[2]=S%1000%10 %10 + 0x30;                 
  170.          }
  171.         else
  172.         {
  173.                  disbuff[0]=S%1000/100 + 0x30;
  174.            disbuff[1]=S%1000%100/10 + 0x30;
  175.            disbuff[2]=S%1000%10 %10 + 0x30;
  176.         }
  177.        
  178. }
  179. void main()
  180. {
  181.         int x=0;
  182.         uchar num;
  183.   Time0_Init();
  184.         init();
  185.         write_com(0x80);
  186.         for(num=0;num<11;num++)
  187.         {
  188.                 write_data(table[num]);
  189.                 delay(5);
  190.         }
  191. while(1)
  192. {
  193.                          x++;
  194.                          StartModule();
  195.              while(!Echo);                //当RX为零时等待
  196.              TR1=1;                            //开启计数
  197.              while(Echo);                        //当RX为1计数并等待
  198.              TR1=0;                                //关闭计数
  199.        Conut();                        //计算
  200.                          write_com(0x80+0x40);
  201.                                 for(num=0;num<3;num++)
  202.                                 {
  203.                                         write_data(disbuff[num]);
  204.                                         delay(5);
  205.                                 }
  206.                          delay(50);
  207.                         jd = 1;
  208.                         count = 0;
  209.                         delay(100);         
  210.                         jd = 2;
  211.                         count = 0;
  212.                         delay(100);
  213.                         jd = 3;
  214.                         count = 0;
  215.                         delay(100);       
  216.                         jd = 4;
  217.                         count = 0;
  218.                         delay(100);
  219.                         jd = 5;
  220.                         count = 0;
  221.                         delay(100);
  222.                                
  223.                                
  224.                         if(x%2 == 0)
  225.                                 led = !led;
  226.                        

  227. }
  228. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-6-17 14:49 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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