找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2376|回复: 0
收起左侧

串口控制直流电机程序 80C51单片机 L298N 普中51-单核-A4

[复制链接]
ID:903848 发表于 2021-4-11 14:37 | 显示全部楼层 |阅读模式
本帖最后由 KeepYn 于 2021-4-12 21:41 编辑
  1. /*1、串口发送00,电机停止转动,指示灯1点亮;
  2. 2、串口发送01,电机全速正转,指示灯2点亮;
  3. 3、串口发送02,电机全速反转,指示灯3点亮;
  4. 4、串口发送03,电机50%速度正转,指示灯2闪烁;
  5. 5、串口发送04,电机50%速度反转,指示灯3闪烁;
  6. 数码管代替指示灯(数码管的正向反向流动,流动速度的快慢代替指示灯)指示灯不亮不闪烁
  7. */
  8. #include <reg51.h>                       //头文件        #预处理命令符  inclue预处理命令
  9. #define uint  unsigned int
  10. #define uchar unsigned char
  11. uchar a,b,i;                           //定义全局变量a的值域,以便下面函数使用
  12. uchar SendBuf[]="The signal is normal";
  13.                                                             //定义数组,储存返回语句
  14. uchar code DMZ50[]={0x01,0x01,0x01,0x01,0x02,0x04,0x08,0x08,0x08,0x08,0x10,0x20};   //流水显示的段码,定义为正
  15. uchar code DMF50[]={0x20,0x10,0x08,0x08,0x08,0x08,0x04,0x02,0x01,0x01,0x01,0x01};   //流水显示的段码,定义为反
  16. uchar code DM0[]={0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36};  
  17.                                                                                   //流水显示的段码,停
  18. uchar code DMZ[] = {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x04,
  19.                              0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x20};
  20. uchar code DMF[] = {0x20,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
  21.                              0x04,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};
  22. sbit WA=P2^2;        
  23. sbit WB=P2^3;                                   //74HC138译码器位选管脚(数码管用)
  24. sbit WC=P2^4;
  25. /*蜂鸣器*/
  26. sbit BZ=P2^5;
  27. //L298N引脚定义      
  28. sbit ena = P1^0;         //l298n电机驱动的相关引脚
  29. sbit in1 = P1^1;
  30. sbit in2 = P1^2;
  31. sbit in3 = P1^3;
  32. sbit in4 = P1^4;
  33. sbit enb = P1^5;                          
  34. uchar MA = 0,MB = 0;           //pwm控制用
  35. uchar PWMA = 20;         
  36. uchar PWMB = 20;
  37. uchar cmd;                     //串口接收的命令sbuf
  38. void delay(uint z);            //声明延时函数
  39. /*数码管*/
  40. void showDigital()
  41. {  
  42. switch(cmd)  
  43. {
  44.   case(0):                                 
  45.         for(i=0;i<16;i++)
  46.         {
  47.                 switch(i)
  48.                 {   case(8):
  49.                                 WA = 0;WB = 0;WC = 0;break;
  50.                         case(9):
  51.                                 WA = 1;WB = 0;WC = 0;break;
  52.                         case(10):
  53.                                 WA = 0;WB = 1;WC = 0;break;
  54.                         case(11):
  55.                                 WA = 1;WB = 1;WC = 0;break;
  56.                         case(12):
  57.                                 WA = 0;WB = 0;WC = 1;break;
  58.                         case(13):
  59.                                 WA = 1;WB = 0;WC = 1;break;
  60.                         case(14):
  61.                                 WA = 0;WB = 1;WC = 1;break;
  62.                         case(15):
  63.                                 WA = 1;WB = 1;WC = 1;break;
  64.                     case(7):
  65.                                 WA = 0;WB = 0;WC = 0;break;
  66.                         case(6):
  67.                                 WA = 1;WB = 0;WC = 0;break;
  68.                         case(5):
  69.                                 WA = 0;WB = 1;WC = 0;break;
  70.                         case(4):
  71.                                 WA = 1;WB = 1;WC = 0;break;
  72.                         case(3):
  73.                                 WA = 0;WB = 0;WC = 1;break;
  74.                         case(2):
  75.                                 WA = 1;WB = 0;WC = 1;break;
  76.                         case(1):
  77.                                 WA = 0;WB = 1;WC = 1;break;
  78.                         case(0):
  79.                                 WA = 1;WB = 1;WC = 1;break;        
  80.                 }
  81.                 P0 = DM0[i];
  82.                 delay(250);
  83.         }
  84.   break;  
  85.   case(3):                                 
  86.         for(i=0;i<12;i++)
  87.         {
  88.                 switch(i)
  89.                 {
  90.                         case(11):
  91.                                 WA = 1;WB = 1;WC = 1;break;
  92.                         case(10):
  93.                                 WA = 1;WB = 1;WC = 1;break;
  94.                         case(9):
  95.                                 WA = 1;WB = 1;WC = 1;break;
  96.                         case(8):
  97.                                 WA = 0;WB = 1;WC = 1;break;
  98.                         case(7):
  99.                                 WA = 1;WB = 0;WC = 1;break;
  100.                         case(6):
  101.                                 WA = 0;WB = 0;WC = 1;break;
  102.                         case(5):
  103.                                 WA = 0;WB = 0;WC = 1;break;
  104.                         case(4):
  105.                                 WA = 0;WB = 0;WC = 1;break;
  106.                         case(3):
  107.                                 WA = 0;WB = 0;WC = 1;break;
  108.                         case(2):
  109.                                 WA = 1;WB = 0;WC = 1;break;
  110.                         case(1):
  111.                                 WA = 0;WB = 1;WC = 1;break;
  112.                         case(0):
  113.                                 WA = 1;WB = 1;WC = 1;break;
  114.                 }
  115.                 P0 = DMZ50[i];
  116.                 delay(50);
  117.         }
  118.   break;
  119.   case(4):                                 
  120.         for(i=0;i<12;i++)
  121.         {
  122.                 switch(i)
  123.                 {
  124.                         case(0):
  125.                                 WA = 1;WB = 1;WC = 1;break;
  126.                         case(1):
  127.                                 WA = 1;WB = 1;WC = 1;break;
  128.                         case(2):
  129.                                 WA = 1;WB = 1;WC = 1;break;
  130.                         case(3):
  131.                                 WA = 0;WB = 1;WC = 1;break;
  132.                         case(4):
  133.                                 WA = 1;WB = 0;WC = 1;break;
  134.                         case(5):
  135.                                 WA = 0;WB = 0;WC = 1;break;
  136.                         case(6):
  137.                                 WA = 0;WB = 0;WC = 1;break;
  138.                         case(7):
  139.                                 WA = 0;WB = 0;WC = 1;break;
  140.                         case(8):
  141.                                 WA = 0;WB = 0;WC = 1;break;
  142.                         case(9):
  143.                                 WA = 1;WB = 0;WC = 1;break;
  144.                         case(10):
  145.                                 WA = 0;WB = 1;WC = 1;break;
  146.                         case(11):
  147.                                 WA = 1;WB = 1;WC = 1;break;
  148.                 }
  149.                 P0 = DMF50[i];
  150.                 delay(50);
  151.         }
  152.   break;
  153.   case(1):                                 
  154.         for(i=0;i<20;i++)
  155.         {
  156.                 switch(i)
  157.                 {        case(19):
  158.                                 WA = 1;WB = 1;WC = 1;break;
  159.                         case(18):
  160.                                 WA = 1;WB = 1;WC = 1;break;
  161.                         case(17):
  162.                                 WA = 1;WB = 1;WC = 1;break;
  163.                         case(16):
  164.                                 WA = 0;WB = 1;WC = 1;break;
  165.                         case(15):
  166.                                 WA = 1;WB = 0;WC = 1;break;
  167.                         case(14):
  168.                                 WA = 0;WB = 0;WC = 1;break;
  169.                         case(13):
  170.                                 WA = 1;WB = 1;WC = 0;break;
  171.                         case(12):
  172.                                 WA = 0;WB = 1;WC = 0;break;
  173.                         case(11):
  174.                                 WA = 1;WB = 0;WC = 0;break;
  175.                         case(10):
  176.                                 WA = 0;WB = 0;WC = 0;break;
  177.                         case(9):
  178.                                 WA = 0;WB = 0;WC = 0;break;
  179.                     case(8):
  180.                                 WA = 0;WB = 0;WC = 0;break;
  181.                         case(7):
  182.                                 WA = 0;WB = 0;WC = 0;break;
  183.                         case(6):
  184.                                 WA = 1;WB = 0;WC = 0;break;
  185.                         case(5):
  186.                                 WA = 0;WB = 1;WC = 0;break;
  187.                         case(4):
  188.                                 WA = 1;WB = 1;WC = 0;break;
  189.                         case(3):
  190.                                 WA = 0;WB = 0;WC = 1;break;
  191.                         case(2):
  192.                                 WA = 1;WB = 0;WC = 1;break;
  193.                         case(1):
  194.                                 WA = 0;WB = 1;WC = 1;break;
  195.                         case(0):
  196.                                 WA = 1;WB = 1;WC = 1;break;
  197.                 }
  198.                 P0 = DMZ[i];
  199.                 delay(25);
  200.         }
  201.   break;
  202.   case(2):                                 
  203.         for(i=0;i<20;i++)
  204.         {
  205.                 switch(i)
  206.                 {        case(0):
  207.                                 WA = 1;WB = 1;WC = 1;break;
  208.                         case(1):
  209.                                 WA = 1;WB = 1;WC = 1;break;
  210.                         case(2):
  211.                                 WA = 1;WB = 1;WC = 1;break;
  212.                         case(3):
  213.                                 WA = 0;WB = 1;WC = 1;break;
  214.                         case(4):
  215.                                 WA = 1;WB = 0;WC = 1;break;
  216.                         case(5):
  217.                                 WA = 0;WB = 0;WC = 1;break;
  218.                         case(6):
  219.                                 WA = 1;WB = 1;WC = 0;break;
  220.                         case(7):
  221.                                 WA = 0;WB = 1;WC = 0;break;
  222.                         case(8):
  223.                                 WA = 1;WB = 0;WC = 0;break;
  224.                         case(9):
  225.                                 WA = 0;WB = 0;WC = 0;break;
  226.                         case(10):
  227.                                 WA = 0;WB = 0;WC = 0;break;
  228.                     case(11):
  229.                                 WA = 0;WB = 0;WC = 0;break;
  230.                         case(12):
  231.                                 WA = 0;WB = 0;WC = 0;break;
  232.                         case(13):
  233.                                 WA = 1;WB = 0;WC = 0;break;
  234.                         case(14):
  235.                                 WA = 0;WB = 1;WC = 0;break;
  236.                         case(15):
  237.                                 WA = 1;WB = 1;WC = 0;break;
  238.                         case(16):
  239.                                 WA = 0;WB = 0;WC = 1;break;
  240.                         case(17):
  241.                                 WA = 1;WB = 0;WC = 1;break;
  242.                         case(18):
  243.                                 WA = 0;WB = 1;WC = 1;break;
  244.                         case(19):
  245.                                 WA = 1;WB = 1;WC = 1;break;
  246.                 }
  247.                 P0 = DMF[i];
  248.                 delay(25);
  249.         }
  250.   break;  
  251. }
  252. }
  253. /*全速正转*/
  254. void forward()                                   
  255. {                                                   
  256. in1=1;                         //l298n手册,真值
  257. in2=0;  
  258. in3=1;  
  259. in4=0;
  260. PWMA = 20;
  261. PWMB = 20;
  262. }
  263. /*全速反转*/
  264. void fallback()
  265. {
  266. in1=0;  
  267. in2=1;  
  268. in3=0;  
  269. in4=1;
  270. PWMA = 20;
  271. PWMB = 20;
  272. }
  273. /*50占空比正转*/
  274. void quick()         
  275. {
  276. in1=1;                 
  277. in2=0;
  278. PWMA = 10;
  279. in3=1;  
  280. in4=0;
  281. PWMB = 10;
  282. }
  283. /*50占空比反转*/
  284. void slow()
  285. {
  286. in1=0;  
  287. in2=1;
  288. PWMA = 10;
  289. in3=0;  
  290. in4=1;
  291. PWMB = 10;
  292. }
  293. /*停*/
  294. void stop()
  295. {
  296. in1=0;  
  297. in2=0;  
  298. in3=0;  
  299. in4=0;
  300. }
  301. void delay(uint z)
  302. {  
  303. uint x,y;  
  304. for(x=z;x>0;x--)   
  305. for(y=115;y>0;y--);
  306. }
  307. void SendOneByte(uchar *str)   //串口发送数据
  308. {
  309.   while(*str !='\0')
  310.   {
  311.   SBUF=*str;
  312.   while(!TI);
  313.   TI=0;
  314.   str++;
  315.   }
  316. }
  317. void main()                           //定义主函数,返回值为空
  318. {   
  319. //串口定时器 定时器T0
  320. TMOD = 0x21;                   //T0定时器为工作方式一,T1定时器为工作方式二
  321. PCON = 0x00;                   //串口初始化相关,波特率
  322. SCON = 0x50;                   //串口初始化相关,串口工作方式一,允许接收
  323. TH1  = 0xFD;                   //设置初值
  324. TL1  = 0xFD;                   //设置初值
  325. TR1  = 1;                      //开启定时器T1


  326. TH0 = 0xF4;                    //设置初值
  327. TL0 = 0x48;                    //设置初值
  328. TR0 = 1;                       //开启定时器T0
  329. ES  = 1;                       //开放串口中断
  330. PT0 = 1;                       //定时器0中断优先
  331. ET0 = 1;                       //开放定时器T0中断
  332. EA  = 1;                       //开放总中断
  333. SendOneByte("Receiving from 8051...\r\n");      //发送字符串,结尾回车换行
  334. while(1)
  335.    {
  336.    showDigital();
  337.    SendOneByte("\r\n");
  338.    delay(500);
  339.    SendOneByte(SendBuf);
  340.    }
  341. }
  342. void time0_int() interrupt 1   
  343. {  
  344. TR0 = 0;      
  345. TH0 = (65536-500)/256;
  346. TL0 = (65536-500)%256;
  347. MA++;         
  348. if(MA < PWMA)  
  349. {   
  350. ena = 1;                                 //使用ena来产生pwm波控制A端电机
  351. }  
  352. else
  353.   ena = 0;  
  354. if(MA == 40)
  355. {   
  356.   MA = 0;  
  357. }  

  358. MB++;         
  359. if(MB < PWMB)  
  360. {   
  361. enb = 1;                             //使用enb来产生pwm波控制B端电机
  362. }  
  363. else
  364.   enb = 0;  
  365. if(MB == 40)
  366. {   
  367.   MB = 0;  
  368. }  
  369. TR0 = 1;
  370. }
  371. void UARTInterrupt(void) interrupt 4
  372. {
  373. if(RI)
  374. {
  375. RI = 0;
  376. cmd = SBUF;
  377. switch(cmd)
  378. {
  379. case 1:
  380. forward();
  381. break;
  382. case 2:
  383. fallback();
  384. break;
  385. case 3:
  386. quick();
  387. break;
  388. case 4:
  389. slow();
  390. break;
  391. case 0:
  392. stop();
  393. default:
  394. break;
  395. }
  396. }
  397. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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