KEIL C51的应用
? C语言是一种编译型程序设计语言,它兼顾
了多种高级语言的特点,并具备汇编语言
的功能。目前,使用 C语言进行程序设计已
经成为软件开发的一个主流。用 C语言开发
系统可以大大缩短开发周期,明显增强程
序的可读性,便于改进和扩充。而针对 8051
的 C语言日趋成熟,成为了专业化的实用高
级语言。
C语言作为一种非常方便的语言而得到广泛的支持,
国内最通用的是 Keil C51.
C语言程序本身不依赖于机器硬件系统,基本上不
作修改就可将程序从不同的单片机中移植过来。
C提供了很多数学函数并支持浮点运算,开发效率
高,故可缩短开发时间,增加程序可读性和可维护
性。
㈠ C-51的特点
C-51与 ASM-51相比,有如下优点:
1,对单片机的指令系统不要求了解,仅要求对
8051 的存贮器结构有初步了解;
2,寄存器分配、不同存贮器的寻址及数据类型
等细节可由编译器管理;
3,程序有规范的结构,可分成不同的函数,这
种方式可使程序结构化;
4,具有将可变的选择与特殊操作组合在一起的
能力,改善了程序的可读性;
5,提供的库包含许多标准子程序,具有较强的
数据处理能力;
6,由于具有方便的模块化编程技术,使已编好
程序可容易地移植;
C51存储类型
存储类型 寻址空间 数据长度 值域范围
data 片内直接寻址
RAM
8 0~127
idata 片内间接寻址
RAM
8 0~255
pdata 分页寻址
片外 RAM
8 0~255
存储类型 寻址空间 数据长度 值域范围
xdata 片外数据存
储 ( 64K)
16 0~65535
code 片内统一编
址 ROM
( 64K)
16 0~65535
bdata 片内可位寻
址的 RAM
( 16byet)
1 0~127
? C51的数据声明的一般格式如下
? [类型说明符 ][修饰符 ] 标识符 [=初值 ]……
? 例如,unsigned char code Flag = 0x0f;
就是声明一个无符号的 char型变量 Flag,并给
他赋初值为 0x0f;并且声明他所在的存储空间
在片内统一编址的 ROM中。
? 声明中,如果没有修饰符,则数据默认的存
储空间为 data型,也就是在片内 RAM中。
㈡ C- 51的程序结构
与一般 C语言的结构相同,以 main()函数为程序人
口,程序体中包含若干语句还可以包含若干函数。
C- 51函数的一般格式
类型 函数名(参数表)
{
数据说明部分
语句执行部分
}
㈢ C- 51的数据类型
基本数据类型
类型 符号 关键字 数的表示范围所占位数









(signed) int 16 -32768~32767
(signed) short 16 -32768~32767
(signed) long 32 -2147483648~2147483647
16unsigned int 0~65535
32 0~4294967295unsigned long int
unsigned short int 16 0~65535
有 float 32 3.4e-38~3.4e38
有 double 64 1.7e-308~1.7e308
有 char 8 -128~127
无 unsigned char 8 0~255
C语言中的基本数据类型
类型 符号 关键字 数的表示范围所占位数









(signed) int 16 -32768~32767
(signed) short 16 -32768~32767
(signed) long 32 -2147483648~2147483647
16unsigned int 0~65535
32 0~4294967295unsigned long int
unsigned short int 16 0~65535
有 float 32 3.4e-38~3.4e38
有 double 64 1.7e-308~1.7e308
有 char 8 -128~127
无 unsigned char 8 0~255
㈢ (续 ) C- 51的数据类型 扩充定义
sfr:特殊功能寄存器 声明
sfr16:sfr的 16位数据声明
sbit:特殊功能位声明
bit:位变量声明
例,sfr SCON = 0X98;
sfr16 T2 = 0xCC;
sbit OV = PSW^2;
㈣ C-51数据的存储类型
名 存储空间位置 长度 数据范围
data 直接寻址片内 RAM 8位 0~ 255
bdata 可位寻址片内 RAM 1位 0/1
idata 间接寻址片内 RAM 8位 0~ 255
pdata 片外页 RAM 8位 0~ 255
xdata 片外 RAM 16位 0~ 65535
code 程序 ROM 16位 0~ 65535
㈣ C-51数据的存储类型 (续 )
例:
数据类型 存储类型 变量
char data var1;
bit data flags;
unsigned char xdata vextor[10];
㈣ 数据的存储类型
㈤ C-51的包含的头文件
通常有,reg51.h math.h ctype.h
stdio.h stdlib.h absacc.h
常用有,reg51.h (定义特殊功能寄存器和
位寄存器);
math.h (定义常用数学运算);
㈥ C-51的运算符
与 C语言基本相同:
+ - * / (加 减 乘 除)
> >= < <= (大于 大于等于 小于 小于等于)
== != (测试等于 测试不等于)
&& || ! (逻辑与 逻辑或 逻辑非 )
>> << (位右移 位左移)
& | (按位与 按位或 )
^ ~ (按位异或 按位取反 )
㈦ C-51的基本语句
与标准 C语言基本相同:
if 选择语言
switch/case 多分支选择语言
while 循环语言
do-while 循环语言
for 循环语言
㈧ 中断服务程序
函数名() interrupt n
{ }
㈨ I/O口定义
#include <absacc.h>
#define prot xbyte[0x1000]

用指针定义
例,清零程序 (将 2000H— 20FFH的内容清零 )
★ 汇编语言程序
ORG 0000H
SE01,MOV R0,#00H
MOV DPTR,#2000H ;(0000H)送 DPTR
LOO1,CLR A
MOVX @DPTR,A ;0送 (DPTR)
INC DPTR ;DPTR+1
INC R0 ;字节数加 1
CJNE R0,#00H,LOO1 ;不到 FF个字节再清
LOOP,SJMP LOOP
清零程序 (将 2000H— 20FFH的内容清零 )
★ C- 51程序
#include <reg51.h>
main( )
{
int i;
unsigned char xdata *p=0x2000;
/* 指针指向 2000H单元 */
for(i=0;i<256;i++)
{*p=0; p++;} /*清零 2000H-20FFH单元 */
}
★ 汇编语言程序
ORG 0000H
L00,MOV R0,#10H ;查找 16个字节
MOV R1,#00H
MOV DPTR,#2000H
L11,MOVX A,@DPTR
CJNE A,#00H,L16 ;取出内容与 00H相等吗?
INC R1 ;取出个数加 1
L16,INC DPTR
DJNZ R0,L11 ;未完继续
MOV DPTR,#2100H
MOV A,R1
MOVX @DPTR,A ;相同数个数送 2100H
L1E,SJMP L1E
例:查找零的个数 (在 2000H--200FH中查出有几个
字 节是零,把个数放在 2100H单元中)
★ 查找零的个数 C- 51程序
#include <reg51.h>
main ( )
{ unsigned char xdata *p=0x2000;/*指针 p指向 2000H单元 */
int n=0,i;
for(i=0;i<16;i++)
{ if(*p==0) n++; /* 若该单元内容为零,则 n+1 */
p++; /* 指针指向下一单元 */
}
p=0x2100; /* 指针 p指向 2100H单元 */
*p=n; /* 把个数放在 2100H单元中 */
}
KEIL的使用
? 掌握 KEIL工程的建立和软件的开发;
? 掌握 KEIL中软件仿真的基本应用;