完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
#define uint unsigned int #define uchar unsigned char ***it left_Q_int=P0^0; //左前轮电机int口 ***it left_Q_out=P0^1; //左前轮电机out口 ***it left_H_int=P0^2; ***it left_H_out=P0^3; ***it right_Q_int=P0^4; ***it right_Q_out=P0^5; ***it right_H_int=P0^6; ***it 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 //////////******************************************////////////////////// 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 //////////******************************************////////////////////// 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 //////////******************************************////////////////////// 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 //////////******************************************////////////////////// 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 //////////******************************************////////////////////// 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; //////////****************************************//////////////////////// } } |
|
相关推荐
2个回答
|
|
嗯嗯,也遇到过这样的问题
|
|
|
|
顶一下
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
464 浏览 0 评论
478 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
439 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
994 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1056 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11788 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 16:12 , Processed in 0.651567 second(s), Total 73, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号