❶ 单片机Keil C51 C语言多文件如何使用全局位变量跪拜!!
extern就可以。在一个文件里定义:
bdata m;
sbit x=m^1;
然后在另一个文件里声明:
extern bdata m;(如果不使用m可以不声明。)
extern bit x;
这样就可以使用了。如果变量较多,建议楼上的方法,用全局头文件。
❷ 51单片机中位地址和位变量是什么意思呢
位地址是指可以对某些寄存器或存储器的某一位直接操作,这时这些寄存器的某一位都有一个地址,就叫位地址。编程时用不到位地址,直接写该位的名称即可,如 C语言编程直接写TR0=1,TR0=0,EA=0等 汇编语言写SET B P1.0 CLR EX0. TR0 EA P1.0 等即是特殊功能寄存器中的某一位,是位变量。
位变量一位二进制变量,如bit A 结果只能 是1或0,当然它是保存在可位寻址的存储器区域
如R0 到 R7中的某一位。
❸ 单片机中怎么声明位变量就是仅有一位的变量那种,是bit a吗
是的,对于C51单片机来说,以下有以下类型变量:
bit a 1位
unsigned char a,或者char a 8位
unsigned short a 或者 short a 16位
unsigned long a或者 long a 32位
unsigned int a 或者 int a 16位,注意,int是与编译器有关的,对于 C51,int等效于short
float 或者 double 对于 51来说,都是一样的,32位。
❹ 51单片机如何设置数组变量
因为,51单片机的位地址,只能直接寻址,不能间接寻址。
所以,51单片机的位地址,就不能用数组来进行操作。
不过,可以利用逻辑运算,进行位操作。
先定义一个数组:a[8] = [128, 64,...8, 4, 2, 1];
然后:P1 |= a[3]; ,这就是令 P1.3 置一。
其实,采用数组的方法,并非是最简单的。
直接:P1 |= (1 << 3); ,就可以了。
❺ 51单片机c语言编程能给位赋值么
C语言中不能直接给二进制某一位赋值
但是可以通过按位操作来实现
如果你的P3是整型或者字符型的变量,可以通过“按位或”对某一位赋1,通过“按位与”对某一位赋0
P3=P3|0x40;//这样就是在不改变其他位的同时给第6位赋1
0x40转换成二进制位01000000
假如:P3的值为10110010
10110010
| 01000000
结果为 11110010
❻ 51单片机有没有位变量
51有位操作指令,自然有位变量。
有些单片机没有为变量,不过可以通过构建位域来实现位操作。或者是直接用C的位运算符实现。
###################################################################
51单片机中有可位寻址区,位变量就是定义在这一存储区。在汇编里要指定地址,C中只要在定义变量的时候使用idata关键字就可以定义了。
❼ 51单片机变量 51的单片机变量是怎么个定义法。全局变量,局部变量都放在什么存储器里的
不能这样定义,这样定义是错的。你这个是赋值,不是定义在0x22单元格里。
unsigned char bdata SS _at_ 0x22;
只有在Keil编译环境下才可以这样使用。还有,这种语法不适合用C语言,我说的是不适合,不是不能用。C语言里面的指针就是针对这个的,不建议使用 _at_ 进行变量在RAM中固定,这样对程序编译优化时,带来很多麻烦,也得不到充分的优化。
其实用C语言指针的方法是可行的。
bdata区虽然有自己独立的位地址,但你用的是char型 ,是一个字节的,所以你说的0x22只是bdata区的字节地址,而不是位地址,那麽用C语言的方式实现 就是这样:
unsigned char *p;
p=0x22;
*p=50;
*p 表示指向0x22所在的单元格,就是将50赋值到0x22地址所指向的单元格里。
再从另一个角度讲,如果你没于传参或改变实参的情况下,不建议使用这类,即使有,也不是很建议。因为单片机高手是不会用_at_这类关键字进行变量定位的。
有什么疑问可以一起探讨。
希望我的回答对你有帮助,谢谢。
❽ 51单片机如何设置同一个按键,按一下显示123456,再按一下显示321456
51单片机用一个按键,定义一个位变量,或一个8位的变量,按一下键变量为1,再按一下变量为0。然后显示时,再根据变量值来决定显示内容,变量为1,显示123456,变量为0显示321456。
❾ 51单片机C语言里面,定义bit的方法,有哪些,请举例,谢谢!
一共可以定义16个字节的位寻址变量
static uchar bdata CanBusFlag=0; //can标志
sbit CanRcv_Good=CanBusFlag^0; //成功接收标志
sbit CanSend_Good=CanBusFlag^1; //成功发送标志
sbit CanErrFlag=CanBusFlag^2; //can总线错误标志
sbit CanDtOverFlag=CanBusFlag^3; //can总线超载标志
sbit CanWuiFlag=CanBusFlag^4; //can总线唤醒中断
//你改变CanBusFlag,下面的一堆变量也变了,反之既然
定义:
union UniTEMP // 温度采样值
{
uint TEMP;
uchar TEMP_AD[2];
}idata uTEMP; //idata是定义变量存储空间,这里用的8952单片机,有idata空间
。。。。
程序里面使用:
uTEMP.TEMP=XXX;//其实TEMP_AD[2]数组里面的内容也变了,union 结构嘛
如果你只定义8个位,就用第一种方式。
union 结构是为了方便大数据的操作才使用的。如果你要用union 定义一个8位变量的每一位,想应该可以吧。不过不知道符不符合C语法,编一个试试吧~哈哈
❿ 51单片机定义变量地址
你说的这个应该是ADC几个控制寄存器的地址,这样
宏定义
之后操作起来就方便很多了,具体这些地址是哪个寄存器的,你要看看芯片手册了,这里0x80是ADC
电源控制
位,0x10是ADC转换结束标志位,0x08是ADC转换启动控制位。