单片机C51编程中bdata的问题
发布网友
发布时间:2023-07-17 00:00
我来回答
共1个回答
热心网友
时间:2024-01-20 06:46
在51中的位变量包含2类,一类是特殊功能寄存器中的可位寻址的位,比如EA,TR0等;这部分位在C中通过sbit来特殊声明,比如sbit Beep=P1^0; ;另一种即为bdata存储模式的位变量。
bdata是布尔变量的存储方式,表示位变量存储在位于单片机内部RAM字节地址0x20~0x2F的16个字节中,每个字节8位,共计16x8=128个可寻址位,位地址从0x00~0x7F。bdata所指只包含这个区域。
其实一般而言不用去特别声明位变量存储模式,比如bit bdata flag; ,在C51中普通的bit变量只能存放在bdata中,所以只需要bit flag这样去定义变量就行了。
关于bit型变量的应用,:
1、可以作为参数传递:比如
uchar test(bit flag)
{
if(flag)
{//传递来的是真则返回3,
return 3;
}
else
{//是假则返回2
return 2;
}
}
main()
{
uchar x;
bit flag = 1;
x = test(falg);
}
2、可以作为函数的返回值
bit test1(uchar a,uchar b)
{
if(a>b)
{//如果a>b则返回真,否则返回假
return 1;
}
else
{
return 0;
}
}
main()
{
bit flag;
flag = test1(2,3);
}
3、不能使用的场合:C51中没有位变量指针一说,比如 bit bdata *flag1;的定义就是非法的。位变量也不能定义位数组,比如 bit bdata flag[8]也不允许。
另外,返回值采用位变量有两种情况也是不允许的:一种是在函数中禁止使用中断时,第二则是函数中有类似using x这种寄存器组切换时。关于这两种情况我没验证过,没有感性认识,所以不能给你举例说明了,总之在使用中断时慎用返回位变量的函数。
bit变量应用最多的情况:执行一个函数,只是想知道操作是否成功,这时就可以用bit变量作为返回值,这样占用资源少,判断起来也快。当然,如果返回值是char型,判断速度上和bit型差不多,但如果是int型,由于是双字节,就要多花些时间了。