您需要 登录 才可以下载或查看,没有账号?注册
收藏1 举报
#include "header.h" #include "1602.h" unsigned char signal ; unsigned char duty; unsigned char TempData[2]; unsigned char IRcord[4]; char code Tab[16]="0123456789ABCDEF"; bit irpro_ok; void Delay(unsigned int ms) { unsigned char i; while(ms--) { for ( i=0;i<250;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } void main() { EA=1; P1M0=0x28; //设置控制继电器IO口为强推挽输出 P1M1=0x00; duty=0; Turn1=0; Turn2=0; Ug1=0; signal = 0; LCD_init(); PWM_init(); ADC_init(); timer_init(); Int0(); while (1) { if (irpro_ok) { TempData[0]=Tab[signal/16]; TempData[1]=Tab[signal%16]; lcd_showchar(0x46,TempData); switch(signal) { case 0x44 : { if(Turn1==Turn2&&Turn1==0) { duty=120; CR=0; Delay(600); Turn1=1; Turn2=1; CR=1; } else { duty=120; Turn1=1; Turn2=1; } } break; case 0x40 : { if(Turn1==Turn2&&Turn1==1) { duty=120; CR=0; Delay(600); Turn1=0; Turn2=0; CR=1; } else { duty=120; Turn1=0; Turn2=0; } } break; case 0x43: { //停止 duty = 255; Turn1=0; Turn2=0; CR = 0; //关闭PCA模块,停止输出PWM调速信号 } break; case 0x15: { //加速 if (duty>14) duty=duty-15; else duty = 120; } break; case 0x07: { //减速 if (duty<255) duty=duty+15; else duty = 120 ; } break; default : _nop_();break; } CCAP1H=CCAP1L=duty; lcd_showdata(0x05,duty); Delay(15); timer_init(); EX0=1; } } } void INT0_Rountine() interrupt 0 using 0 //红外信号接收解码 { char j,k; static unsigned char temp; static unsigned int timer0; //duty = 255; //停止电机 CR = 0; //停止PWM信号输出 EX0 = 0; //关闭中断0 Delay(15); if (INT0==1) { EX0=1; return ; //防止重复按键 } signal= 0; irpro_ok=0; TMOD=0x09; TH0=0; TL0=0; ET0=0; //关闭定时器中断 ET1=0; TR0=1; //启动脉宽测量T0 while(!INT0) //跳过红外输出的引导信号9ms低电平 ; while(INT0) //跳过引导信号4.5ms高电平 ; timer0 = TH0*256+TL0; if (4000<timer0&&timer0<5000) { timer0 = 0; TH0 = 0; TL0 = 0; for(j=0;j<4;j++) { for(k=0;k<8;k++) { temp>>=1; //读取红外数据存在高位,每次读取后将数据右移一位 while(!INT0); //跳过信号低电平段 while(INT0); //跳过信号高电平段 timer0 = TH0*256 +TL0; //计算高电平段信号时间 if(450<timer0&&timer0<650) //根据高电平时间判断信号内容 0.56ms为信号0,1.685ms为信号1 temp=temp&0x7f; //读取该位为0,存在最高位 else temp=temp|0x80; timer0 = 0; TH0 = 0; TL0 = 0; } IRcord[j]=temp; timer0=0; temp=0; } if(IRcord[2]==~IRcord[3]) { signal=IRcord[2]; irpro_ok=1; return ; } else { EX0 = 1; //从新打开外部中断0,从新接收红外信号 irpro_ok=0; return ; } } else { EX0 = 1; //从新打开外部中断0,从新接收红外信号 irpro_ok=0; return ; } } 不但标题没打完,程序也没粘完。上面帮你粘完了,哪个变量不对?
NE5532 发表于 2016-12-28 16:35 不但标题没打完,程序也没粘完。上面帮你粘完了,哪个变量不对?
NE5532 发表于 2016-12-28 22:11 你先在仿真器里看看这两个变量的值是多少,你定义全局变量的方法倒是没有错,就是要看算法上是否有问题了。 ...
NE5532 发表于 2016-12-28 22:36 STC是号称的内部软仿真,我也没有用过。没有仿真器也没关系,你先整个串口之类,可以把这两个数的值送出来 ...
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
等级类勋章
发帖类勋章
时间类勋章
人才类勋章
21
147
5
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号