单片机的程序设计
int xdata *numtab; /* 指向xdata 区域的 int */
由于存储器类型在编译时已经确定,通用指针中用来表示存 储器类型的字节就不再需要了。
指向idata,data,bdata和pdata的存储器指针使用一个字节 来保存;
指向code和xdata的存储器指针用两个字节来保存。
(1)数据类型
ANSI C没有, 下面解释。
1)bit 类型。内部RAM16个位寻址区,最多只能声 明128个位变量。
2)sbit 类型。特殊功能寄存器SFR中的位,如PSW 的各位。
3)sfr 类型。特殊功能寄存器SFR。如PSW。 4)sfr16 类型。两个8位的SFR作为一个16位的SFR
由此可见,使用存储器指针比通用指针效率要高,速度要快 。当然,存储器指针的使用不是很方便。只有在所指向目标 的存储空间明确并不会变化的情况下,才用它。
(5)函数
1)重入函数 在一个基本函数的基础上添加reentrant说明,从而使它具有重入特性
。如:
int calc (char i, int b) reentrant
;低字节跟着高字节;低字节地址用作 sfr16声明 的地址。如TL0、TH0。
这些类型不是标准的C语言,不能用指针进行访问
(2)存储器类型
51特点:ROM和RAM哈佛结构;SFR与RAM统一编 址。
针对存储空间的多样性,提出了修饰存储空间的修 饰符,用以指明所定义的变量应分配在什么样的存 储空间,如表5-2所示。
5.3.3 C语言程序设计
1 顺序结构 2 选择结构
(1) if 语句 if 、if else及if else if else。
(2) switch-case 语句 3 循环结构
while、do while 及for 4 转移语句
goto、break、continue 和return。
5.3.4 80C51功能单元的C语言编程
移植性都好;
而使用汇编语言,则可以更为充分地利用芯片的软 、硬件资源,使得程序代码的执行效率高。
为了发挥C语言与汇编语言两种语言各自的优势, 希望能够实现它们的混合编程。
这一点特别适用于要求占用空间小、有严格时间限 制的子程序设计,这类子程序总是希望用汇编语言 来编写,然后由C 语言主程序来调用。
(1)数字0~9的非压缩BCD码 +48(30H)即为ASCII码;
(2)查表法。
17
5.3 C语言及其程序设计
5.3.1 Keil C语言
1、概述
在Keil C语言的软件包中,包含①C51编译器,②A51宏汇编 器,③BL51连接/定位器,④LIB51库管理器
如图5-10所示
2、Keil C对ANSI C的扩展
unsigned long xdata array[100];
float idata x,y,z;
unsigned int pdata dimension;
unsigned char xdata vector[10][4][4];
char bdata flags;
如果在变量的定义中,没有包括存储器类型,将自动选用默 认的存储器类型。
11
开始 取数,A←(30H)
Y A←64H
A为负数? N
A=0? N
A←X+2
A←|X|
存数,(31H)←A(30H) 结束
12
参考程序
13
LIBU5_3多字节二进制整数转换成压缩的BCD码
单字节二进制数转BCD码可用DIV指令除以64H (100)、除以0AH(10)的方法得到。但多字节二进 制数不行。
为AAH,而非170D。
14
R2R3:待转换的二进制数。 R4R5R6:存放压缩的BCD码。
注意: 每一步CY均 有可能变化 此CY非彼CY
CY
R2
R3
R6*2+CY R6 DA
R5*2+CY R5 DA
循 环 n R4*2+CY 次
R4
DA
15
转换程序,如有时间学生上来演示BINBCD.ASM
16
实验二:BCD码转换成ASCII码
将本人的班号学号以压缩 BCD码的形式由低到高存 放在50H开始的单元中, 如0805094101。将 0150H、4151H、 0952H、0553H、 0854H。然后编程将 50H~54H中压缩的BCD 码转换成ASCII码,并由 低到高存放在60H开始的 单元中。
1对应于定时器0中断;
2对应于外部中断1;
3对应于定时器1中断;
4对应于串行口中断;
其它为预留。
从定义中可以看出,中断的函数必须是无参数、无返回值的函数。如:
unsigned int interruptcnt; unsigned char second;
void timer0 (void) interrupt 1 using 2
char *s; /* string ptr */ int *numptr; /* int ptr */ 通用指针很方便,但是也很慢。在所指向目标的存
储空间不明确的情况下,它们用的最多。
2)存储器指针
在定义时要包含一;
/* 指向data 区域的字符串 */
{
if (++interruptcnt == 4000) /* 计数到 4000 */
{
second++;
/* 秒计数器 */
interruptcnt = 0; /* 清除中断计数器 */
}
}
5.3.2 C与汇编的混合编程(简单介绍)
C语言编程与汇编语言编程各有所长。 使用C语言,开发速度快,可读性、可维护性、可
(1)EQU:赋值。给变量标号赋予一个确定的数值。
TTY EQU 1080H
MOV DPTR,TTY
(2)DL:定义标号值(与EQU区别:可对同一标号多次赋值)
COUNT
DL
2300H
COUNT
DL
2300H+1
(3)DB:定义数据字节。把数据以字节数的形式存放在存储器 单元中。
MMM DB 0EH,0B1H,0BH,70H,5H,0A4H,1DH,14H (4)DW:定义数据字。按字的形式把数据存放在存储单元中。 (5)DS:定义存储区。从指定的地址单元开始,保留一定数量
将多字节二进制数依次带进位左移到结果单元中。每 次左移后,结果单元内容*2+CY二十调整结果单 元内容。
如AAH=10101010B=1*2^7+0*2^6+1*2^5 +0*2^4+1*2^3+0*2^2+1*2^1+0*2^0,在相加的 过程中不断地进行二十调整,最终得170
在此相加过程中,不进行二十调整的后果是什么?仍
(3)存储模式
在C51编译器中,可以在命令行用SMALL,COMPACT和LARGE参数定义 存储模式。存储模式决定了默认的存储器类型。
1)小(SMALL)模式 所有变量都默认定义在内部RAM中。与data类型定义变量等价。特点:
变量访问快速。问题:堆栈空间面临溢出。如果内部RAM能放下,则这 种模式最佳。 2)紧凑(COMPACT)模式 所有变量都默认存放在外部数据存储器的一页中。与pdata显式定义变 量等价。最多256字节的变量。不如SMALL模式高效,但比LARGE模式 要快。 3)大(LARGE)模式 所有的变量都默认在外部存储器(xdata)中。与xdata显式定义变量等 价。此数据访问类型比SMALL和COMPACT模式需要更多的代码。
{ int x;
x = table [i];
return (x * b);}
2)函数使用指定的寄存器组 using n
函数使用指定寄存器组的定义性说明如下:
viod 函数标识符(形参表)using n
其中 n=0~3为寄存器组号,对应51中的四个寄存器组。
3)函数使用指定的存储模式
存储模式为本函数的参数和局部变量指定的存储空间,在指定了存储模 式之后,该空间将再也不随编译模式而变。如:
一般情况下,应该使用SMALL模式。在定义变量时,最好要指定存储器 类型。只有当应用不可能在SMALL模式下操作时,才需要往上增加存储 模式。
(4)指针
C51编译器支持通用和存储器两种类型指针 1)通用指针 指针的声明和标准C语言一样。需要三个字节来存
储:第一个字节用是存储器类型,第二个字节是指 针的高字节,第三字节是指针的低字节。
第五章 80C51单片机的程序设计
要点及重点:顺序结构程序、选择结构程 序、循环结构程序、子程序、中断服务程 序
1
5.1 概 述
按照语言的结构及其功能计算机语言可以分为 三种:
(1)机器语言:机器语言是用二进制代码0和 1表示指令和数据的最原始的程序设计语言。
(2)汇编语言:在汇编语言中,指令用助记 符表示,地址、操作数可用标号、符号地址及 字符等形式来描述。
(3)宏指令:用以代替汇编语言源程序中重 复使用的程序段的一种语句,汇编时产生相应 的目标代码。
3
汇编语言组成
汇编语言源程序是由汇编语句(即指令) 组成的。汇编语言一般由四部分组成。 其典型的汇编语句格式如下:
标号: 操作码 操作数
START: MOV
A,30H
;注释 ;A←(30H)
4
伪指令:P137
7
典型程序 七段码显示器
LIBU5_1查表程序
8
P226表7-1
9
让学生演示程序 LED1并解释
10
LIBU5_2
设X存在30H单元中,根据下式
X+2 X>0