完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 小小怪兽 于 2015-5-13 10:27 编辑
程序能进入中断,但就是不能成功解码。求各位大神指点迷津
/*********************************************************************/ #include "config.h" #define uchar unsigned char #define uint unsigned int #define IRIN 1<<14; //定义P0.14为红外接收器数据线的连接引脚 void delay(uchar x); void delay1(int ms); uchar IRCOM[7]; unsigned char T; /******************************************************************************************************* *名称:DelayNs() *功能:长软件延时 *入口参数:dly 延时参数,值越大,延时越久 *出口参数:无 ********************************************************************************************************/ void DelayNs(uint32 dly) { uint32 i; for(;dly>0;dly--) for(i=0;i<5000;i++); } /******************************************************************************************************* *名称:PWM_Init() *功能:初始化PWM,并开启向量中断 *入口参数:freq 初始化PWM频率 Duty 占空比 *出口参数:无 ********************************************************************************************************/ void PWM_Init(uint32 freq,uint32 Duty) { PINSEL0=(PINSEL0&0xFFFCFFFF)|(0x02<<16); //将PWM4连接到P0.8脚 PINSEL0=(PINSEL0&0xFFFFFFF3)|(0x02<<2); //将PWM3连接到P0.1脚 PINSEL0=(PINSEL0&0xFFFF3FFF)|(0x02<<14); //将PWM2连接到P0.7脚 PINSEL0=(PINSEL0&0xFFFFFFFC)|(0x02<<0); //将PWM1连接到P0.0脚 /*初始化PWM4*/ PWMPCR|=(1<<12); //允许PWM4输出,单边PWM PWMPR=0x00; //不分频,计数频率为Fpclk PWMMCR=0x02; //当PWMMR0匹配时复位PWM定时器 PWMMR0=Fpclk/freq; //设置PWM频率 PWMMR4=PWMMR0*Duty/100; //设置占空比 PWMLER=0x10; //使能PWM匹配0、4锁存 PWMTCR=0x09; //PWM使能,启动PWM定时器 /*初始化PWM3*/ PWMPCR|=(1<<11); //允许PWM3输出,单边PWM PWMPR=0x00; //不分频,计数频率为Fpclk PWMMCR=0x02; //当PWMMR0匹配时复位PWM定时器 PWMMR0=Fpclk/freq; //设置PWM频率 PWMMR3=PWMMR0*Duty/100; //设置占空比 PWMLER=0x08; //使能PWM匹配0、3锁存 PWMTCR=0x09; //PWM使能,启动PWM定时器 /*初始化PWM2*/ PWMPCR|=(1<<10); //允许PWM2输出,单边PWM PWMPR=0x00; //不分频,计数频率为Fpclk PWMMCR=0x02; //当PWMMR0匹配时复位PWM定时器 PWMMR0=Fpclk/freq; //设置PWM频率 PWMMR2=PWMMR0*Duty/100; //设置占空比 PWMLER=0x05; //使能PWM匹配0、2锁存 PWMTCR=0x09; //PWM使能,启动PWM定时器 /*初始化PWM1*/ PWMPCR|=(1<<9); //允许PWM1输出,单边PWM PWMPR=0x00; //不分频,计数频率为Fpclk PWMMCR=0x02; //当PWMMR0匹配时复位PWM定时器 PWMMR0=Fpclk/freq; //设置PWM频率 PWMMR1=PWMMR0*Duty/100; //设置占空比 PWMLER=0x03; //使能PWM匹配0、1锁存 PWMTCR=0x09; //PWM使能,启动PWM定时器 } /******************************************************************************************************* *名称:MOTO_A_PWM() *功能:电机控制端口A配置PWM *入口参数:Duty PWM占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_A_PWM(uint32 Duty) { PWMMR1=PWMMR0*Duty/100; //设置PWM占空比 PWMLER=0x03; //使能PWM匹配0、1锁存 PWMTCR=0x09; //PWM使能,启动PWM定时器 } /******************************************************************************************************* *名称:MOTO_B_PWM() *功能:电机控制端口B配置PWM *入口参数:Duty PWM占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_B_PWM(uint32 Duty) { PWMMR2=PWMMR0*Duty/100; //设置PWM占空比 PWMLER=0x05; //使能PWM匹配0、2锁存 PWMTCR=0x09; //PWM使能,启动PWM定时器 } /******************************************************************************************************* *名称:MOTO_C_PWM() *功能:电机控制端口C配置PWM *入口参数:Duty PWM占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_C_PWM(uint32 Duty) { PWMMR3=PWMMR0*Duty/100; //设置PWM占空比 PWMLER=0x08; //使能PWM匹配0、3锁存 PWMTCR=0x09; //PWM使能,启动PWM定时器 } /******************************************************************************************************* *名称:MOTO_D_PWM() *功能:电机控制端口D配置PWM *入口参数:Duty PWM占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_D_PWM(uint32 Duty) { PWMMR4=PWMMR0*Duty/100; //设置PWM占空比 PWMLER=0x10; //使能PWM匹配0、4锁存 PWMTCR=0x09; //PWM使能,启动PWM定时器 } /******************************************************************************************************* *名称:MOTO_Init() *功能:电机控制端口初始化 *入口参数:无 *出口参数:无 ********************************************************************************************************/ void MOTO_Init(void) { PWM_Init(200,0); } /******************************************************************************************************* *名称:STOP() *功能:停止电机 *入口参数:无 *出口参数:无 ********************************************************************************************************/ void STOP(void) { MOTO_A_PWM(0); //设置A端口占空比为0 MOTO_B_PWM(0); //设置B端口占空比为0 MOTO_C_PWM(0); //设置C端口占空比为0 MOTO_D_PWM(0); //设置D端口占空比为0 } /******************************************************************************************************* *名称:MOTO_L_forward() *功能:左电机正转 *入口参数:Duty 占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_L_forward(uint32 Duty) { MOTO_C_PWM(Duty); MOTO_D_PWM(0); //设置D端口占空比为0 } /******************************************************************************************************* *名称:MOTO_L_back() *功能:左电机反转 *入口参数:Duty 占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_L_back(uint32 Duty) { MOTO_C_PWM(0); //设置C端口占空比为0 MOTO_D_PWM(Duty); } /******************************************************************************************************* *名称:MOTO_R_forward() *功能:右电机正转 *入口参数:Duty 占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_R_forward(uint32 Duty) { MOTO_A_PWM(Duty); MOTO_B_PWM(0); //设置B端口占空比为0 } /******************************************************************************************************* *名称:MOTO_R_back() *功能:右电机反转 *入口参数:Duty 占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_R_back(uint32 Duty) { MOTO_A_PWM(0); //设置A端口占空比为0 MOTO_B_PWM(Duty); } /******************************************************************************************************* *名称:MOTO_forward() *功能:电机正转 *入口参数:Duty 占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_forward() { MOTO_L_forward(50); MOTO_R_forward(50); } //控制直流电机占空比为50%,正转 /******************************************************************************************************* *名称:MOTO_back() *功能:电机反转 *入口参数:Duty 占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_back() { MOTO_L_back(50); MOTO_R_back(50); //控制直流电机占空比为50%,反转 } /******************************************************************************************************* *名称:MOTO_left() *功能:电机左转 *入口参数:Duty 占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_left() { MOTO_R_forward(50); MOTO_L_forward(0); //控制电机左转 } /******************************************************************************************************* *名称:MOTO_right() *功能:电机右转 *入口参数:Duty 占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_right() { MOTO_L_forward(50); MOTO_R_forward(0) ; //控制电机右转 } /******************************************************************************************************* *名称:MOTO_speed1() *功能:电机正转 *入口参数:Duty 占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_speed1() { MOTO_L_forward(100); MOTO_R_forward(100); //电机加速 } /******************************************************************************************************* *名称:MOTO_speed2() *功能:电机正转 *入口参数:Duty 占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_speed2() { MOTO_L_forward(50); MOTO_R_forward(50); //电机正常速度 } /******************************************************************************************************* *名称:MOTO_speed3() *功能:电机正转 *入口参数:Duty 占空比 *出口参数:无 ********************************************************************************************************/ void MOTO_speed3() { MOTO_L_forward(20); MOTO_R_forward(20); //电机减速 } /*******************************************************************************************************/ void __irq IRQ_Eint1(void) { unsigned char j,k,N=0; // MOTO_forward(); PINSEL0&=0xcfffffff; //设置P0.14为GPIO功能 IO0DIR=IO0DIR&(~(1<<14)); //IO0DIR|=IRIN; //IO0SET|=IRIN; //I/O口初始化 T=IO0PIN&IRIN; VICIntEnClr=(1<<15);//禁止外部中断1 delay(15); if(T!=0) //然后再检测红线接收脚是有数据招收,有继续,没有则退出 { VICIntEnable=(1<<15); //打开中断 return; //跳出去 } //确认IR信号出现 while (!T) //等IR变为高电平,跳过9ms的前导低电平信号。 {delay(1);} for (j=0;j<4;j++) //收集四组数据前两组为地址码,仅仅接着是两个命令码,这是NEC公司所定义的协议里规定的 { for (k=0;k<8;k++) //每组数据有8位 {T= IO0PIN&IRIN; while (T) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。 {delay(1);} T= IO0PIN&IRIN; while (!T) //等 IR 变为高电平 {delay(1);} T=IO0PIN&IRIN; while (T) //计算IR高电平时长 { delay(1); N++; if (N>=30) {VICIntEnable=(1<<15);//允许外部中断1中断; return; //太长了就自动推出中断服务程序 } //0.14ms计数过长自动离开。 } //高电平计数完毕 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0” if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1” N=0; }//end for k }//end for j if(IRCOM[2]!=~IRCOM[3]) //判断接收到指令是不是正确 {VICIntEnable=(1<<15);//允许外部中断1中断 return; } switch(IRCOM[2]) { case 0x16: MOTO_forward(); //控制直流电机占空比为50%,正转 break; case 0x0c: MOTO_back(); //控制直流电机占空比为50%,反转 break; case 0x18: MOTO_left(); //控制电机左转 break; case 0x5e: MOTO_right(); //控制电机右转 break; case 0x08: MOTO_speed1(); //电机加速 break; case 0x1c: MOTO_speed2(); //电机正常速度 break; case 0x5a: MOTO_speed3(); //电机减速 break; case 0x42: STOP(); //控制直流电机停止 break; } VICIntEnable=(1<<15);//允许外部中断1中断 EXtiNT=0x02; VICVectAddr=0x00; } /*******************************************************************************************************/ void Eint1_Init(void) { /*设置P0.14为外部中断1*/ PINSEL0=(PINSEL0&0xcfffffff|0x20000000); EXTMODE|=(1<<1); //设置外部中断为边沿触发模式 EXTPOLAR&=~(1<<1); //设置为下降沿触发 IRQEnable(); /*采用向量IRQ开启EXINT1*/ VICIntSelect=VICIntSelect&(~(1<<15)); //设置所有中断1为IRQ中断 VICVectCntl0=0x2f; VICVectAddr0=(uint32)IRQ_Eint1; //设置中断服务程序地址 EXTINT=0x02; //清零EINT1中断标志 VICIntEnable=1<<15; //使能EINTI中断 } /*******************************************************************************************************/ int main(void) { PWM_Init(200,0); Eint1_Init(); while(1); return(0); } /**********************************************************/ void delay(unsigned char x) //x*0.14MS { unsigned char i; while(x--) { for (i = 0; i<13; i++) {} } } /**********************************************************/ void delay1(int ms) { unsigned char y; while(ms--) { for(y = 0; y<250; y++){} } } |
|
相关推荐
2 个讨论
|
|
谢谢楼主的分享
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
1913个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36371 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
4405 浏览 0 评论
6065 浏览 1 评论
6775 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4222 浏览 0 评论
627浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
621浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
616浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
698浏览 2评论
803浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 17:57 , Processed in 1.224168 second(s), Total 56, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号