单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:12021|回复:19

用STC89C52做的蓝牙小车 HC05+pwm+寻迹+单片机源码

 [复制链接]
ID:166208发表于 2017-10-5 11:04|显示全部楼层


制作成功的小车实物图如下:
IMG_20171005_105735.jpg


0.png

单片机源程序如下:

  1. # include "reg51.h"
  2. # include "pwm.h"

  3. uchar flag,i,receive;
  4. uchar code table1[]="GO";
  5. uchar code table2[]="Back";
  6. uchar code table3[]="Left";
  7. uchar code table4[]="Right";
  8. uchar code table0[]="Stop";
  9. uchar code table5[]="2016111130";
  10. uchar code table6[]="Welcome to Lanya";

  11. sbit RS=P2^2;
  12. sbit RW=P2^3;
  13. sbit E=P2^4;


  14. void delay_50us(uint us)
  15. {
  16.    uint i,k;
  17.        for (i=us;i>0;i--)
  18.          for (k=100;k>0;k--);
  19. }
  20. void write_data(uint dat)  //定义写数据函数
  21. {
  22.      RS=1;
  23.        RW=0;
  24.        E=0;
  25.        P0=dat;         //送入数据
  26.      delay_50us(10);
  27.        E=1;
  28.      delay_50us(10);
  29.        E=0;           //到此数据送入完毕
  30. }      
  31. void write_com(uchar com)   //定义写指令函数
  32. {
  33.        RS=0;
  34.        RW=0;
  35.        E=0;
  36.        P0=com;         //送入指令
  37.      delay_50us(10);
  38.        E=1;
  39.      delay_50us(10);
  40.        E=0;           //到此指令送入完毕
  41. }
  42. void lcd1602inti(void)     //函数声明
  43. {
  44.      delay_50us(100);  //延时15ms
  45.        write_com(0x38);  //不检测忙信号
  46.        delay_50us(100);  //延时5ms
  47.        write_com(0x38);  //不检测忙信号
  48.        delay_50us(100);  //延时5ms
  49.        write_com(0x38);  //不检测忙信号
  50.        write_com(0x38);  //显示模式设置
  51.      write_com(0x08);  //显示关闭
  52.        write_com(0x01);  //显示清屏
  53.        write_com(0x06);  //显示光标移动设置
  54.        write_com(0x0c);  //显示开及光标设置
  55. }

  56. void display()          
  57. {  
  58.        uchar i;
  59.        lcd1602inti();
  60.    write_com(0x83);
  61.        for(i=0;i<10;i++)
  62.        {
  63.          write_data(table5[i]);   //table1[]="2016111130";
  64.    }
  65.    write_com(0xC0);
  66.        for(i=0;i<16;i++)
  67.        {
  68.          write_data(table6[i]);   //table2[]="Welcome to Lanya";
  69.    }
  70. }
  71. void Usartinit()         //初始化
  72. {
  73.       
  74.        TMOD=0x21;           //设置定时器1的工作方式2   0010 0000  GATE C/T   8位初值自动重装8位定时器
  75.                  //GATE  C/T M1 M0   GATE  C/T M1 M0   C/T位为1为计数模式  C/T位为0为定时模式
  76.        PCON=0x80;         //波特率加倍     电源管理寄存器
  77.    TH1=0xf3;           //给定时器重装初值
  78.        TL1=0xf3;     //这里的波特率必须加倍  不加倍的话 通讯不成功 本人目前还不知道原因
  79.                //由于开发板使用的晶振频率是12M,非标准频率,在设置波特率时很容易产生误差,而导致串口通信出现乱码或者失败
  80.                //目前来说,选择波特率4800,SMOD=1波特率加倍的方式,误差率仅为0.16%,为12M晶振中最小的误差
  81.        TH0=0XEC;     //5ms定时  
  82.        TL0=0X78;  
  83.        TR0=1;  
  84.        ET0=1;
  85.    TR1=1;           //开定时器1
  86.    SM0=0;           //选择串口工作方式1,常用
  87.        SM1=1;  
  88.    REN=1;           //开串口接收   此时接收器一所选择的波特率16倍速率采样RXD移交的电平 开始接收信息
  89.    ES=1;           //串行中断总开关
  90.        EA=1;           //开总中断
  91. }      
  92. void main()
  93. {
  94.        lcd1602inti();
  95.        Usartinit();   //调用初始化函数进行初始化
  96.    display();
  97.    while(1)
  98.        {
  99.      if(flag==1)//不断的检测标志位是否被置1  被置1说明已经执行了中断服务程序,即已经接数据,否则一直检测flag的状态
  100.        {
  101.      switch(receive)
  102.            {
  103.              case 1:   run();  
  104.                    ES=0;   //接下来要发送数据 先要使ES=0关闭串口中断 等数据发送完后再打开串口中断
  105.                  for(i=0;i<2;i++)
  106.                      {
  107.                          SBUF=table1[i];
  108.                          while(!TI);   //等待是否发送完成 因为发送完成后TUI会有硬件置1
  109.                        TI=0;             //清除发送完成标志位  手动清0
  110.                  }            
  111.              ES=1;                      
  112.                  flag=0;                  
  113.                    break;
  114.          case 2:   backrun();      
  115.              ES=0;
  116.                        for(i=0;i<4;i++)
  117.                      {
  118.                            SBUF=table2[i];
  119.                              while(!TI);
  120.                              TI=0;      
  121.                          }            
  122.                        ES=1;
  123.                      flag=0;            
  124.                                  break;
  125.            case 3:  leftrun();      
  126.              ES=0;
  127.                      for(i=0;i<4;i++)
  128.                    {
  129.                                  SBUF=table3[i];
  130.                                  while(!TI);
  131.                                  TI=0;      
  132.                        }            
  133.              ES=1;                      
  134.                        flag=0;                  
  135.                      break;
  136.            case 4:   rightrun();
  137.              ES=0;
  138.                          for(i=0;i<5;i++)
  139.                            {
  140.                                SBUF=table4[i];
  141.                                while(!TI);
  142.                                TI=0;      
  143.                            }            
  144.                            ES=1;
  145.                            flag=0;            
  146.                                    break;
  147.            case 0:   stoprun();      
  148.                          ES=0;
  149.                            for(i=0;i<4;i++)
  150.                            {
  151.                                  SBUF=table0[i];
  152.                                  while(!TI);
  153.                                  TI=0;      
  154.                            }          
  155.                ES=1;                                      
  156.                    flag=0;      
  157.              }            
  158.          }
  159.        }
  160.   
  161. }
  162. void Usart() interrupt 4       //一旦有数据接入,串行口中断触发
  163. {
  164.    receive=SBUF-48;     //当REN为1时  开始接收数据 将接收到的值赋予receive   这里的是ACSII 所以要减去48
  165.    RI=0;           //当RI=0   将接收数据存入SBUF寄存器中  清除接收中断标志位  有内部硬件置1,项CPU发出中断请求 在中断服务程序中,必须用软件将其清零, 取消此中断申请
  166.    flag=1;                   //将标志位置1  这个是方便在主程序中查询判断是否已经接收到数据
  167. }


  168. ……………………

  169. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
蓝牙+pwm可用 勿删.zip(43.08 KB, 下载次数: 408)

评分

黑币 +64
收起理由
+ 5
很给力!
+ 5
赞一个!
+ 4
哇,很棒啊,一开始玩这个,挺好玩的
+ 50
共享资料的黑币奖励!

查看全部评分

ID:121019发表于 2017-10-12 23:27|显示全部楼层
相当厉害了
ID:69115发表于 2017-12-2 02:08|显示全部楼层
这个小车很好玩
ID:243552发表于 2017-12-3 21:42来自手机|显示全部楼层
成本100左右
ID:268704发表于 2018-1-3 14:07|显示全部楼层
这个里面有单独的pwm输出波没呀?
ID:166208发表于 2018-4-12 12:19|显示全部楼层
张帅帅 发表于 2018-1-3 14:07
这个里面有单独的pwm输出波没呀?

有的  当然要有啊
ID:46475发表于 2018-4-13 08:59|显示全部楼层
这个牛逼
ID:230975发表于 2018-4-13 09:44|显示全部楼层
原理图也有吗
ID:275384发表于 2018-4-14 14:18|显示全部楼层
很酷,我现在也在做这个,得到了启发
ID:311115发表于 2018-4-19 18:54|显示全部楼层
2515361695 发表于 2018-4-12 12:19
有的  当然要有啊

寻迹程序呢。。。
ID:382301发表于 2018-8-2 20:06|显示全部楼层
谢谢楼主,正好在做这个
ID:56932发表于 2019-4-11 11:06|显示全部楼层
最近想做一个一个,参考一下
ID:305511发表于 2019-4-13 20:49|显示全部楼层
楼主太棒了,谢谢分享!
ID:372154发表于 2019-5-31 17:55|显示全部楼层
好资料 ,谢谢
ID:541842发表于 2019-6-16 11:05|显示全部楼层
强啊,小白看这个,正好
ID:611378发表于 2019-9-14 15:18|显示全部楼层
用户软件启动内部看门狗后:     复位关看门狗
ALE pin 仍为 ALE
内部时钟频率:11.998408M.
外部时钟频率:11.998408M.
IAP read MCU ID is error!
ID:620872发表于 2019-10-9 09:08|显示全部楼层
只需要蓝牙模块
ID:555907发表于 2019-11-19 14:31|显示全部楼层
很不错
ID:907553发表于 2023-5-12 11:26|显示全部楼层
有没有手机软件控制的
ID:1091382发表于 2023-9-10 17:03|显示全部楼层
看兄弟这操作,这红外避障模板可以绑十个吗?来个全方位避障。

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

Powered by 单片机教程网