|
本帖最后由 xyg123321 于 2021-3-9 19:14 编辑
一次发送一组数据,采用普通红外发送发光二极管940nm红外发光管
N76e003PIN口P05接上拉电阻10K- /*--------------------------------------------------
- NEC协议需要工作在38kHZ载波上,在N76E003中我们使用定时器0来产生
- 通过脉冲串之间的时间间隔来实现信号的调制(PPM)
- 位的周期为1.12ms(低电平0)或者2.25ms(高电平1)
- ---------------------------------------------------*/
- #include "n76e003.h"
- #include "Function_Define.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit LED = P0^2;
- sbit IR = P0^5; //定时器0引脚
- sbit CLK = P1^1; //时钟
- sbit CS = P1^2; //片选
- sbit DIN = P1^0; //数据
- sbit K1 = P0^1; //长按短按
- sbit K2 = P0^0; //按键2
- sbit K3 = P1^3; //按键3
- sbit K4 = P1^4; //按键4
- static bit OP; //红外发射管的亮灭控制
- static uint count; //延时计数器
- static uint endcount; //终止延时计数器
- static uchar flag; //红外发送标志
- char iraddr1; //16位地址 第一字节
- char iraddr2; //16位地址 第二字节
- uchar code Table[]={0x5f,0x06,0x6b,0x2f,0x36,0x3d,0x7d,0x07,0x7f,0x3f,0xDf,0x86,0xeb,0xaf,0xb6,0xbd,0xfd,0x87,0xff,0xbf};//显示数字0-9、0-9带星期
- uchar CNT=0;
- uchar IR_data;
- uchar IR_DATT[]={145,59,64,215,130,35,40,145,59,64,215,130,35,151,220,215};
- void Delayms(int ms)
- {
- uchar y;
- while(ms--)
- {
- for(y=0;y<250;y++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- void Delay_xms(uint x)
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- void Write_1722_byte(uchar DATA) //写字节
- {
- uchar i;
- CS=0;
- for(i=8;i>=1;i--)
- {
- CLK = 0; //时钟拉低,写数据
- DIN = DATA & 0x01; //DATA & 10000000,读取最高位写入max7219,最先发送高位(从左往右D7-D0)
- CLK = 1; //时钟拉高,送数据
- DATA = DATA >> 1; //左移1位,重新&运算,读取最高位写入max7219,从右往左写
- }
- }
- void Write_1722_com(uchar com) //写指令
- {
- CS=0;
- Write_1722_byte(com);
- CS=1;
- }
- void TM1722_Write_Word(uchar addr,uchar dat) //写数据
- {
- Write_1722_byte(addr);
- Write_1722_byte(dat);
- Delay_xms(10);
- CS=1;
- }
- void Init_qingping() //清屏程序
- {
- P10_PushPull_Mode;
- P11_PushPull_Mode;
- P12_PushPull_Mode;
- P05_PushPull_Mode;
- P02_PushPull_Mode;
- P00_PushPull_Mode;
- P01_PushPull_Mode;
- P13_PushPull_Mode;
- P14_PushPull_Mode;
- Write_1722_com(0x00);
- Write_1722_com(0x40);
- Write_1722_com(0xc0);
- Write_1722_com(0x97); //亮度
- TM1722_Write_Word(0xc2,0x00);
- TM1722_Write_Word(0xc3,0x00);
- TM1722_Write_Word(0xc6,0x00);
- TM1722_Write_Word(0xc7,0x00);
- TM1722_Write_Word(0xca,0x00);
- TM1722_Write_Word(0xcb,0x00);
- TM1722_Write_Word(0xce,0x00);
- TM1722_Write_Word(0xcf,0x00);
- }
- void IR_init()
- {
- count=0;
- flag=0;
- OP=0;
- IR=0;
- EA=1; //总中断开
- TMOD=0x11; //设置定时器0和1为16位模式
- ET0=1; //定时器0中断允许
- //设定定时大小 38K 等加于 26us中断一次
- TH0=0xff;
- TL0=0xf1;
- TR0=1; //开始计数
- //写16位地址
- iraddr1=3;
- iraddr2=252;
- }
- /********发送数据函数计时器endcount基于16MHZ的值*******/
- void SendIRdata(char p_irdata)
- {
- int i;
- char irdata=p_irdata;
-
- //发送9ms的起始码
- endcount=665;
- flag=1;
- count=0;
- while(count<endcount);
- //发送4.5ms的结果码
- endcount=351;
- flag=0;
- count=0;
- do{}while(count<endcount);
- //发送16位地址的前八位
- irdata=iraddr1;
- for(i=0;i<8;i++)
- {
- //先发送0.56ms的38K红外波(即编码中的0.56ms的低电平)45
- endcount=45;
- flag=1;
- count=0;
- do{}while(count<endcount);
- //停止发送红外信号(即编码中的高电平)
- if(irdata-(irdata/2)*2)//判断二进制的个位是1还是0
- {
- endcount=132;//1
- }
- else
- {
- endcount=45;//0
- }
- flag=0;
- count=0;
- do{}while(count<endcount);
- irdata=irdata>>1;
- }
- //发送16位地址的后八位
- irdata=iraddr2;
- for(i=0;i<8;i++)
- {
- //先发送0.56ms的38K红外波(即编码中的0.56ms的低电平)
- endcount=45;
- flag=1;
- count=0;
- do{}while(count<endcount);
- //停止发送红外信号(即编码中的高电平)
- if(irdata-(irdata/2)*2)//判断二进制的个位是1还是0
- {
- endcount=132;//1
- }
- else
- {
- endcount=45;//0
- }
- flag=0;
- count=0;
- do{}while(count<endcount);
- irdata=irdata>>1;
- }
- //发送8位数据
- irdata=p_irdata;
- for(i=0;i<8;i++)
- {
- //先发送0.56ms的38K红外波(即编码中的0.56ms的低电平)
- endcount=45;
- flag=1;
- count=0;
- do{}while(count<endcount);
- //停止发送红外信号(即编码中的高电平)
- if(irdata-(irdata/2)*2)//判断二进制的个位是1还是0
- {
- endcount=132;//1
- }
- else
- {
- endcount=45;//0
- }
- flag=0;
- count=0;
- do{}while(count<endcount);
- irdata=irdata>>1;
- }
- //发送8位数据反码
- irdata=~p_irdata;
- for(i=0;i<8;i++)
- {
- //先发送0.56ms的38K红外波(即编码中的0.56ms的低电平)
- endcount=45;
- flag=1;
- count=0;
- do{}while(count<endcount);
- //停止发送红外信号(即编码中的高电平)
- if(irdata-(irdata/2)*2)//判断二进制的个位是1还是0
- {
- endcount=132;//1
- }
- else
- {
- endcount=45;//0
- }
- flag=0;
- count=0;
- do{}while(count<endcount);
- irdata=irdata>>1;
- }
- //结束信息
- endcount=45;
- flag=1;
- count=0;
- do{}while(count<endcount);
- flag=0;
- }
- void KEY()
- {
- uchar DDIR;
- if(!K1)
- {
- for(DDIR=0;DDIR<16;DDIR++)
- {
- SendIRdata(IR_DATT[DDIR]);
- Delayms(20);
- }
- }
- if(!K2)
- {
- IR_data=74;
- SendIRdata(IR_data);
- Delayms(10);
- LED=1;
- }
- if(!K3)
- {
- IR_data=52;
- SendIRdata(IR_data);
- Delayms(10);
- LED=1;
- }
- if(!K4)
- {
- IR_data=63;
- SendIRdata(IR_data);
- Delayms(10);
- LED=1;
- }
- TM1722_Write_Word(0xc3,Table[1]); //显示模式
- TM1722_Write_Word(0xcf,Table[IR_DATT[DDIR]/1000]); //2数码管
- TM1722_Write_Word(0xce,Table[IR_DATT[DDIR]%1000/100]); //3数码管
- TM1722_Write_Word(0xcb,Table[IR_DATT[DDIR]%1000%100/10]); //4数码管
- TM1722_Write_Word(0xc7,Table[IR_DATT[DDIR]%1000%100%10]); //5数码管
- }
- void main (void)
- {
- Init_qingping();
- IR_init();
- while(1)
- {
- KEY();
- }
- }
- void timeint(void) interrupt 1
- {
- TH0=0xff; //设定定时器初值 255
- TL0=0xf1; // 241
- count++; //中断计数累加
- if(flag==1)
- {
- OP=~OP;
- }
- else
- {
- OP=0;
- }
- IR=OP; //IRP05为定时器0引脚
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|