微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 学习51单片机有感

学习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 ;}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top