通过串口给单片机发送指令控制电机不同的转动状态,此程序是配合普中51-单核-A4开发板写的。请按需服用。欢迎留言讨论。

/*1、串口发送00,电机停止转动,指示灯1点亮;
2、串口发送01,电机全速正转,指示灯2点亮;
3、串口发送02,电机全速反转,指示灯3点亮;
4、串口发送03,电机50%速度正转,指示灯2闪烁;
5、串口发送04,电机50%速度反转,指示灯3闪烁;
数码管代替指示灯(数码管的正向反向流动,流动速度的快慢代替指示灯)指示灯不亮不闪烁
*/
#include <reg51.h>                       //头文件        #预处理命令符  inclue预处理命令
#define uint  unsigned int
#define uchar unsigned char
uchar a,b,i;                           //定义全局变量a的值域,以便下面函数使用
uchar SendBuf[]="The signal is normal";//定义数组,储存返回语句
uchar code DMZ50[]={0x01,0x01,0x01,0x01,0x02,0x04,0x08,0x08,0x08,0x08,0x10,0x20};   //流水显示的段码,定义为正
uchar code DMF50[]={0x20,0x10,0x08,0x08,0x08,0x08,0x04,0x02,0x01,0x01,0x01,0x01};   //流水显示的段码,定义为反
uchar code DM0[]={0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36};  //流水显示的段码,停
uchar code DMZ[] = {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x20};
uchar code DMF[] = {0x20,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};
sbit WA=P2^2;
sbit WB=P2^3;                                   //74HC138译码器位选管脚(数码管用)
sbit WC=P2^4;
/*蜂鸣器*/
sbit BZ=P2^5;
//L298N引脚定义
sbit ena = P1^0;         //l298n电机驱动的相关引脚
sbit in1 = P1^1;
sbit in2 = P1^2;
sbit in3 = P1^3;
sbit in4 = P1^4;
sbit enb = P1^5;
uchar MA = 0,MB = 0;           //pwm控制用
uchar PWMA = 20;
uchar PWMB = 20;
uchar cmd;                     //串口接收的命令sbuf
void delay(uint z);            //声明延时函数
/*数码管*/
void showDigital()
{
switch(cmd)
{case(0):                                 for(i=0;i<16;i++){switch(i){   case(8):WA = 0;WB = 0;WC = 0;break;case(9):WA = 1;WB = 0;WC = 0;break;case(10):WA = 0;WB = 1;WC = 0;break;case(11):WA = 1;WB = 1;WC = 0;break;case(12):WA = 0;WB = 0;WC = 1;break;case(13):WA = 1;WB = 0;WC = 1;break;case(14):WA = 0;WB = 1;WC = 1;break;case(15):WA = 1;WB = 1;WC = 1;break;case(7):WA = 0;WB = 0;WC = 0;break;case(6):WA = 1;WB = 0;WC = 0;break;case(5):WA = 0;WB = 1;WC = 0;break;case(4):WA = 1;WB = 1;WC = 0;break;case(3):WA = 0;WB = 0;WC = 1;break;case(2):WA = 1;WB = 0;WC = 1;break;case(1):WA = 0;WB = 1;WC = 1;break;case(0):WA = 1;WB = 1;WC = 1;break;        }P0 = DM0[i];delay(250);}break;  case(3):                                 for(i=0;i<12;i++){switch(i){case(11):WA = 1;WB = 1;WC = 1;break;case(10):WA = 1;WB = 1;WC = 1;break;case(9):WA = 1;WB = 1;WC = 1;break;case(8):WA = 0;WB = 1;WC = 1;break;case(7):WA = 1;WB = 0;WC = 1;break;case(6):WA = 0;WB = 0;WC = 1;break;case(5):WA = 0;WB = 0;WC = 1;break;case(4):WA = 0;WB = 0;WC = 1;break;case(3):WA = 0;WB = 0;WC = 1;break;case(2):WA = 1;WB = 0;WC = 1;break;case(1):WA = 0;WB = 1;WC = 1;break;case(0):WA = 1;WB = 1;WC = 1;break;}P0 = DMZ50[i];delay(50);}break;case(4):                                 for(i=0;i<12;i++){switch(i){case(0):WA = 1;WB = 1;WC = 1;break;case(1):WA = 1;WB = 1;WC = 1;break;case(2):WA = 1;WB = 1;WC = 1;break;case(3):WA = 0;WB = 1;WC = 1;break;case(4):WA = 1;WB = 0;WC = 1;break;case(5):WA = 0;WB = 0;WC = 1;break;case(6):WA = 0;WB = 0;WC = 1;break;case(7):WA = 0;WB = 0;WC = 1;break;case(8):WA = 0;WB = 0;WC = 1;break;case(9):WA = 1;WB = 0;WC = 1;break;case(10):WA = 0;WB = 1;WC = 1;break;case(11):WA = 1;WB = 1;WC = 1;break;}P0 = DMF50[i];delay(50);}break;case(1):                                 for(i=0;i<20;i++){switch(i){        case(19):WA = 1;WB = 1;WC = 1;break;case(18):WA = 1;WB = 1;WC = 1;break;case(17):WA = 1;WB = 1;WC = 1;break;case(16):WA = 0;WB = 1;WC = 1;break;case(15):WA = 1;WB = 0;WC = 1;break;case(14):WA = 0;WB = 0;WC = 1;break;case(13):WA = 1;WB = 1;WC = 0;break;case(12):WA = 0;WB = 1;WC = 0;break;case(11):WA = 1;WB = 0;WC = 0;break;case(10):WA = 0;WB = 0;WC = 0;break;case(9):WA = 0;WB = 0;WC = 0;break;case(8):WA = 0;WB = 0;WC = 0;break;case(7):WA = 0;WB = 0;WC = 0;break;case(6):WA = 1;WB = 0;WC = 0;break;case(5):WA = 0;WB = 1;WC = 0;break;case(4):WA = 1;WB = 1;WC = 0;break;case(3):WA = 0;WB = 0;WC = 1;break;case(2):WA = 1;WB = 0;WC = 1;break;case(1):WA = 0;WB = 1;WC = 1;break;case(0):WA = 1;WB = 1;WC = 1;break;}P0 = DMZ[i];delay(25);}break;case(2):                                 for(i=0;i<20;i++){switch(i){        case(0):WA = 1;WB = 1;WC = 1;break;case(1):WA = 1;WB = 1;WC = 1;break;case(2):WA = 1;WB = 1;WC = 1;break;case(3):WA = 0;WB = 1;WC = 1;break;case(4):WA = 1;WB = 0;WC = 1;break;case(5):WA = 0;WB = 0;WC = 1;break;case(6):WA = 1;WB = 1;WC = 0;break;case(7):WA = 0;WB = 1;WC = 0;break;case(8):WA = 1;WB = 0;WC = 0;break;case(9):WA = 0;WB = 0;WC = 0;break;case(10):WA = 0;WB = 0;WC = 0;break;case(11):WA = 0;WB = 0;WC = 0;break;case(12):WA = 0;WB = 0;WC = 0;break;case(13):WA = 1;WB = 0;WC = 0;break;case(14):WA = 0;WB = 1;WC = 0;break;case(15):WA = 1;WB = 1;WC = 0;break;case(16):WA = 0;WB = 0;WC = 1;break;case(17):WA = 1;WB = 0;WC = 1;break;case(18):WA = 0;WB = 1;WC = 1;break;case(19):WA = 1;WB = 1;WC = 1;break;}P0 = DMF[i];delay(25);}break;
}
}
/*全速正转*/
void forward()
{
in1=1;                         //l298n手册,真值
in2=0;
in3=1;
in4=0;
PWMA = 20;
PWMB = 20;
}
/*全速反转*/
void fallback()
{
in1=0;
in2=1;
in3=0;
in4=1;
PWMA = 20;
PWMB = 20;
}
/*50占空比正转*/
void quick()
{
in1=1;
in2=0;
PWMA = 10;
in3=1;
in4=0;
PWMB = 10;
}
/*50占空比反转*/
void slow()
{
in1=0;
in2=1;
PWMA = 10;
in3=0;
in4=1;
PWMB = 10;
}
/*停*/
void stop()
{
in1=0;
in2=0;
in3=0;
in4=0;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=115;y>0;y--);
}
void SendOneByte(uchar *str)   //串口发送数据
{while(*str !='\0'){SBUF=*str;while(!TI);TI=0;str++;}
}
void main()                           //定义主函数,返回值为空
{
//串口定时器 定时器T0
TMOD = 0x21;                   //T0定时器为工作方式一,T1定时器为工作方式二
PCON = 0x00;                   //串口初始化相关,波特率
SCON = 0x50;                   //串口初始化相关,串口工作方式一,允许接收
TH1  = 0xFD;                   //设置初值
TL1  = 0xFD;                   //设置初值
TR1  = 1;                      //开启定时器T1TH0 = 0xF4;                    //设置初值
TL0 = 0x48;                    //设置初值
TR0 = 1;                       //开启定时器T0
ES  = 1;                       //开放串口中断
PT0 = 1;                       //定时器0中断优先
ET0 = 1;                       //开放定时器T0中断
EA  = 1;                       //开放总中断
SendOneByte("Receiving from 8051...\r\n");      //发送字符串,结尾回车换行
while(1){showDigital();SendOneByte("\r\n");delay(500);SendOneByte(SendBuf);}
}
void time0_int() interrupt 1
{
TR0 = 0;
TH0 = (65536-500)/256;
TL0 = (65536-500)%256;
MA++;
if(MA < PWMA)
{
ena = 1;                                 //使用ena来产生pwm波控制A端电机
}
elseena = 0;
if(MA == 40)
{   MA = 0;
}  MB++;
if(MB < PWMB)
{
enb = 1;                             //使用enb来产生pwm波控制B端电机
}
elseenb = 0;
if(MB == 40)
{   MB = 0;
}
TR0 = 1;
}
void UARTInterrupt(void) interrupt 4
{
if(RI)
{
RI = 0;
cmd = SBUF;
switch(cmd)
{
case 1:
forward();
break;
case 2:
fallback();
break;
case 3:
quick();
break;
case 4:
slow();
break;
case 0:
stop();
default:
break;
}
}
}

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

  1. 普中51—单核—A2学习第一天

    普中51-单核-A2学习第一天 于2020年2月12日星期三17:16记,学习第一天的起因是学校即将开始网课,我和舍友也参加了全国大学生电子科技竞赛.学长给我们安排了任务学习模电和单片机,因为刚开始放 ...

  2. 打地鼠java代码流程图_51单片机 普中51 打地鼠游戏 仿真 程序 流程图

    51单片机 普中51 打地鼠游戏 仿真 程序 流程图 51单片机 普中51 打地鼠游戏 仿真 程序 流程图 普中51-单核-A3&A4开发板原理图 用到数码管.LED.矩阵按键 描述: (1) ...

  3. 普中51单片机-步进电机启停、变速控制级速度显示

    实验工具: ①普中51单片机-单核-A3,某宝买的:②28BYJ-48型号步进电机:③液晶数码管. 实现功能 实验一: ①按下独立按键K1,步进电机启动: ②按下K2,实现变速(由Delay(50)变 ...

  4. 普中51单片机学习日记-点亮LED

    普中51单片机中LED小灯所用端口为P2端口,从P2^0到P2^7分别为从左到右八个小灯. 可以使用sbit关键字定义变量led,以此简化端口的输入,并且使程序的可读性增强. 当变量的值设置为0,即端 ...

  5. 基于普中51单片机开发板的温控风扇

    自学单片机也不算很久,刚好遇上了这一门的课程设计,查找了好多的资料发现都不算合适,合适的又要收费,那么最后呢才找到了一个有关我使用的开发板的温控风扇程序,也就是普中单片机开发板,该程序来自--黑51论 ...

  6. 工业顺序控制--基于普中51单片机模拟

    1.实验目的 掌握工业顺序控制的硬件设计.软件设计.软件编程和调试. 2.实验内容 利用单片机实验箱实现注塑机的顺序控制. 3.实验要求 单片机P1口控制注塑机的6道工序,利用6只发光管的亮与否来模拟 ...

  7. 普中51仿真器怎么下载操作

    普中51仿真器下载操作说明 大家好,我是爱吃饼干的小白鼠 首先安装普中51仿真器的驱动:(安装时,用管理员身份运行,最好要把 360 等杀毒软件先关掉 成功后再打开) 如果使用的是A2/A3/A4开发 ...

  8. 普中51秒表简单易懂

    用简单函数实现普中51单片机秒表 该秒表使用最简单的while.for.switch.if等函数的简单组合和38译码器来实现秒表的计时.暂停.存读数据功能(即回看).该秒表精确到毫秒级,最高纪录时间1 ...

  9. 普中51仿真器提示错误(连接异常,进入参数设置,检测下设备连接))

    普中51仿真器提示错误(连接异常,进入参数设置,检测下设备连接) 这里提供我遇到普中51仿真器提示错误(连接异常,进入参数设置,检测下设备连接)问题解决法子,如果你也有这个问题,也可以试下. 这里提供 ...

最新文章

  1. Redis的各项功能解决了哪些问题?
  2. 为什么将这两次相减(在1927年)会得出奇怪的结果?
  3. POJ 3253 -- Fence Repair
  4. .NET Core:新的快速开发平台
  5. linux系统远程桌面登录日志,xrpd实现远程桌面Linux系统
  6. 5.2.3 std::atomic的相关操作
  7. Linux find xargs rm .orig
  8. pdf转word工具大全
  9. NK细胞培养方法与优化解决方案
  10. lldb连接debugserver报错failed to get reply to handshake packet
  11. NetLogo的下载安装过程
  12. 《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 9 章 答案
  13. 丁晓钟怎么样_丁晓钟老师的课程怎么样?
  14. ubuntu插入U盘,无法识别
  15. 可能是最优雅的分割线实现方式CSS实现
  16. 【论文笔记】ASYMMETRIC SELF-PLAY FOR AUTOMATIC GOAL DISCOVERY IN ROBOTIC MANIPULATION
  17. 物联网平台 ThingsBoard 3.3 发布
  18. github配置ssh key密钥的方法
  19. Javascript 经纬度正则表达式
  20. web前端从零开始学习(html5) 三

热门文章

  1. Dynamics CRM 解决方案操作
  2. 拼图游戏-恶搞整蛊表白软件
  3. glade java_Say Hello to Glade
  4. ubuntu 15fa网卡驱动安装
  5. Springboot 项目导出word文档(文档内容包括数据以及服务器图片)
  6. SAP ABAP QA11屏幕增强 BADI QEVA_SUBSCREEN_1101
  7. 以太坊智能合约编写Solidty基础(一)(懵逼的几个关键字)
  8. 【go实战系列五】 go1.19.2与pkg中error如何wrap与unwrap Errors | 将error进行wrap向上处理思想 | pkg/errors
  9. 央行数字货币(CBDC)能否终结美元货币体系?
  10. jQuery转换JS原生代码