完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我想用单片机遥控电机正反转,但对于遥控方面一点也不知道.....求各位大神帮忙,只要红外遥控按键一按,单片机就接受到高电平信号这样的程序。。。另外,请问下要实现这样的功能,我应该在淘宝里买啥元器件?接收端插入单片机,然后控制器在手里遥控给单片机接收信号?
|
|
相关推荐
5个回答
|
|
用hs0038就可以。
|
|
|
|
我不大懂....hs0038不是只有接收头,发信器用啥?....而且程序应该怎样编写
|
|
|
|
我不大懂....hs0038不是只有接收头,发信器用啥?....而且程序应该怎样编写
|
|
|
|
发射器可以用空调的遥控器
|
|
|
|
/*红外线接收程序,本程序运行在NEC制下的遥控器下,市面上的遥控器大部份都是NEC制的,运行程序,按遥控器
在数码管上显示相应的地址码-控制码(以16进制显示)分四段,前两段是地址码,后两段为控制吗,根据NEC编码不同, 有的是前8位为数据码,后8位为数据据码的反码,有的是16位编码,就没有反码了 在运行本例子时,先将插针J11短接1、2两脚,把红外数据脚引入P33*/ #include #include ***it hwx=P3^3;//定义红外接收脚, code unsigned char table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71,0x40}; //共阴数码管 0-9 a-f - 表 unsigned char l_tmpdate[8]={0,0,0,0,0,0,0,0};//显示管数据 unsigned char l_lhj[66];//定义66位数组变量来存储接收的时间参数 void delay();//延时子函数 void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数 void main(void) //入口函数 { EA=1;//首先开启总中断 EX1=1; //开启外部中断 1 IT1=1; // 设置成 下降沿触发方式 while(1){//循环显示,接收都由 display(l_tmpdate,8); } } void display(unsigned char *lp,unsigned char lc)//显示 { unsigned char i;//定义变量 P2=0;//端口2为输出 P1=P1&0xF8;//将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管 for(i=0;i if(lp>0x7f) P2+=0x80; delay();//延时 P2=0;//清0端口,准备显示下位 if(i==7)//检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据 break; P1++;//下一位数码管 } } void delay(void)//空5个指令 { unsigned char i=13; while(i) i--; } void hongwai(void) interrupt 2 //外部中断 1 ,INT1(P3^3)连接红外线接收IC数据脚 { unsigned char i,j,tmp; unsigned int tmp2; EX1=0; //hwx=1; j=33;//传送一组数包括引导码1位,地址码8位加反码8位,指令码8位加反码8位,总共33位 i=0;//从第一维数组开始 tmp2=0; while(!hwx){//NEC制红外波形引导码低电平开始 tmp2++;//低电平延时记数 if(tmp2==1000)//NEC制引导码判断,防止其它干扰波形进入 break; } if(tmp2<1000){//小于1000个记数的判断为干扰退出接收 EX1=1; return; } //P2=0x76;//数码管输出显示H,作为红外接收的指示 while(j){//循环接收33位数据,为何我们用到66位数组,我们可以不接收高电平时间常数,只接低电平常数就 //可以判断1或0了,在这里我们都接收 //还有一点要知道,接收波形是反向,在没有接收时端口为高电平 tmp=0; l_lhj=1;//时间量从1开始 while(!hwx){//检测高低电平的变化 l_lhj++;//没变继续加1 delay();//加入延时,是因为我们采用8位二进来存储,如果不加延时,时间量将计满 tmp++;//此变量为防止干扰带来的死循环 if(tmp==250) break; } i++; tmp=0; l_lhj=1;//时间量从1开始 while(hwx){//检测高低电平的变化 l_lhj++;//没变继续加1 delay();//同上 tmp++; if(tmp==250) break; } i++; j--; } i=255;//加入循环延时,处理数据 while(i){ tmp=255; while(tmp){ P2=0XF0; tmp--; } i--; } tmp=0; //这里显示了全部的四段码,包括地址位两段,控制位两段,每段用点分开 for(i=3;i<19;i++,i++){//处理地址位前8位,这是3是因为去掉前面的引导码。对低电平时间数据的数理, tmp>>=1;//右移一位,接收低电平在前 if(l_lhj>30)//检测低电平时间超过30就确认为1 tmp+=0x80; } l_tmpdate[0]=tmp/16;//分开2位以16进制显示 l_tmpdate[1]=tmp%16+0x80;//0x80为加入小数点,目的是分开四段好看些 tmp=0; for(i=19;i<35;i++,i++){//同上,这里处理地址位后8位 tmp>>=1; if(l_lhj>30) tmp+=0x80; } l_tmpdate[2]=tmp/16; l_tmpdate[3]=tmp%16+0x80; tmp=0; for(i=35;i<51;i++,i++){//同上,这里处理控制位前8位 tmp>>=1; if(l_lhj>30) tmp+=0x80; } l_tmpdate[4]=tmp/16; l_tmpdate[5]=tmp%16+0x80; tmp=0; for(i=51;i<67;i++,i++){//同上,这里处理控制位后8位 tmp>>=1; if(l_lhj>30) tmp+=0x80; } l_tmpdate[6]=tmp/16; l_tmpdate[7]=tmp%16+0x80; EX1=1; } //朋友们,到这里,你是否有想过用遥控接收的指令码当键盘码来处理别的呢! //比如按下了某个键的指令码去处理继电器的打开、关闭,哈哈,这个就你们自己来发辉下了 |
|
|
|
只有小组成员才能发言,加入小组>>
3282 浏览 9 评论
2959 浏览 16 评论
3464 浏览 1 评论
9007 浏览 16 评论
4054 浏览 18 评论
1120浏览 3评论
576浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
572浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2305浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1861浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 02:39 , Processed in 1.278905 second(s), Total 88, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号