完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
/********************************************************************************************/
#include #include unsigned int c=0; ***it led1=P2^0; //指示灯0 ***it led2=P2^1; //指示灯1 ***it led3=P2^2; //指示灯2 ***it beep=P1^2; //蜂鸣器 void init(); //串口初始化 void send(unsigned char a); //单字节发送函数 void ctrl(); //接收处理函数 unsigned char tmp; // ***it Key = P3 ^ 4;//按键控制旋转的方向 ***it PWM_OUT = P2^ 1;//PWM输出接口(p2.1连接舵机的信号线) bit OUT;//高低电平切换标志位 unsigned char SG1;//舵机角度设置 /********************************************************************************************* 函数名:定时/计数器初始化函数 调 用:T_C_init(); 参 数:无 返回值:无 结 果:设置SFR中T/C1和(或)T/C0相关参数 备 注:本函数控制T/C1和T/C0,不需要使用的部分可用//屏蔽 /**********************************************************************************************/ void T_C_init (void){ TMOD |= 0x21; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ] EA = 1;//中断总开关 TH0 = 0xFF; //16位计数寄存器T0高8位 TL0 = 0xF5; //16位计数寄存器T0低8位 ET0 = 1; //T/C0中断开关 } /**********************************************************************************************/ /********************************************************************************************* 函数名:定时/计数器0中断处理函数 调 用:[T/C0溢出后中断处理] 参 数:无 返回值:无 结 果:重新写入16位计数寄存器初始值,处理用户程序 备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致 /**********************************************************************************************/ void T_C0 (void) interrupt 1 using 1{ //切换寄存器组到1 unsigned int a; if(OUT==0){//判断高低脉冲标志// a= 0x0A*SG1+0x01F3;//0x0A是1度的时间长,0x01F3是0.5mS时间长。 a= 0xFFFF - a;//算出定时开始值 TH0 = a/0xFF; //16位计数寄存器T0高8位 TL0 = a%0xFF; //16位计数寄存器T0低8位 OUT = 1;//标志切换 PWM_OUT=1;//PWM输出高电平 }else{ a= 0x4E1F - (0x0A*SG1+0x01F3);//0x4E1F是20mS的时间长 a= 0xFFFF - a;//算出定时开始值 TH0 = a/0xFF; TL0 = a%0xFF; OUT = 0; PWM_OUT=0;//PWM输出低电平 } } /**********************************************************************************************/ void delay(unsigned int x) { unsigned int i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void main() { T_C_init();//定时器初始化 init(); while(1) { if(RI==1) // 是否有数据到来 { RI = 0; tmp = SBUF; // 暂存接收到的数据 ctrl(); } } } void init() //串口初始化 { ES=0; //关中断 SCON = 0x50; // REN=1允许串行接受状态,串口工作模式1, //10位UART(1位起始位,8位数据位,1位停止位,无奇偶校验),波特率可变 TMOD |= 0x21; // 定时器1工作于方式2,8位自动重载模式, 用于产生波特率 TH1=TL1=0xFD; // 波特率9600 (本次测试采用晶振为11.0592) PCON &= 0x7f; // 波特率不倍增 TR1 = 1; //定时器1开始工作,产生波特率 //发送标志位置0 ti=0; //接收标志位置0 RI=0; //EA=0; ES=1; led1=0; //初始化设置3个指示灯全亮 led2=0; led3=0; } void send(unsigned char a) //单字节数据发送 { //注意:若单片机TXD(P3.1)无上拉能力,必须在P3.1端接上拉电阻。本次测试需要接上拉电阻 TI=0; SBUF=a; while(TI==0); TI=0; if(c%2) //发送指示灯标志,每接收一次,此灯亮灭交替 led3=1; else led3=0; c++; } void ctrl() //接收处理函数 { switch(tmp) { case '1': led1=1; //收到字符1,指示灯0灭 send(tmp); beep=0; SG1=130;//角度为180度 TR0 = 1; //T/C0启动开关(定时器) delay(500); break; case '2': //收到字符2,指示灯1灭 led2=1; send(tmp); beep=1; SG1=90;//角度为90度 TR0 = 1; //T/C0启动开关 delay(500); break; default: //其他,灯全灭 led1=1; led2=1; led3=1; send(tmp); beep=1; delay(500); } } |
|
相关推荐
5个回答
|
|
(⊙o⊙)?你想问什么?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
精不精确不都是可可以算的吗?
void delay(unsigned int x) { unsigned int i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } 那我问你这里的j为什么偏偏是110,而不是其他的数字,这都是有深意的。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
54 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
395 浏览 0 评论
439 浏览 0 评论
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
1265 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验
529 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11743 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 14:50 , Processed in 0.633405 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号