学习51单片机有感
时间:11-19
来源:互联网
点击:
这里有专门的一个
定义特殊功能寄存器的位变量。
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// 包含51单片机寄存器定义的头文件unsigned int beforeFlag = 0,afterFlag = 0;sbit Signal = P1^1;void beforeHalf(void) interrupt 1 using 1{beforeFlag++;TR1 = 1;//open oppsiteTR0 = 0;// close myselfTL0 = 0x06;//250 us}void afterHalf(void) interrupt 3 using 2 //这里的中断号不能乱写哦,0-4..。后面都是空的没用{afterFlag++;TR0 = 1;//open oppsiteTR1 = 0;// close myselfTH0 = 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 ;}
51单片机寄存器位变 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)