注:资料来源网络,两年前整理的笔记。
一、 KEIL uVision2 C51编译器所支持的数据类型:
数据类型 |
长 度 |
值 域 |
unsigned char |
单字节 |
0~255 |
signed char |
单字节 |
-128~+127 |
unsigned int |
双字节 |
0~65535 |
signed int |
双字节 |
-32768~+32767 |
unsigned long |
四字节 |
0~4294967295 |
signed long |
四字节 |
-2147483648~+2147483647 |
float |
四字节 |
±1.175494E-38~±3.402823E+38 |
* |
1~3字节 |
对象的地址 |
bit |
位 |
0或1 |
sfr |
单字节 |
0~255 |
sfr16 |
双字节 |
0~65535 |
sbit |
位 |
0或1 |
4. float浮点型 float浮点型在十进制中具有7位有效数字,是符合IEEE-754标准的单精度浮点型数据,占用四个字节。
5.* 指针型 指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不同的处理器长度也不尽相同,在C51中它的长度一般为1~3个字节。指针变量也具有类型。
6. bit位标量 bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。
7. sfr特殊功能寄存器 sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1 = 0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。
8.sfr16 16位特殊功能寄存器 sfr16占用两个内存单元,值域为0~65535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,好定时器T0和T1。 9. sbit可录址位 sbit同位是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。如先前我们定义了 sfr P1 = 0x90; //因P1端口的寄存器是可位寻址的,所以我们可以定义 sbit P1_1 = P1^1; //P1_1为P1中的P1.1引脚 //同样我们可以用P1.1的地址去写,如sbit P1_1 = 0x91; 这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。通常这些可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字,直接引用可以省去一点时间,您也可以自己写自己的定义文件。
二、转义字符:
转义字符 |
含义 |
ASCII码(16/10进制) |
\o |
空字符(NULL) |
00H/0 |
\n |
换行符(LF) |
0AH/10 |
\r |
回车符(CR) |
0DH/13 |
\t |
水平制表符(HT) |
09H/9 |
\b |
退格符(BS) |
08H/8 |
\f |
换页符(FF) |
0CH/12 |
\' |
单引号 |
27H/39 |
\" |
双引号 |
22H/34 |
\\ |
反斜杠 |
5CH/92 |
三、存储器类型:
存储器类型 |
说 明 |
data |
直接访问内部数据存储器(128字节),访问速度最快 |
bdata |
可位寻址内部数据存储器(16字节),允许位与字节混合访问 |
idata |
间接访问内部数据存储器(256字节),允许访问全部内部地址 |
pdata |
分页访问外部数据存储器(256字节),用MOVX @Ri指令访问 |
xdata |
外部数据存储器(64KB),用MOVX @DPTR指令访问 |
code |
程序存储器(64KB),用MOVC @A+DPTR指令访问 |
四、程序注释:
函数开头的注释内容:函数名称、功能、说明 输入、返回、函数描述、流程处理、全局变量、调用样例等,复杂的函数需要加上变量用途说明。
- 注释
- /*********************************************************************
- *
- * 函 数 名: v_LcdInit
- * 功能描述: LCD初始化
- * 函数说明: 初始化命令:0x3c, 0x08, 0x01, 0x06, 0x10, 0x0c
- * 调用函数: v_Delaymsec(),v_LcdCmd()
- * 全局变量:
- * 输 入: 无
- * 返 回: 无
- * 设 计 者:zhao 日期:2001-12-09
- * 修 改 者:zhao 日期:2001-12-09
- * 版 本:
- ***********************************************************************/
五、命名:
命名必须具有一定的实际意义。
1、常量的命名:全部用大写。
2、变量的命名: 变量名加前缀,前缀反映变量的数据类型,用小写,反映变量意义的第一个字母大写,其他小写。 其中变量数据类型: unsigned char 前缀 uc signed char 前缀 sc unsigned int 前缀 ui signed int 前缀 si unsigned long 前缀 ul signed long 前缀 sl bit 前缀 b 指针 前缀 p
例:ucReceivData 接收数据 3、结构体命名:
4、函数的命名: 函数名首字大写,若包含有两个单词的每个单词首字母大写。 函数原型说明包括:引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模块名及文件名, 内部函数,只要注释其定义文件名;
六、编辑风格
1、缩进:缩进以 Tab 为单位,一个 Tab 为四个空格大小。预处理语句、全局数据、函数原型、标题、附加说明、函数说明、标号等均顶格书写。语句块的“{”“}”配对对齐,并与其前一行对齐;
2、空格:数据和函数在其类型,修饰名称之间适当空格并据情况对齐。关键字原则上空一格,如: if ( ... ) 等,运算符的空格规定如下:“->”、“[”、“]”、“++”、“--”、“~”、“!”、“+”、“-”(指正负号),“&”(取址或引用)、“*”(指使用指针时)等几个运算符两边不空格(其中单目运算符系指与操作数相连的一边),其它运算符(包括大多数二目运算符和三目运算符“?:”两边均空一格,“(”、“)”运算符在其内侧空一格,在作函数定义时还可据情况多空或不空格来对齐,但在函数实现时可以不用。“,”运算符只在其后空一格,需对齐时也可不空或多空格,对语句行后加的注释应用适当空格与语句隔开并尽可能对齐。
3、对齐:原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。另每一行的长度不应超过屏幕太多,必要时适当换行,换行时尽可能在“,”处或运算符处,换行后最好以运算符打头,并且以下各行均以该语句首行缩进,但该语句仍以首行的缩进为准,即如其下一行为“{”应与首行对齐。
4、空行:程序文件结构各部分之间空两行,若不必要也可只空一行,各函数实现之间一般空两行
5、修改:版本封存以后的修改一定要将老语句用/* */ 封闭,不能自行删除或修改,并要在文件及函数的修改记录中加以记录。
6、形参:在定义函数时,在函数名后面括号中直接进行形式参数说明,不再另行说明。
*********************************************************************************************
分割线
*********************************************************************************************
七、流水灯系统硬件图:

八、串口和max232
1、max232电平转换芯片

2、串口实物图

3、串口通信硬件连接原理图:

3、串口通信:
- #include <AT89X51.H>
- #include <stdio.h>
- void main(void)
- {
- SCON = 0x50; //串口方式1,允许接收
- TMOD = 0x20; //定时器1定时方式2
- TCON = 0x40; //设定时器1开始计数
- TH1 = 0xE8; //11.0592MHz 1200波特率
- TL1 = 0xE8;
- TI = 1;
- TR1 = 1; //启动定时器
- while(1)
- {
- printf ("Hello World!\n"); //显示Hello World
- }
- }

|