完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
#include
#include #define uchar unsigned char #define uint unsigned int ***it ir=P3^2; //红外接口定义 ***it BEEP=P1^2; uchar code table_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar code table_we[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//0xfe,0xfd,0xfb,0xf7,0xef,0xdf uchar irtime; //00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000 uchar irdata[33]; uchar bitnum; uchar startflag; uchar irok; uchar ircode[4]; uchar irprosok; //红外处理 uchar disnum[8]; /************************************************************************* 延时函数 **************************************************************************/ void delay_50us(uint t) { uchar j; for(;t>0;t--) for(j=20;j>0;j--); } void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++); } void delay(unsigned char n) { unsigned char i; for(i=0;i } /************************************************************************* 蜂鸣器 **************************************************************************/ void beep() //蜂鸣器响一声函数 { unsigned char i; for (i=0;i<5;i++) { delay1ms(); BEEP=!BEEP; //BEEP取反 } BEEP=1; //关闭蜂鸣器 delay(50); //延时 } /************************************************************************* 定时器初始化 **************************************************************************/ void timer0init (void) //定时器0初始化 256*(1/11.0592M)*12=0.28ms { TMOD=0x02; //工作模式2 TH0=0x00; //初值0 TL0=0x00; //初值0 ET0=1; //打开中断 EA=1; //开总开关 TR0=1; //启动定时器 } /************************************************************************* 中断功能函数 **************************************************************************/ void int0init (void) { IT0=1; //下降沿触发 EX0=1; //打开外部中断 EA=1; //开中断开关 } /************************************************************************* 定时器中断 **************************************************************************/ void timer0() interrupt 1 //定时器0中断 { irtime++; } /************************************************************************* 外部中断函数 **************************************************************************/ void int0 () interrupt 0 //外部中断0 { if (startflag) { if(irtime>32&&irtime<60) //8-16ms之间既认为是引导码 { bitnum=0; //bitnum清零,准备开始接收引导码 } irdata[bitnum]=irtime; //1位引导码接收完毕 irtime=0; //irtime清零,准备开始计时接收8位客户码,8位客户反码,8位操作码和8位操作反码 bitnum++; //码数加1 if(bitnum==33) //接收完一帧33位 { bitnum=0; //bitnum清零 irok=1; //1帧数据接收完毕 } } else { irtime=0; startflag=1; } } /************************************************************************* 函数功能:把irdata【】中的时间代码转换成二进制代码存放在ircode【】中 **************************************************************************/ void irpros(void) //红外处理 0码irtime (0.56+0.56)/0.28=4 { // 1码irtime (0.56+1.68)/0.28=6.56 uchar no,k,i,j; k=1; //跳过1位引导码 for(j=0;j<4;j++) //4组代码 { for(i=0;i<8;i++) { no=no>>1; //右移1位 if(irdata[k]>6) { no=no|0x80; //最高位置1 } k++; } ircode[j]=no; } irprosok=1; } /************************************************************************* 红外码值转换 **************************************************************************/ void irwork(void) //红外码值转换 将ircode【】中的二进制代码转换成为16进制代码便于在数码管上显示 { disnum[0]=ircode[0]/16; disnum[1]=ircode[0]%16; disnum[2]=ircode[1]/16; disnum[3]=ircode[1]%16; disnum[4]=ircode[2]/16; disnum[5]=ircode[2]%16; disnum[6]=ircode[3]/16; disnum[7]=ircode[3]%16; } /************************************************************************* 数码管显示程序 **************************************************************************/ void display() //数码管显示程序 { uchar i; for(i=2;i<6;i++) //只显示客户反码,操作码 只有4个数码管,只能显示4位数字 { P0=table_du[disnum[i]]; //disnum[8] 0,1,2,3, 4,5,6,7 P2=table_we[i+4]; //4位数码管连接的是P2^4-P2^7高4位 delay_50us(20); } } /************************************************************************* 主函数 **************************************************************************/ void main() { timer0init(); int0init(); while(1) { if(irok==1) { irpros(); irok=0; } if(irprosok==1) { irwork(); beep(); irprosok=0; } display(); } } 遥控解码键值: 00 01 02 04 05 06 08 09 0A 0C 0D 0E 10 11 12 14 15 16 18 19 1A 步进电机正反转 #include #include typedef unsigned char u8; typedef unsigned int u16; ***it key =P3^7; u8 code FFW[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; u8 code REV[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10}; bit flag=1; void sdelay(u8 n) //延时程序 { u8 i,k; for(i=3*n;i>0;i--) for(k=225;k>0;k--); } void main(void) { u8 i; while(1) { for (i=0; i<8; i++) //一个周期--八拍 { if(flag) P2 = FFW[i]; //取数据 else P2 = REV[i]; sdelay(5); //节拍延时,用于调节转速 } if(!key) { sdelay(10); if(!key) flag=~flag; while(!key) ; } } } 上面两个程序都已经验证过, 求达人帮忙加一个红外遥控步进电机的主功能函数 |
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
265 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
789 浏览 0 评论
1306 浏览 2 评论
787 浏览 0 评论
【RA4M2-SENSOR开发板评测】Analogue+Timers综合测试
1587 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16902 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 08:48 , Processed in 0.623728 second(s), Total 71, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
4834