C语言关键字用法

sbit:定义特殊功能寄存器的位变量,如:sbit P0_0=P0^0;//即定义P0_0为P0口的第1位
sfr:可以对51内部的寄存器进行定义,定义格式:sfr 变量名=变量地址。你打开reg51.h,里面的寄存器都是用sfr进行定义的
interrupt:中断的意思。
code:程序存储区。如定义一个数组uchar ad_data[],即把数组定义在RAM中,uchar code ad_data[],就把数组定义在rom中了
各类型长度:
 
  

unsigned char is 8 bit

signed char is 8 bit

unsigned short is 16 bit

signed short is 16 bit

unsigned int is 32 bit

signed int is 32 bit

float fp32 is 32 bit

double fp64 is 64 bit

unsigned long is 32 bit

-> 的用法
->在C语言中称为间接引用运算符,是二目运算符,优先级同成员运算符“.”。
用法:
p->a,其中p是指向一个结构体的指针,a是这个结构体类型的一个成员。表达式p->a引用了指针p指向的结构体的成员a。
例如:
struct T
{
 int a;
 char b;
}s;

struct T* p=&s;
那么,
p->a相当于s.a。
显然,有个等价写法:(*p).a,和p->a完全等效。
PX口的三个寄存器用法、
 
  

PxDIR是msp430单片机IO口的方向控制寄存器,

当把某一位置0时,此时次端口为输入模式, 

当把某一位置1时,此时次端口为输出模式, 

1、当作为输出模式时,这是就可对其可读可写了,通过对其写,就可以控制外围模块了。

2、当作为输入模式时,只能读它的状态,不能对起写入数据。

而PxIN和PxOUT分别是输入数据和输出数据寄存器。 

程序应该先配置PxDIR为输入或输出才能对相应寄存器操作。

大家一定会想既然有了PxIN和PxOUT,为什么还要个PxDIR寄存器呢,直接对相应的寄存器操作就行了嘛,

我觉得是应为msp430单片机对输入输出的严格控制才这样设置的,

因为每一个端口在同一时间只能是输入或是输出状态的一种, 

然后在根据具体是设置成什么状态,才能对相应的寄存器进行操作,这样更能精确的控制端口。

波特率:

        模拟线路信号的速率,以波形每秒的振荡数来衡量。如果数据不压缩,波特率等于每秒钟传输的数据位数,如果数据进行了压缩,那么每秒钟传输的数据位数通常大于调制速率,使得交换使用波特和比特/秒偶尔会产生错误。
在 信息传输通道中,携带数据信息的 信号单元叫 码元,每秒钟通过 信道传输的码元数称为码元 传输速率,简称波特率。 波特率是指数据 信号对 载波的 调制速率,它用单位时间内载波调制状态改变的次数来表示(也就是每秒调制的符号数),其单位是波特(Baud,symbol/s)。 波特率是传输通道 频宽的指标。
每秒钟通过信道传输的信息量称为位 传输速率,也就是每秒钟传送的二进制位数,简称 比特率。 比特率表示有效数据的 传输速率,用b/s 、bit/s、比特/秒,读作:比特每秒。
波特率与 比特率 的关系也可换算成:比特率=波特率*单个调制状态对应的二进制位数
例如假设数据传送速率为120符号/秒(symbol/s)(也就是波特率为120Baud),又假设每一个符号为8位(bit)即八相调制(单个调制状态对应3个二进制位),则其传送的 比特率为(120symbol/s) * (3bit/symbol)=360bps.
vsprintf
vsprintf() 中的 arg 参数位于数组中。数组的元素会被插入主字符串的百分比 (%) 符号处。该函数是逐步执行的。在第一个 % 符号中,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。
函数名: vsprintf
返回值: 正常情况下返回生成字串的长度(除去\0),错误情况返回负值
用 法: int vsprintf(char *string, char *format, va_list param);
// 将param 按格式format写入字符串string中
注: 该函数会出现 内存溢出情况,建议使用vsnprintf
#include 
#include
char buffer[80];
int vspf(char *fmt, ...)
{
va_list argptr;
int cnt;
va_start(argptr, fmt);
cnt = vsprintf(buffer, fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber = 30;
float fnumber = 90.0;
char string[4] = "abc";
vspf("%d %f %s", inumber, fnumber, string);
printf("%s\n", buffer);
return 0;
}

输出结果为: 30 90.000000 abc
VA_LIST的用法( VA_LIST 是在C语言中解决 变参问题的一组宏):
(1)首先在函数里定义一个VA_LIST型的变量,这个变量是指向参数的 指针
(2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,这个宏的第二个
参数是第一个可变参数的前一个参数,是一个固定的参数。(如在运行VA_START
(ap,v)以后,ap指向第一个可变参数在 堆栈的地址。)
(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型。
(4)最后用VA_END宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。
如果函数有多个可变参数的,依次调用VA_ARG获取各个参数。

&的用法

在C语言中,&有三种作用,分别如下:

1. 取地址。单目运算符。用来取一个变量的地址。

比如

 
     
int i, *p;
    p = &i;//这里的&作用是取变量i的地址。

 
     

2. 位操作中的与操作运算符。

也就是常说的and操作,双目运算符。 

计算的时候按位计算,&两边操作数对应位上全为1时,结果的该位值为1。否则该位值为0

比如

0x12&0x23 转为二进制为:

B00010010&B00100011,

按位计算结果为B00000010,

即结果为0x02。


3. 当两个&&一起用的时候,表示为逻辑运算中的与运算。

逻辑运算结果只有0和1两种结果。 

一般在&&两边是两个逻辑表达式。

当两个表达式值均为1时,&&运算结果为1,否则为0。

比如

2>1 && 0<1 这个的值为1&&1 = 1。

1>2 && 2>0 这个值为0&&1 = 0。

1>2 && 2>3 这个值为0&&0=0。

 
  
 
  
 
   
  
 
 

你可能感兴趣的:(51单片机)