完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 磐石526 于 2017-5-21 21:59 编辑
主程序 #include #include #define uint unsigned int #define uchar unsigned char #define ad0_7 P1 ***it wr=P3^6; ***it rd=P3^7; ***it IN1=P2^0; ***it IN2=P2^1; ***it IN3=P2^2; ***it IN4=P2^3; ***it ENA=P2^4; ***it ENB=P2^5; ***it IR=P3^2; uint n,y,z,m; uchar N[4]; void guangkong(void); 光控制窗帘 void hongwai(void); 红外控制窗帘 void dakai(void); 窗帘打开子程序 void guanbi(void);窗帘关闭子程序 void YS(uchar time); 延时 void main() { IT0 = 1; EX0 = 1; EA = 1; guangkong(); } /*************************************************************** 电机打开 ***************************************************************/ void dakai() { IN1=1; IN2=0; IN3=0; IN4=1; for(n=0;n<10;n++) { for(y=0;y<1000;y++); {ENA=1; ENB=1; YS(2); ENA=0; ENB=0; YS(1); } } } /*************************************************************** 电机关闭 ***************************************************************/ void guanbi() { IN1=0; IN2=1; IN3=1; IN4=0; for(z=0;z<10;z++) for(m=0;m<1000;m++) {ENA=1; ENB=1; YS(2); ENA=0; ENB=0; YS(1); } } /*************************************************************** 光控 ***************************************************************/ void guangkong() { uchar ad_data; while(1) {wr=0; _nop_(); wr=1;//WR由低电平到高电平时,即上升沿时,AD开始采样转换 YS(1);//延时1ms,等待采样转换结束 ad0_7=0xff;//这条语句不能少,我也还不知道为什么 rd=0;//读取转换数据结果数据结果 _nop_(); ad_data=ad0_7;//把数据存到ad_data中 if(ad_data<150) { dakai(); } if(ad_data>400) { guanbi(); } } } /*************************************************************** 红外执行 ***************************************************************/ void hongwaiint0() interrupt 0 { uchar j,k,r; uint err,Time; Time=0; YS(7); //7ms if(IR==0) //确认是否真的接收到正确的信号 { err=1000; //1000*10us=10ms,超过说明接收到错误的信号 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时 侯,程序死在这里*/ while((IR==0)&&(err>0)) //等待前面9ms的低电平过去 { YS(1); err--; } if(IR==1) //如果正确等到9ms低电平 { err=500; while((IR==1)&&(err>0)) //等待4.5ms的起始高电平过去 { YS(1); err--; } } } for(k=0;k<4;k++) //共有4组数据 { for(j=0;j<8;j++) //接收一组数据 { err=60; while((IR==0)&&(err>0))//等待信号前面的560us低电平过去 { YS(1); err--; } err=500; while((IR==1)&&(err>0)) //计算高电平的时间长度。 { YS(10); //0.1ms Time++; err--; if(Time>30) { return; } } N[k]>>=1; //k表示第几组数据 if(Time>=8) //如果高电平出现大于565us,那么是1 { N[k]|=0x80; } Time=0; //用完时间要重新赋值 } } if(N[0] == ~N[1] && N[2] == ~N[3]) //校验识别码,操作码 { r=N[2]; } EX0 = 1; if(r==0x01) { dakai(); } if(r==0x02) { guanbi();} } /*************************************************************** 延时程序 ***************************************************************/ void YS(uchar time) { uchar i,j; for(i=0; i for(j=0; j<247; j++)_nop_(); } 红外发射 #include #include #define uchar unsigned char #define uint unsigned int #define SBM 0x80 //识别码 #define m9 (65536-9000) //约9mS #define m4_5 (65536-4500) //约4.5mS #define m1_6 (65536-1630) //约1.65mS #define m_65 (65536-580) //约0.65mS #define m_56 (65536-560) //约0.56mS #define m40 (65536-40000) //约40mS #define m56 (65536-56000) //56mS #define m2_25 (65536-2250) //约2.25mS ***it IR = P3^6; //定义发射引脚(接PNP三极管基极) void KEY(void); void ZZ(uchar x); void Z0(uchar temp); void TT0(bit BT,uint q); void YS(uchar time); /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 函数功能:主函数 ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/ void main(void) { TMOD = 0x01; //T0 16位工作方式 IR=1; //发射端口常态为高电平 while(1) { KEY(); } } void KEY(void) { uchar v; P1=0xff; //将键盘端口未按下按键时,按键1,2输入端口为0 if(P1!=0xff) //检测是否有按键按下,如果有则hangval必不为0xf8 { YS(10); //按键去抖动,延时10毫秒 if(P1!=0xff) //确实有按键按下 { v=P1; switch(v) { case 0xfe:ZZ(0x01);v=0;break; case 0xfc:ZZ(0x02);v=0;break; default:v=0; } } } } void ZZ(uchar x) { TT0(1,m9); //高电平9mS TT0(0,m4_5); //低电平4.5mS /*┈ 发送4帧数据 ┈*/ Z0(SBM); Z0(~SBM); Z0(x); Z0(~x); /*┈┈ 结束码 ┈┈*/ TT0(1,m_65); TT0(0,m40); } /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 函数功能:单帧发送程序 入口参数:1帧数据 ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/ void Z0(uchar temp) { uchar l; for (l=0;l<8;l++) //循环8次移位 { TT0(1,m_65); //高电平0.65mS if(temp&0x01) TT0(0,m1_6); //发送最低位 else TT0(0,m_56); temp >>= 1; //右移一位 } } /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 函数功能:38KHz脉冲发射 + 延时程序 入口参数:(是否发射脉冲,延时约 q (uS)) ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/ void TT0(bit BT,uint q) { TH0 = q/256; //输入T0初始值 TL0 = q%256; TF0=0; //清0 TR0=1; //启动定时器0 if(BT == 0) while(!TF0); //BT=0时不发射38KHz脉冲只延时;BT=1发射38KHz脉冲且延时; else while(1) //38KHz脉冲,占空比1:5 { IR = 0; if(TF0)break; if(TF0)break; IR = 1; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; } TR0=0; //关闭定时器0 TF0=0; //标志位溢出则清0 IR =1; //脉冲停止后,发射端口常态为高电平 } /*************************************************************** 函数功能:按键消抖 延时程序 入口参数:1ms×time (晶振=12MHz) ***************************************************************/ void YS(uchar time) { uchar i,j; for(i=0; i for(j=0; j<247; j++)_nop_(); }
|
|
相关推荐
2个回答
|
|
L298控制直流电机
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-spi编程示例之spi编写程序
575 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第三十七章 image图像对比实验
554 浏览 0 评论
500 浏览 1 评论
482 浏览 0 评论
关于RT-Thread studio添加freemodbus控件失败的问题
817 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11641 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-8 14:34 , Processed in 0.740446 second(s), Total 74, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号