/***触摸屏下位机测试直流电机正反转past***/
/***IAP15W413板2020 12 18*L211 CODE1666**/
#include <REG52.H>
#include <intrins.h>
#include <string.h>
#include "stdio.h"
#include <stdlib.h>
#define uint unsigned int
#define uchar unsigned char
sbit INTPUT1=P3^3;
sbit INTPUT2=P3^2;
sbit OUT1=P3^4; //四个备用输出
sbit OUT2=P3^5; //四个备用输出
sbit OUT3=P3^6; //四个备用输出
sbit OUT4=P3^7; //四个备用输出
sbit P_WM1=P1^5; //
sbit EN=P1^4; //
sbit P_WM2=P1^3; //
uint SPEED; //速度
uint ZERO=0; //
uint Ad_data;
uchar i; //循环总变量i
bit Receive_Flag;
bit Run_Flag;
bit MOTORRUN;
uchar kcounter,kstatus; //按键计数标志 按键状态标志
uint a[10]; //定义数组a 存储串口数据串
/*---------------延时子程序----------------*/
void delay (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<2;j++)
OUT1=~OUT1;
;
}
/*************关所有输出*******************************/
void reset_io()
{
P_WM1=1;
P_WM2=1;
EN=1;
OUT1=1; //电机A运行指示关
OUT2=1; //电机B运行指示关
OUT3=1; //电机C运行指示关
OUT4=1; //电机D运行指示关
}
/****************按键计数器状态寄存器归零*************/
void RstKey()
{
kcounter=0; //按键计数器归零
kstatus=0; //状态寄存器归零
}
/*****************按键低电平检测函数*****************/
void LowVoltKey(void) //按键计数器状态标志加一
{
kcounter++;
kstatus++;
delay(5); //延时
}
/*****************按键高电平检测函数*****************/
void HighVoltKey(void) //按键计数器加一 状态标志归零
{
kcounter++; //按键计数器加一
kstatus=0; //按键状态标志归零
delay(5); //延时
}
/*****************/
void MOTFORWARD()
{
EN=0;
MOTORRUN=1;
printf("n0.val=%d\xff\xff\xff",SPEED); //电机速度
while(MOTORRUN) //电机循环标志,串口停机中断
{
P_WM1=0;
delay(SPEED);
P_WM1=1;
delay(100-SPEED);
}
EN=1;
printf("n0.val=%d\xff\xff\xff",ZERO); //电机速度
}
/*****************/
void MOTBACK()
{
EN=0;
MOTORRUN=1;
printf("n0.val=%d\xff\xff\xff",SPEED); //电机速度
while(MOTORRUN) //电机循环标志,串口停机中断
{
P_WM2=0;
delay(SPEED);
P_WM2=1;
delay(100-SPEED);
}
EN=1;
printf("n0.val=%d\xff\xff\xff",ZERO); //电机速度
}
/*------------初始化串口---------------------*/
void InitUart()
{
SCON=0X50; //8位数据,可变波特率
AUXR|=0x01; //串口1选择定时器2为波特率发生器
AUXR|=0X04; //定时器2时钟为Fosc,即1T
T2L=0XE0; //设置定时器处置 110592》9600
T2H=0XFE; //设置定时器处置 110592》9600
AUXR|=0X10; //启动定时器2
TI=1;
ES=1; //
EA=1;
}
/*×--------UART 中断服务程序-------------------**/
/**×**把接收到的数据存进数组a[i]**i开机初始化****/
/***×*接收到触摸屏结束码Receive_Flag标志位置1****/
/****×主程序检测到标志码=1判断指令功能***********/
void Uart() interrupt 4 using 1
{
if(RI)
{
if(SBUF==0XFA) //触摸屏结束码
{
Receive_Flag=1; //接收数据标志置一
RI=0; //
i=0; //数组计数器归零
}
else
{
a[i]=SBUF; //数组下标位置的数据等于SBUF
RI=0; //
i++;
}
}
if(Receive_Flag==1) //设备停止 退出循环
{
if(a[0]==0XE0) //
{
if(a[1]==0X04) //关电机输出
{
MOTORRUN=0; //电机输出
Receive_Flag=1; //接收数据标志置一
i=0; //串口计数器归零
}
}
}
}
/*************************************************/
void main( ) /*主程序开始*/
{
reset_io();
AUXR=0X80; //STC系列的1T 设置
TMOD=0X01;
P_SW1=0x00; //RXD/P3.0, TXD/P3.1
Receive_Flag=0;
InitUart(); //初始化串口
delay(1000);
printf("0XFF,0XFF,0XFF");
i=0; //数据接收计数器等于0
Run_Flag=0;
MOTORRUN=0;
while(1) //INTPUT1
{
/***************开机键检测*************/
RstKey(); //按键复位
if(!INTPUT1) //功能键
{
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT1) //按键低电平
{
LowVoltKey();
}
else if(~!INTPUT1) //按键高电平
{
HighVoltKey();
}
}
if(kstatus>=4) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
OUT3=~OUT3;
}
}
if(Receive_Flag==1)
{
Receive_Flag=0; //重新接收
i=0; //串口计数器等于0
if(a[0]==0XE0) //写时间代码
{
if(a[1]==0X00) //
{
OUT1=0;
OUT2=1;
MOTFORWARD(); //前进
}
else if(a[1]==0X02)
{
OUT1=1;
OUT2=0;
MOTBACK(); //后退
}
}
if(a[0]==0XE1) //速度
{
SPEED=a[3]*256+a[2]; //
}
}
}
} //L211 CODE 1666 2020 12 18
/***2024 测试直流电机正反转past***/
/***2024 11 21板2024 12 14 *L1287CODE5861**/
#include <REG52.H>
#include <intrins.h>
#include <string.h>
#include "stdio.h"
#include <stdlib.h>
#define uint unsigned int
#define uchar unsigned char
sbit OLED_SCL=P1^1; //
sbit OLED_SDA=P1^0; //
sbit INTPUT1=P1^2; //电机A左行
sbit INTPUT2=P1^3; //电机A右行
sbit INTPUT3=P1^4; //电机B左行
sbit INTPUT4=P1^5; //电机B右行
sbit D1_ADD=P5^4; //
sbit D1_DEC=P1^6; //
sbit D2_ADD=P5^5; //
sbit D2_DEC=P1^7; //
sbit L1_PWM=P3^5; //
sbit L1_EN=P3^4; // 高电平使能 低电平关闭
sbit R1_PWM=P3^6; //
sbit R1_EN=P3^7; //
sbit L2_PWM=P3^2; //
sbit L2_EN=P3^0; //
sbit R2_PWM=P3^1; //
sbit R2_EN=P3^3; //
bit MOTORARUN_L; //电机A左行启动标志 0关闭 1启动
bit MOTORARUN_R; //电机A右行启动标志 0关闭 1启动
bit MOTORBRUN_L; //电机B左行启动标志 0关闭 1启动
bit MOTORBRUN_R; //电机B右行启动标志 0关闭 1启动
uchar count = 0;
uchar aa;
uchar kcounter,kstatus; //按键计数标志 按键状态标志
uchar time1,time2; //电机占空比
uchar timeA,timeB; //
#define high 1
#define low 0
#define uint unsigned int //
#define uchar unsigned char //
#define CMD_IDLE 0 //空闲模式
#define CMD_READ 1 //IAP字节读命令
#define CMD_PROGRAM 2 //IAP字节编程命令
#define CMD_ERASE 3 //IAP扇区擦除命令
#define ENABLE_IAP 0x82 //if SYSCLK<20MHz
#define IAP_ADDRESS 0x0000 //时间 EEPROM首地址
#define IAP_ADDRESS1 0x0200 //时间 EEPROM首地址
typedef unsigned char BYTE; //Catch_Up接上Catch_Dwon接下
typedef unsigned int WORD;
uchar code show1[]=
{
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",0*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"1",1*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",2*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*"3",3*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*"4",4*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*"5",5*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"6",6*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*"7",7*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",8*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*"9",9*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x1F,0x01,0x01,0x01,0x01,0x1F,0x00,/*"A",10*/
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,/*"D",11*/
0x08,0xF8,0x00,0xF8,0x00,0xF8,0x08,0x00,0x00,0x03,0x3E,0x01,0x3E,0x03,0x00,0x00,/*"W",12*/
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,/*"O",13*/
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,/*"N",14*/
};
uchar code show2[]=
{
0x08,0x08,0x08,0x08,0x88,0