这里有专门的一个
定义特殊功能寄存器的位变量。
bit和sbit都是C51扩展的变量类型。
典型应用是:sbit P0_0=P0^0;//即定义P0_0为P0口的第1位,以便进行位操作。
利用异或操作取位,进行,,,,,,
在设置定时器的时候发现下列的代码
THO = (65536 - 5000)/256;//赋值高8位
TLO = (65536 - 5000)%256;//赋值低8位
你说这与直接将65536 - 5000 赋予寄存器 有什么区别,这样有什么好处?怎么有种脱了裤子放屁的感觉,----后来了解到原来是两个8位寄存器合成的,怪不得要分别赋值。
//产生 3:1的脉冲 灯亮1s 熄灭3s 交替相间
#include<reg51.h> // 包含51单片机寄存器定义的头文件
unsigned int beforeFlag = 0,afterFlag = 0;
sbit Signal = P1^1;
void beforeHalf(void) interrupt 1 using 1
{
beforeFlag++;
TR1 = 1;//open oppsite
TR0 = 0;// close myself
TL0 = 0x06;//250 us
}
void afterHalf(void) interrupt 3 using 2 //这里的中断号不能乱写哦,0-4..。后面都是空的没用
{
afterFlag++;
TR0 = 1;//open oppsite
TR1 = 0;// close myself
TH0 = 0x06;//250 us
}
void main(void)
{
Signal = 1;
TMOD = 0x03;//我们在这里使用两个定时器形如TMOD = 0x11并不可行。这样的话,中断从未被激活。调试器里的statue 一直增加,(本子上)》》》?????
EA = 1;
ET0 = 1;
ET1 = 1;
TH0 = 0x6;
TL0 = 0x6;
TR0 = 1;
TR1 = 1;//这两句赋值后 TL和TH会发生改变 (因为是片内定时,所以一打开便开始计时)
while(1){
if(beforeFlag == 12000)//3s
{
Signal = ~Signal;//在这里我们发现使用Signal = 0;然后下面的使用 Signal = 1并不可行,调试发现一个beforeFlag++的定时器 一直都未关过(虽然上面有关的语句TR1 = 0;),这是为什么呢?(本子上测试通过,用的是3版本的)
beforeFlag = 0;
}
if(afterFlag == 4000)//1s
{
Signal = ~Signal;
afterFlag = 0;
}
}
return ;
}