完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
#include ***it led1=P2^0; //指示灯0 ***it led2=P2^1; //指示灯1 ***it led3=P2^2; //指示灯2 ***it beep=P1^2; //蜂鸣器 ***it PWM_OUT = P2^ 5; //PWM输出接口(p2.5连接舵机的信号线) bit OUT; //高低电平切换标志位 void init(); //串口初始化 void send(unsigned char a); //单字节发送函数 void ctrl(); //接收处理函数 unsigned char tmp; unsigned int c=0; unsigned int d=0; unsigned char SG1; //舵机角度设置 /********************************************************************************************* 函数名:定时/计数器0中断处理函数 调 用:[T/C0溢出后中断处理] 参 数:无 返回值:无 结 果:重新写入16位计数寄存器初始值,处理用户程序 备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致 /**********************************************************************************************/ void T_C0 (void) interrupt 1 //定时器0中断子程序 { unsigned int b; d++; if(d==200) { d=0; TH0 = 0xFF; TL0 = 0xF5; //为下次中断赋初值 TR0 = 0; //T/C0启动开关 } if(OUT==0) //判断高低脉冲标志// { b= 0x0A*SG1+0x01F3;//0x0A是1度的时间长,0x01F3是0.5mS时间长。 b= 0xFFFF - b;//算出定时开始值 TH0 = b/0xFF; //16位计数寄存器T0高8位 TL0 = b%0xFF; //16位计数寄存器T0低8位 OUT = 1;//标志切换 PWM_OUT=1;//PWM输出高电平 } else { b= 0x4E1F - (0x0A*SG1+0x01F3);//0x4E1F是20mS的时间长 b= 0xFFFF - b;//算出定时开始值 TH0 = b/0xFF; TL0 = b%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位自动重载模式, 用于产生波特率 PCON &= 0x7f; // 波特率不倍增 TH0 = 0xFF; //16位计数寄存器T0高8位 TL0 = 0xF5; //16位计数寄存器T0低8位 TH1=TL1=0xFD; // 波特率9600 (本次测试采用晶振为11.0592) PS=1; TR1 = 1; //定时器1开始工作,产生波特率 ti=0;//发送标志位置0 RI=0; //接收标志位置0 //EA=0; ET0 = 1; //T/C0中断开关 ES=1; EA = 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;//角度为130度 TR0 = 1; //T/C0启动开关(定时器) delay(5); break; case '2': //收到字符2,指示灯1灭 led2=1; send(tmp); beep=1; SG1=90;//角度为90 TR0 = 1; //T/C0启动开关 delay(5); break; default: //其他,灯全灭 led1=1; led2=1; led3=1; send(tmp); beep=1; delay(5); } } |
|
相关推荐
2个回答
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【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:38 , Processed in 0.806516 second(s), Total 77, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号