用51单片机制作的SAA3010T型遥控器.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用51单片机制作的SAA3010T型遥控器

用51单片机制作的SAA3010T型遥控器 默认分类 2008-11-26 15:30:49 阅读356 评论2 ??字号:大中小?订阅 //作者:全立波,quanlibo@126.com #include reg51.h #define uchar unsigned char #define uint? unsigned int //用单片机来模拟发送SAA3010数据码 //电脑用串口控制单片机,单片机通过模拟红外通信去控制机器人,空调,电视等电子设备。 uchar sendstart=3; //起始位2位+控制位1位+系统位6位=8位,其中起始两位为1,其它各为均为0 uchar senddatas=1; //数据位为6位,这里只用该字节的前6位 uchar count=0; sbit? P1_0=P1^0;?? //用来控制红外发光二极管来发送数据 bit?? sendflag=0;? //发送数据的标志量 void? Init(); void? sendData(); uchar datas[28]; void main(void){ ? Init(); ? while(1){ ??? if(sendflag==1){ ? //串口不允许中断 ??? ET1=0;???? ?????? TR1=0; ?????? ES=0; ? //一个周期是26.32us,那么一个周期的一半应该是13us,所有的错误全部都在这里(看来网上发表的文章也是一些理论没有真正实践过) ???? //12MHZ,38KHZ ???? //TH1=0xf3; ???? //TL1=0xf3; ???? //11.0592MHZ ,38KHZ ?????? TH1=0xf4; ?????? TL1=0xf4; ??? sendflag=0; ?????? sendData(); ?} ? }; } ? //这里定义1位的时间为在1.651ms,那么半位的时间为1.651ms/2=0.8255ms=825.5us //事先准备要发送的数 void sendData(){ ? uchar c=0; ? uint? b=0;//待发送的数据 ? uchar s=0; ? sendstart=3;//起始码 ? ? for(c=0;c8;c++){ ? ?if(senddatas-(senddatas/2)*2){ ??? //为1 ??? b=b|1; ?}else{ ??? //为0 ??? b=b|0; ?} ?if(c7){ ??? b=b1; ?} ?senddatas=senddatas1; ? } ? b=b82; ? //做起来真是精细,还要搞掉后面没有被占掉的值,否则数据不准确,做学问真的是不容易啊 ? b=b |sendstart; ? //下面代码用来装配发送数据 ? c=0; ? //先发送起始位2位+控制位1位+系统位5位=8位,后面的6位是数据位,共14位 ? //用NPN三极管放大信号 ? do ? { ???? if(b-(b/2)*2){ ??????? //发送1的前半位 ???? datas[s++]=1; ???? }else{ ??????? //发送0的前半位 ???? datas[s++]=0; ???? } ? if(b-(b/2)*2){ ??????? //发送1的后半位 ???? datas[s++]=0; ???? }else{ ??????? //发送0的后半位 ???? datas[s++]=1; ???? } ? //数据循环右移,发送下一位数据 ? b=b1; ?? }while(++c14); ?? //开始发送数据 ??? count=0; ? ?//12MHZ,延时0.8255ms用 ??//TH0=0xfc; ??? //TL0=0xc6; ?//11.0592MHZ,延时0.8255ms用 ?TH0=0xfd; ??? TL0=0x07; ?ET0=1;? ??? TR0=1; } void Init(){ ? //刚开始启动不发送 ? P1_0=0; ? //我们这里利用定时器1的工作方式2(8位自动重载)来发送载波信号 ? TMOD=0x21; ? EA=1;//总中断允许 ? ES=1;//允许串口中断 ? //串口工作于方式1,8位UART,波特率可变 ,允许串口接受数据,工作方式为1,无奇偶校验位。 ? SCON=0x50; ? //波特率不加倍,也就是串口通信的波特率为9600 ? PCON=0x00; ? ? //串口通信 ? TH1=0xfd; //装入初值, 以后是自动重载的8位计数器 ? TL1=0xfd; ? ? ET1=0;????? ?

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档