串口控制直流电机程序 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;                      //开启定时器T1


TH0 = 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端电机
}  
else
  ena = 0;  
if(MA == 40)
{   
  MA = 0;  
}  

MB++;         
if(MB < PWMB)  
{   
enb = 1;                             //使用enb来产生pwm波控制B端电机
}  
else
  enb = 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;
}
}
}
  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,以下是基于普中51-单核-A2制作一个简易计算器程序的汇编代码,附有中文解释: ``` org 0 ;指定程序起始地址为0 ;定义变量 num1: db 0 ;存储第一个数值 num2: db 0 ;存储第二个数值 op: db 0 ;存储运算符 result: db 0 ;存储计算结果 ;中断服务程序 ;这里使用外部中断0来读取按键输入 int0_handler: mov a, p1 ;读取P1口状态 anl a, #0Fh ;屏蔽高4位 mov num1, a ;存储数值到num1变量中 reti ;返回中断 main: ;初始化串口 mov scon, #50h ;设定波特率为9600 setb ti ;启动串口发送 ;等待用户输入第一个数值 mov a, #"1" ;默认为1 mov num1, a mov a, #"0" mov num2, a mov a, #"+" ;默认为加法运算符 mov op, a ;循环读取用户输入 loop: ;显示当前输入状态 mov a, num1 mov sbuf, a clr a mov sbuf, a mov a, op mov sbuf, a clr a mov sbuf, a mov a, num2 mov sbuf, a clr a mov sbuf, a ;等待按键输入 setb it0 ;开启外部中断0 acall delay ;等待一段时间,防止重复输入 clr it0 ;关闭外部中断0 ;判断按键输入 mov a, num1 cjne a, #"1", check_num2 ;如果num1不为1,则跳过读取num2 mov a, num2 cjne a, #"0", check_op ;如果num2不为0,则跳过读取op mov a, p1 ;读取P1口状态 anl a, #0Fh ;屏蔽高4位 mov num1, a ;存储数值到num1变量中 sjmp loop ;返回循环 check_num2: mov a, p1 ;读取P1口状态 anl a, #0Fh ;屏蔽高4位 mov num2, a ;存储数值到num2变量中 sjmp loop ;返回循环 check_op: mov a, p1 ;读取P1口状态 anl a, #0Fh ;屏蔽高4位 mov op, a ;存储运算符到op变量中 sjmp loop ;返回循环 ;计算结果 mov a, num1 subb a, #"0" ;将ASCII码转换为数值 mov b, a mov a, num2 subb a, #"0" ;将ASCII码转换为数值 mov c, a mov a, op cmp a, #"+" jnz minus add b, c ;执行加法运算 sjmp display minus: cmp a, #"-" jnz multiply subb b, c ;执行减法运算 sjmp display multiply: cmp a, #"*" jnz divide mov dpl, b mov dph, #0 mov b, c mul ab ;执行乘法运算 sjmp display divide: cmp a, #"/" jnz error mov dpl, b mov dph, #0 mov b, c div ab ;执行除法运算 sjmp display error: mov a, #"E" ;运算符错误 mov sbuf, a mov a, #"r" mov sbuf, a mov a, #"r" mov sbuf, a sjmp loop ;显示结果 display: mov a, b ;将计算结果存储到result变量中 add a, #"0" ;将数值转换为ASCII码 mov result, a ;发送计算结果到串口 mov a, result mov sbuf, a clr a mov sbuf, a sjmp loop ;返回循环 ;延时函数 delay: mov r6, #20h delay1: mov r7, #255 delay2: djnz r7, delay2 djnz r6, delay1 ret end ``` 这个代码实现了一个简单的计算器程序,可以通过按键输入数值和运算符,然后计算并显示结果。程序通过外部中断0来读取按键输入,然后根据输入的数值和运算符执行相应的运算,并将结果显示在屏幕上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值