unsigned char bdata ib; //在可位录址区定义ucsigned char类型的变量ib
int bdata ab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象
sbit ib7=ib^7 //用关键字sbit定义位变量来独立访问可寻址位对象的其中一位
sbit ab12=ab[1]^12;
操作符^后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31。
下面我们用上一课的电路来实践一下这一课的知识。同样是做一下简单的跑马灯实验,项目名为RunLED2。程序如下:
sfr P1 = 0x90; //这里没有使用预定义文件,
sbit P1_0 = P1 ^ 0; //而是自己定义特殊寄存器
sbit P1_7 = 0x90 ^ 7; //之前我们使用的预定义文件其实就是这个作用
sbit P1_1 = 0x91; //这里分别定义P1端口和P10,P11,P17引脚
void main(void)
{
unsigned int a;
unsigned char b;
do{
for (a=0;a50000;a++)
P1_0 = 0; //点亮P1_0
for (a=0;a50000;a++)
P1_7 = 0; //点亮P1_7
for (b=0;b255;b++)
{
for (a=0;a10000;a++)
P1 = b; //用b的值来做跑马灯的花样
}
P1 = 255; //熄灭P1上的LED
for (b=0;b255;b++)
{
for (a=0;a10000;a++) //P1_1闪烁
P1_1 = 0;
for (a=0;a10000;a++)
P1_1 = 1;
}
}while(1);
}
. Keil c51指针变量
单片机c语言支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer).
1. 1. 一般指针
一般指针的声明和使用均与标准C相同,不过同时还能说明指针的存储类型,例如:
long * state;为一个指向long型整数的指针,而state本身则依存储模式存放。
char * xdata ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。
一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。
2. 2. 存储器指针
基于存储器的指针说明时即指定了存贮类型,例如:
char data * str;str指向data区中char型数据
int xdata * pow; pow指向外部RAM的int型整数。
这种指针存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。
3. 3. 指针转换
即指针在上两种类型之间转化:
l 当基于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动转化。
l 如果不说明外部函数原形,基于存储器的指针自动转化为一般指针,导致错误,因而请用“#include”说明所有函数原形。
l 能强行改变指针类型。
变量的存储类别
一、static(静态局部)变量。
1、静态局部变量在程序整个运行期间都不会释放内存。
2、对于静态局部变量,是在编译的时候赋初值的,即只赋值一次。如果在程序运行时已经有初值,则以后每次调用的时候不再重新赋值。
3、如果定义局部变量的时候不赋值,则编译的时候自动赋值为0。而对于自动变量而言,定义的时候不赋值,则是一个不确定的值。
4、虽然静态变量在函数调用结束后仍然存在,但是其他函数不能引用。
二、用extern声明外部变量。
用extern声明外部变量,是为了扩展外部变量的作用范围。比如一个程序能由多个源程序文件组成。如果一个程序中需要引用另外一个文件中已经定义的外部变量,就需要使用extern来声明。
正确的做法是在一个文件中定义外部变量,而在另外一个文件中使用extern对该变量作外部变量声明。
一个文件中: int abc;
另外一个文件中: extern abc;
例子:
用extern将外部变量的作用域扩展到其他文件:
文件1:
//用extern将外部变量的作用域扩展到其他文件中
#include
#include
#include
unsigned int array[10];
void fillarray();
void init_ser()
{
SCON=0X50;
TMOD|=0X20;
TH1=0XF3;
TR1=1;
TI=1;
}
void main()
{
unsigned int i;
init_ser();
fillarray();
for(i=0;i10;i++)
{
printf(array[%d]=%dn,i,array[i]);
}
for(;;){;}
}
文件2:
extern int array[10];
void fillarray()
{
unsigned char i;
for(i=0;i10;i++)
{
array[i]=i;
}
}
在单片机c语言中变量的空间分配几个方法
1、 data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。
2、 data区内最好放局部变量。
因为局部变量的空间是能覆盖的某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),能提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;
3、 确保你的程序中没有未调用的函数。
在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点Keil C做得很愚蠢,但也没办法。
4、 程序中遇到的逻辑标志变量能定义到bdata中,能大大降低内存占用空间。
在51系列