1527驱动程序讲解
时间:10-02
整理:3721RD
点击:
file:///C:/Users/tangy/AppData/Local/YNote/data/18080196865@163.com/621c17d7927a49c8832b55ac08689e77/akkmbkg8%5D%25%25%7Bf@yff4b%5Dld5.png
file:///C:/Users/tangy/AppData/Local/YNote/data/18080196865@163.com/621c17d7927a49c8832b55ac08689e77/akkmbkg8%5D%25%25%7Bf@yff4b%5Dld5.png
file:///C:/Users/tangy/AppData/Local/YNote/data/18080196865@163.com/621c17d7927a49c8832b55ac08689e77/akkmbkg8%5D%25%25%7Bf@yff4b%5Dld5.png
无线1527由:同步码,地址码,数据码组成,特点没采集时会有无限杂波
同步码:4T+12T,用示波器测出低电平的时间,因为中断用的低电平触发所以只要能测出低电平的时间差就能找出同步码,“0”,“1”,如图:
同步码的采集:
file:///C:/Users/tangy/AppData/Local/YNote/data/18080196865@163.com/be4d9a2fa8f74a7683ef06b74c732234/485789083824398043.jpg
“0”采集:
file:///C:/Users/tangy/AppData/Local/YNote/data/18080196865@163.com/2ad883839d484156bb45b23c4c8d4a38/43348352912828521.jpg
“1”采集:
file:///C:/Users/tangy/AppData/Local/YNote/data/18080196865@163.com/6c17c6b085cb49b2bd84e04b8b403f29/538256135624822259.jpg
问题:由于用的CMS89FT6282这款单片机,它的定时器0与2是八位定时器,所以要想采集一个大于7ms的低电平是不可能的。
解决方法:所以我们采集的措施是,定时器2预分频16,后分频4这样通过公式1/8*4*16*4*255=8160us(8m晶振)这样时间足够,但是我们选择的是定时器0,它能进行1:64分频,所以这样更加的方便。
主要程序:
/*主函数*/
void main(void)
{
OSCCON=0x70;//设置时钟为8M
TRISB&=0xf8;//设置RB0,RB1,RB2为输出脚
TRISA =0xff;//PORTA配置为输入
intr_con(); //总中断初始化
timer0_int();//定时器1初始化
while(1)
{
if(k1==24)
{
DigDisplay();
k1=0;
INTF=0;
INTE=1;//允许外部中断
TMR0=0;
}
}
}
/*中断函数*/
void interrupt ISR(void)
{
if(INTE && INTF)//外部中断开始
{
//PEIE = 0;
TMR0=0; //进中断定时器0打开,相当于低电平开始采集时间
while(!IRIN);//当IRIN的电平变为高电平时,把所采集的时间赋值给一个变量
time=TMR0*32;
if( flag1==1 )//如果是同步码,就进行24位内码+数据码的采集
{
if( time<900 && time>700)//当低电平在此范围的时候为0
{
dat&=0xfffffffe;
if(k1<24)
dat=dat<<1;
k1++;
}
else if(time<300 && time>200)//当低电平在此范围的时候为1
{
dat|=0x00000001;
if(k1<24)
dat=dat<<1;
k1++;
}
else
k1 = 24; /*只要进到flag1强行让K都要为24*/
if( k1==24 )
{
cj_data=dat;
dat=0;
flag1=0;
}
}
if( time<8000&&time>7000 )//判断是否为同步码的低电平时间
{
flag1=1; //如果是就让标志位变为1
}
else//排除干扰
{
k1 = 0;
TMR2=0;
time=0;
}
INTF=0;
}
}
/*显示子程序*/
void DigDisplay()
{
switch(cj_data)
{
case(0x000006E4)://1
x=1;break;
case(0x00006F0)://2
x=2;break;
case(0x000006E2)://3
x=3;break;
case(0x000006EA)://4
x=4;break;
default:break;
}
STB=1;
STB=0;
cmd(0x44);
delay(10);
shiwei=x/10;
gewei=x%10;
cmd(0xC4); //十位
send(table1[shiwei]);
cmd(0xC6); //个位
send(table1[gewei]);
cmd(0xC0);//千
send(0x00);
cmd(0xC2); //百
send(0x00);
cmd(0x8f);
STB=1;
}
file:///C:/Users/tangy/AppData/Local/YNote/data/18080196865@163.com/621c17d7927a49c8832b55ac08689e77/akkmbkg8%5D%25%25%7Bf@yff4b%5Dld5.png
file:///C:/Users/tangy/AppData/Local/YNote/data/18080196865@163.com/621c17d7927a49c8832b55ac08689e77/akkmbkg8%5D%25%25%7Bf@yff4b%5Dld5.png
无线1527由:同步码,地址码,数据码组成,特点没采集时会有无限杂波
同步码:4T+12T,用示波器测出低电平的时间,因为中断用的低电平触发所以只要能测出低电平的时间差就能找出同步码,“0”,“1”,如图:
同步码的采集:
file:///C:/Users/tangy/AppData/Local/YNote/data/18080196865@163.com/be4d9a2fa8f74a7683ef06b74c732234/485789083824398043.jpg
“0”采集:
file:///C:/Users/tangy/AppData/Local/YNote/data/18080196865@163.com/2ad883839d484156bb45b23c4c8d4a38/43348352912828521.jpg
“1”采集:
file:///C:/Users/tangy/AppData/Local/YNote/data/18080196865@163.com/6c17c6b085cb49b2bd84e04b8b403f29/538256135624822259.jpg
问题:由于用的CMS89FT6282这款单片机,它的定时器0与2是八位定时器,所以要想采集一个大于7ms的低电平是不可能的。
解决方法:所以我们采集的措施是,定时器2预分频16,后分频4这样通过公式1/8*4*16*4*255=8160us(8m晶振)这样时间足够,但是我们选择的是定时器0,它能进行1:64分频,所以这样更加的方便。
主要程序:
/*主函数*/
void main(void)
{
OSCCON=0x70;//设置时钟为8M
TRISB&=0xf8;//设置RB0,RB1,RB2为输出脚
TRISA =0xff;//PORTA配置为输入
intr_con(); //总中断初始化
timer0_int();//定时器1初始化
while(1)
{
if(k1==24)
{
DigDisplay();
k1=0;
INTF=0;
INTE=1;//允许外部中断
TMR0=0;
}
}
}
/*中断函数*/
void interrupt ISR(void)
{
if(INTE && INTF)//外部中断开始
{
//PEIE = 0;
TMR0=0; //进中断定时器0打开,相当于低电平开始采集时间
while(!IRIN);//当IRIN的电平变为高电平时,把所采集的时间赋值给一个变量
time=TMR0*32;
if( flag1==1 )//如果是同步码,就进行24位内码+数据码的采集
{
if( time<900 && time>700)//当低电平在此范围的时候为0
{
dat&=0xfffffffe;
if(k1<24)
dat=dat<<1;
k1++;
}
else if(time<300 && time>200)//当低电平在此范围的时候为1
{
dat|=0x00000001;
if(k1<24)
dat=dat<<1;
k1++;
}
else
k1 = 24; /*只要进到flag1强行让K都要为24*/
if( k1==24 )
{
cj_data=dat;
dat=0;
flag1=0;
}
}
if( time<8000&&time>7000 )//判断是否为同步码的低电平时间
{
flag1=1; //如果是就让标志位变为1
}
else//排除干扰
{
k1 = 0;
TMR2=0;
time=0;
}
INTF=0;
}
}
/*显示子程序*/
void DigDisplay()
{
switch(cj_data)
{
case(0x000006E4)://1
x=1;break;
case(0x00006F0)://2
x=2;break;
case(0x000006E2)://3
x=3;break;
case(0x000006EA)://4
x=4;break;
default:break;
}
STB=1;
STB=0;
cmd(0x44);
delay(10);
shiwei=x/10;
gewei=x%10;
cmd(0xC4); //十位
send(table1[shiwei]);
cmd(0xC6); //个位
send(table1[gewei]);
cmd(0xC0);//千
send(0x00);
cmd(0xC2); //百
send(0x00);
cmd(0x8f);
STB=1;
}
同步码采集
0采集
1采集