学习51单片机有感

这里有专门的一个

 定义特殊功能寄存器的位变量。

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值