完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 l764583152 于 2014-9-4 20:17 编辑
#include #include #define uint unsigned int #define uchar unsigned char //宏定义 ***it PWM = P2^7; //用来声明P2.7口为程序所要控制的端口,"***it"是KEIL专门用来声明某位IO口 ***it ir=P3^3; //红外数据接收 uchar irtime; //红外时间 uchar startflag; //开始接收标志位 uchar irdata[33]; //接收的数据 包括引导码一共33位 uchar bitnum; //第几位数据 uchar irreceok; //接收完毕标志位 uchar ircode[4]; //数据存放 uchar irprosok; //解码完毕标志位 uchar PWM_ON ; //定义低电平时间 uchar CYCLE; uchar vvalue; void Delay(uint del) { uint i,j; for(i=0; i ; } void Delay_1ms(uint i) //定时子程序 定时1毫秒 { uchar x,j; for(j=0;j for(x=0;x<=148;x++) ; } void time0init0 (void) //定时器0初始化 { TMOD=0X02; //工作方式定义 8位重装定时器 TH0=0X00; //高8位预装 TL0=0X00; //低8位预装 //IE=0X82 //开启总中断及定时器0中断 ET0=1; //开定时器0中断 EA=1; //开总中断 TR0=1; //启动定时器 } void Time1(void) { TMOD=0x10; //定时器设置 1ms in 12M crystal TH0=(65536-1000)/256; TL0=(65536-1000)%256; //定时1mS IE=0x88; //打开中断 TR1=1; //定时器打开 } void int1init(void) { IT1=1; //定义外部中断1为下降沿触发 EX1=1; //开外部中断1 EA=1; //开总中断 //IE=0X84; //开总中断及外部中断1 } void display(void) { if(vvalue==0x45)PWM_ON=0; else if(vvalue==0x46)PWM_ON=2; else if(vvalue==0x47)PWM_ON=4; else if(vvalue==0x44)PWM_ON=6; else if(vvalue==0x40)PWM_ON=10; else PWM_ON=10; } void irpros(void) //数据解码 { uchar k,i,j; uchar value; k=17; for(i=0;i<8;i++) { value=value>>1; if(irdata[k]>6) { value=value | 0x80; // 置1 } k++; } vvalue=value; irprosok=1; //解码完毕 } void main() { time0init0(); int1init(); Time1(); PWM = 1; while(1) { if(irreceok) { irpros(); irreceok=0; } if(irprosok) { irprosok=0; } display(); } } void time0init () interrupt 1 //定时器0服务子程序 { irtime++; //最大加到255 } void int1 () interrupt 2 //外部中断1服务子程序 { if(startflag) { if(irtime>47) //检测引导码 { bitnum=0; } irdata[bitnum]=irtime; //装入引导码 irtime=0; //定时器清0 bitnum++; if(bitnum==33) //数据接收完毕 { bitnum=0; irreceok=1; } } else { startflag=1; //第一次进入中断后,因为定时器定时的irtime不为0,此时需要清0,标志位startflag定义后没初始化系统默认为0,那么if语句通不过,立即跳到else随即irtime清0,startflag置1. irtime=0; } } void tim(void) interrupt 1 using 1 { static unsigned char count; TH0=(65536-1000)/256; TL0=(65536-1000)%256;//定时1mS if(count==PWM_ON) { PWM = 0; //直流电机转 } count++; if(count == CYCLE) { count=0; if(PWM_ON!=0) //如果左右时间是0 保持原来状态 { PWM = 1; //直流电机不转 } } } |
|
相关推荐
5个回答
|
|
按遥控板 相关按键 电机运行不对 有时根本不动
|
|
|
|
unsigned char IrValue[4];
unsigned char dat; void main() { IT1=1; EX1=1; EA=1; while(1) { 把dat用数码管显出来,看遥控的值! } } void Delay140us() //@12.000MHz { unsigned char i, j; _nop_(); _nop_(); i = 2; j = 158; do { while (--j); } while (--i); } void exint1()interrupt 2 { unsigned char j,k,Time; unsigned int err; Time=0; gd=1; if(IRIN==0) //确认是否真的接收到正确的信号 { err=1000; //1000*10us=10ms,超过说明接收到错误的信号 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时 侯,程序死在这里*/ while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去 { Delay140us(); err--; } if(IRIN==1) //如果正确等到9ms低电平 { err=500; while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去 { Delay140us(); err--; } for(k=0;k<4;k++) //共有4组数据 { for(j=0;j<8;j++) //接收一组数据 { err=60; while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去 { Delay140us(); err--; } err=500; while((IRIN==1)&&(err>0)) //计算高电平的时间长度。 { Delay140us();//0.14ms Time++; err--; if(Time>30) { return; } } IrValue[k]>>=1; //k表示第几组数据 if(Time>=8) //如果高电平出现大于565us,那么是1 { IrValue[k]|=0x80; } Time=0; //用完时间要重新赋值 } } } if(IrValue[0]!=~IrValue[1]) { return; } else { dat=IrValue[2]; } } } 我一直用这个!看合不合你要求呢! |
|
|
|
版后面,我晕了
|
|
|
|
|
|
|
|
顶顶顶顶顶顶顶顶顶顶顶顶顶顶
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
298 浏览 1 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
309 浏览 0 评论
826 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1911 浏览 2 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1427 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12031 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 03:34 , Processed in 0.654453 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号