标题: 关于几个不理解的单片机红外光通信程序片段 [打印本页]
作者: 折花校尉 时间: 2019-9-18 20:22
标题: 关于几个不理解的单片机红外光通信程序片段
本人是单片机新手,最近做一个红外光通信的小项目,在网上查阅了相关资料,但其中有几段看不太懂,向各位大牛们求教。
程序中的注释不是我加到,是资料中已经加号的
程序片段一
void khz(uchar aa) //是发射38KHZ的程序
{
for(a=aa;a>0;a--) //这个for语句可以得到准确的26.3波特率
{
out=1;
i=7; //低了17us
while(i>0)i--; // 38kHZ
out=0;
//高了9us 17+9=26us 比26.3快一点点
}
}
这个程序完全看不懂啊,怎么就能产生38Khz的信号呢?
程序片段二
unsigned char KeyScan(void) //键盘扫描函数,使用行列逐级扫描法
{
unsigned char Val;
KeyPort=0xf0; //P1口高四位置高,低四位置低
if(KeyPort!=0xf0) //表示有按键按下
{
DelayMs(10); //延时去抖
if(KeyPort!=0xf0) //表示真的有按键按下
{
KeyPort=0xfe; //检测第一行
if(KeyPort!=0xfe)
{
Val=KeyPort&0xf0;
Val+=0x0e;
while(KeyPort!=0xfe);
DelayMs(10); //去抖
while(KeyPort!=0xfe);
return Val;
}
KeyPort=0xfd; //检测第二行
if(KeyPort!=0xfd)
{
Val=KeyPort&0xf0;
Val+=0x0d;
while(KeyPort!=0xfd);
DelayMs(10); //去抖
while(KeyPort!=0xfd);
return Val;
}
KeyPort=0xfb; //检测第三行
if(KeyPort!=0xfb)
{
Val=KeyPort&0xf0;
Val+=0x0b;
while(KeyPort!=0xfb);
DelayMs(10); //去抖
while(KeyPort!=0xfb);
return Val;
}
KeyPort=0xf7; //检测第四行
if(KeyPort!=0xf7)
{
Val=KeyPort&0xf0;
Val+=0x07;
while(KeyPort!=0xf7);
DelayMs(10); //去抖
while(KeyPort!=0xf7);
return Val;
}
}
}
return 0xff;
}
我知道这是一个键盘扫描函数,但我自学时看的是郭天祥书上的矩阵按键扫描实例程序,按照郭书上的思路来看,这段键盘扫描函数逻辑好混乱啊,看不懂干啥,请大牛们详细说明其工作逻辑流程吧
程序片段三
void delayms1(uchar aa)//延时程序
{
for(a=aa;a>0;a--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
我知道这是一个延时程序,_nop_()表示延时一个机器周期,这儿有八个_nop_();那就是延时了吧个机器周期,假如晶振用的12M的,这个函数就延时了12*8=96微秒但程序中却给出了如下参考时间,与我设想的不同,那请问这么一个函数真实情况下延时是多少呢?
//delayms(45);//0.642ms
//delayms(35);//0.502ms
//delayms(115);//1.623ms
//delayms(72);//1.02ms
//delayms(84);//1.188ms
//delayms(31);//0.446ms
程序片段四
void sieasdf() interrupt 0
{
EX0=0;
for(a=5;a>0;a--)
{
delayms(35);//延时0.5ms 判断5次 5*0.5=2.5ms
if(in) fleg=0;
}
if(fleg)
{
delayms(72);//延时1ms 判断是不是高电平了
if(in)
{
delayms(115);//延时让它超过2ms; 2.5+1+1.623=5.123ms 开始读数据
for(a=8;a>0;a--)
{
while(!in);
delayms(86);//延时1.188ms 判断IO高低,从而得0或1
num=num>>1;
if(in)
{
num=num|0x80;
delayms(31);//延时0.6ms 因为上面延时1.2ms+0.6 刚好跳过1.5ms
}
}
}
}
fleg=1;
EX0=1;
}
这段应该是通过外部中断,来进行相关解码的功能吧,但为什么连外部中断0的标志位IE0都没有看见,而且这儿函数整体的一个逻辑流程不理解(因为大部分语句单独拎出来看的懂,但组合在一起不知道在干啥)
作者: 折花校尉 时间: 2019-9-18 20:25
我承认自己水平真的很菜,请各位大佬轻喷
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |