串口控制直流电机程序 80C51单片机 L298N 普中51-单核-A4
通过串口给单片机发送指令控制电机不同的转动状态,此程序是配合普中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相关推荐
- 普中51—单核—A2学习第一天
普中51-单核-A2学习第一天 于2020年2月12日星期三17:16记,学习第一天的起因是学校即将开始网课,我和舍友也参加了全国大学生电子科技竞赛.学长给我们安排了任务学习模电和单片机,因为刚开始放 ...
- 打地鼠java代码流程图_51单片机 普中51 打地鼠游戏 仿真 程序 流程图
51单片机 普中51 打地鼠游戏 仿真 程序 流程图 51单片机 普中51 打地鼠游戏 仿真 程序 流程图 普中51-单核-A3&A4开发板原理图 用到数码管.LED.矩阵按键 描述: (1) ...
- 普中51单片机-步进电机启停、变速控制级速度显示
实验工具: ①普中51单片机-单核-A3,某宝买的:②28BYJ-48型号步进电机:③液晶数码管. 实现功能 实验一: ①按下独立按键K1,步进电机启动: ②按下K2,实现变速(由Delay(50)变 ...
- 普中51单片机学习日记-点亮LED
普中51单片机中LED小灯所用端口为P2端口,从P2^0到P2^7分别为从左到右八个小灯. 可以使用sbit关键字定义变量led,以此简化端口的输入,并且使程序的可读性增强. 当变量的值设置为0,即端 ...
- 基于普中51单片机开发板的温控风扇
自学单片机也不算很久,刚好遇上了这一门的课程设计,查找了好多的资料发现都不算合适,合适的又要收费,那么最后呢才找到了一个有关我使用的开发板的温控风扇程序,也就是普中单片机开发板,该程序来自--黑51论 ...
- 工业顺序控制--基于普中51单片机模拟
1.实验目的 掌握工业顺序控制的硬件设计.软件设计.软件编程和调试. 2.实验内容 利用单片机实验箱实现注塑机的顺序控制. 3.实验要求 单片机P1口控制注塑机的6道工序,利用6只发光管的亮与否来模拟 ...
- 普中51仿真器怎么下载操作
普中51仿真器下载操作说明 大家好,我是爱吃饼干的小白鼠 首先安装普中51仿真器的驱动:(安装时,用管理员身份运行,最好要把 360 等杀毒软件先关掉 成功后再打开) 如果使用的是A2/A3/A4开发 ...
- 普中51秒表简单易懂
用简单函数实现普中51单片机秒表 该秒表使用最简单的while.for.switch.if等函数的简单组合和38译码器来实现秒表的计时.暂停.存读数据功能(即回看).该秒表精确到毫秒级,最高纪录时间1 ...
- 普中51仿真器提示错误(连接异常,进入参数设置,检测下设备连接))
普中51仿真器提示错误(连接异常,进入参数设置,检测下设备连接) 这里提供我遇到普中51仿真器提示错误(连接异常,进入参数设置,检测下设备连接)问题解决法子,如果你也有这个问题,也可以试下. 这里提供 ...
最新文章
- Redis的各项功能解决了哪些问题?
- 为什么将这两次相减(在1927年)会得出奇怪的结果?
- POJ 3253 -- Fence Repair
- .NET Core:新的快速开发平台
- linux系统远程桌面登录日志,xrpd实现远程桌面Linux系统
- 5.2.3 std::atomic的相关操作
- Linux find xargs rm .orig
- pdf转word工具大全
- NK细胞培养方法与优化解决方案
- lldb连接debugserver报错failed to get reply to handshake packet
- NetLogo的下载安装过程
- 《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 9 章 答案
- 丁晓钟怎么样_丁晓钟老师的课程怎么样?
- ubuntu插入U盘,无法识别
- 可能是最优雅的分割线实现方式CSS实现
- 【论文笔记】ASYMMETRIC SELF-PLAY FOR AUTOMATIC GOAL DISCOVERY IN ROBOTIC MANIPULATION
- 物联网平台 ThingsBoard 3.3 发布
- github配置ssh key密钥的方法
- Javascript 经纬度正则表达式
- web前端从零开始学习(html5) 三
热门文章
- Dynamics CRM 解决方案操作
- 拼图游戏-恶搞整蛊表白软件
- glade java_Say Hello to Glade
- ubuntu 15fa网卡驱动安装
- Springboot 项目导出word文档(文档内容包括数据以及服务器图片)
- SAP ABAP QA11屏幕增强 BADI QEVA_SUBSCREEN_1101
- 以太坊智能合约编写Solidty基础(一)(懵逼的几个关键字)
- 【go实战系列五】 go1.19.2与pkg中error如何wrap与unwrap Errors | 将error进行wrap向上处理思想 | pkg/errors
- 央行数字货币(CBDC)能否终结美元货币体系?
- jQuery转换JS原生代码