OpenEdv-开源电子网

标题: 位定义问题 [打印本页]

作者: lin111000713    时间: 2013-7-17 00:12
标题: 位定义问题

各位大神好,以下程序用于输入捕获,为什么刚开始的时候我没有位定义即没有定义sbit T0 = P3^2;  直接用位去判断  while(1 == P3^2) 程序会停在这里,但是当我改为位定义的时候就可以了,不会程序不会停在这里     


 

/*******************************************************
* 函数名称:TIMER_Capture
* 功    能:输入捕获,捕获高电平时间,也可以转换成频率
* 入口参数:无
* 出口参数:freq:返回输入T0(P3^2)的频率值,也可以不计算,
*   省略掉freq = 1000000.0/freq/2+0.5; 返回值就是捕获的时间
* 范    例:frequent = TIMER_Capture(); 
* 说    明:如果要改变定时时间只要改变i的值即可  
* 其    他:已经经过测试成功
*******************************************************/
sbit T0 = P3^2;
unsigned int TIMER_Capture(void)
{
 unsigned int freq = 0;

 TMOD = 0x09;  //T0初始化,T0工作于方式1、定时、GATE置1

  TL0 = 0x00;
 TH0 = 0x00;

    while(1 == T0);   //这里要用位定义的形式,实验成功了。但是用while(1 == P3^2)程序会停在这里??就这个地方不知道什么原因求大神指点
 while(T0 == 0);   //等待 升高
 TR0 = 1;     //启动计数器

 while(T0 == 1);  //等待 下降
 TR0 = 0;    //停止计数器

 freq = 256*TH0 + TL0;  //计算计数时间  这里返回的是捕获的时间12M单片机定时器12分频:单位us
 freq = 1000000.0/freq/2+0.5; //经过计算转换成频率值,这里+0.5是因为计算机采用只舍不入
 
 return freq;
}



 

 


作者: xouou_53320    时间: 2013-7-17 09:14
这是语法上基本规定
要先声明,才能生成对应的指令

51定义了位之后,对位赋值只需要一条指令clr 或者setB
普通的堆栈操作用move指令的
没有aaa=P3^2这种操作方式




欢迎光临 OpenEdv-开源电子网 (https://www.openedv.com/) Powered by Discuz! X3.4