#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit left_Q_int=P0^0; //左前轮电机int口
sbit left_Q_out=P0^1; //左前轮电机out口
sbit left_H_int=P0^2;
sbit left_H_out=P0^3;
sbit right_Q_int=P0^4;
sbit right_Q_out=P0^5;
sbit right_H_int=P0^6;
sbit right_H_out=P0^7;
uint Received_data=0; //接收数据
unsigned char
time=0; //控制定时器频率的全局变量,并赋初值
unsigned char duty=0; //定义占空比
/*****************************
函数声明
*****************************/
void Init_serial(); //串口中断 寄存器准备
void Process_data(); //数据处理函数
void go(unsigned char per);
void stop(unsigned char per);
void left(unsigned char per);
void right(unsigned char per);
void back(unsigned char per);
void init(void);
void delay(uint i);
/**************************************
主函数
***************************************/
void main()
{
init();
Init_serial(); //串口中断 寄存器准备
while (1)
{
Process_data(); //数据处理
}
}
/****************************************************************
函数名: 数据处理函数
功能: 判断接收到的字符, 并作出对应的处理
*****************************************************************/
void Process_data()
{
switch(Received_data)
{
case 0:stop(0);break;
case 'a':go(10);break;
case 'b':left(20);break;
case 'c':right(20);break;
case 'd':back(20);break;
default:stop(0);break;
}
}
/*****************************************************************
函数名:串口通讯初始化
功能: 设置串口通讯相关的寄存器
******************************************************************/
void Init_serial()
{
EA = 1; //开总中断
PS=1;
ES = 1; //开串口中断
SCON = 0x40; //串口
通信方式1
REN = 1; //允许接受位
TMOD |= 0x20; //定时器1用于产生波特率,八位自动重装模式, 用与运算, 不至于干扰定时器0的设置
TH1 = TL1 = 0xfd; //9600波特率初值
TR1 = 1; //注意千万不要使用定时器1, 不然会与串口冲突
}
/*****************************************************************
函数名:串口中断执行函数
功能:接收主控机发的字符并储存
******************************************************************/
void Serial() interrupt 4
{
if (RI) RI = 0; //中断标志位清零
Received_data = SBUF; //保存接收的字符
}
/******************************************************************************
初始化
******************************************************************************/
void init(void)
{
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TMOD=0x01; //TMOD=0001 000B,使用定时器T0的模式1
TH0=(65536-30)/256; //定时器T0的高8位赋初值
TL0=(65536-30)%256; //定时器T0高8位赋初值
TR0=1;
}
/**************************************************************
函数功能:定时器T1的中断服务程序
**************************************************************/
void Time1(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{
TR0=0; //再赋初值时,关闭定时器
TH0=(65536-30)/256; //定时器T0的高8位重新赋初值
TL0=(65536-30)%256; //定时器T0的高8位重新赋初值
TR0=1; //打开定时器,开始计时
time++;
if(time>=100) time=0;//电机最佳的工作频率为1000HZ
}
/**************************************************************************************
* 函 数 名 : PWM
* 函数功能 : 通过调节函数参数duty1来为PWM1、PWM2输出(per%)的稳定信号
* 输 入 : duty
* 输 出 : 无
**************************************************************************************/
void go(unsigned char per)
{
duty=per; //启动定时器T1
if(time<duty) //duty位占空,在0~100的范围内,在0~duty的范围执行信号
{
//////////******************************************//////////////////////
left_Q_int=1; //这里是有效信号,将执行有效信号时动作信号放到这里
left_Q_out=0; // 本程序例子是控制左前轮电机正转
left_H_int=1;
left_H_out=0;
right_Q_int=1;
right_Q_out=0;
right_H_int=1;
right_H_out=0;
//////////****************************************////////////////////////
}
else //在0~100范围内,在duty~100的范围里,执行占空(电机如果正负极信号均为1时,电机停止)
{
//////////****************************************////////////////////////
left_Q_int=1; //这里是占空时间,将停止动作放到这里
left_Q_out=1; // 本例子例子在此处控制左前轮电机停止
left_H_int=1;
left_H_out=1;
right_Q_int=1;
right_Q_out=1;
right_H_int=1;
right_H_out=1;
//////////****************************************////////////////////////
}
}
void stop(unsigned char per)
{
duty=per; //启动定时器T1
if(time<duty) //duty位占空,在0~100的范围内,在0~duty的范围执行信号
{
//////////******************************************//////////////////////
left_Q_int=1; //这里是有效信号,将执行有效信号时动作信号放到这里
left_Q_out=1; // 本程序例子是控制左前轮电机正转
left_H_int=1;
left_H_out=1;
right_Q_int=1;
right_Q_out=1;
right_H_int=1;
right_H_out=1;
//////////****************************************////////////////////////
}
else //在0~100范围内,在duty~100的范围里,执行占空(电机如果正负极信号均为1时,电机停止)
{
//////////****************************************////////////////////////
left_Q_int=1; //这里是占空时间,将停止动作放到这里
left_Q_out=1; // 本例子例子在此处控制左前轮电机停止
left_H_int=1;
left_H_out=1;
right_Q_int=1;
right_Q_out=1;
right_H_int=1;
right_H_out=1;
//////////****************************************////////////////////////
}
}
void left(unsigned char per)
{
duty=per; //启动定时器T1
if(time<duty) //duty位占空,在0~100的范围内,在0~duty的范围执行信号
{
//////////******************************************//////////////////////
left_Q_int=1; //这里是有效信号,将执行有效信号时动作信号放到这里
left_Q_out=0; // 本程序例子是控制左前轮电机正转
left_H_int=1;
left_H_out=0;
right_Q_int=0;
right_Q_out=1;
right_H_int=0;
right_H_out=1;
//////////****************************************////////////////////////
}
else //在0~100范围内,在duty~100的范围里,执行占空(电机如果正负极信号均为1时,电机停止)
{
//////////****************************************////////////////////////
left_Q_int=1; //这里是占空时间,将停止动作放到这里
left_Q_out=1; // 本例子例子在此处控制左前轮电机停止
left_H_int=1;
left_H_out=1;
right_Q_int=1;
right_Q_out=1;
right_H_int=1;
right_H_out=1;
//////////****************************************////////////////////////
}
}
void right(unsigned char per)
{
duty=per; //启动定时器T1
if(time<duty) //duty位占空,在0~100的范围内,在0~duty的范围执行信号
{
//////////******************************************//////////////////////
left_Q_int=0; //这里是有效信号,将执行有效信号时动作信号放到这里
left_Q_out=1; // 本程序例子是控制左前轮电机正转
left_H_int=0;
left_H_out=1;
right_Q_int=1;
right_Q_out=0;
right_H_int=1;
right_H_out=0;
//////////****************************************////////////////////////
}
else //在0~100范围内,在duty~100的范围里,执行占空(电机如果正负极信号均为1时,电机停止)
{
//////////****************************************////////////////////////
left_Q_int=1; //这里是占空时间,将停止动作放到这里
left_Q_out=1; // 本例子例子在此处控制左前轮电机停止
left_H_int=1;
left_H_out=1;
right_Q_int=1;
right_Q_out=1;
right_H_int=1;
right_H_out=1;
//////////****************************************////////////////////////
}
}
void back(unsigned char per)
{
duty=per; //启动定时器T1
if(time<duty) //duty位占空,在0~100的范围内,在0~duty的范围执行信号
{
//////////******************************************//////////////////////
left_Q_int=0; //这里是有效信号,将执行有效信号时动作信号放到这里
left_Q_out=1; // 本程序例子是控制左前轮电机正转
left_H_int=0;
left_H_out=1;
right_Q_int=0;
right_Q_out=1;
right_H_int=0;
right_H_out=1;
//////////****************************************////////////////////////
}
else //在0~100范围内,在duty~100的范围里,执行占空(电机如果正负极信号均为1时,电机停止)
{
//////////****************************************////////////////////////
left_Q_int=1; //这里是占空时间,将停止动作放到这里
left_Q_out=1; // 本例子例子在此处控制左前轮电机停止
left_H_int=1;
left_H_out=1;
right_Q_int=1;
right_Q_out=1;
right_H_int=1;
right_H_out=1;
//////////****************************************////////////////////////
}
}
一周热门 更多>