• 沒有找到結果。

1.为什么要消除键盘的机械抖动?有哪些方法?

2.试说明非编码键盘的工作原理。如何判断键释放?

3.试述 A/D 转换器的种类和特点。

4.设计一个 2×2 的行列式键盘(同在 P1 口)电路并编写键扫描程序。

5.试设计一个 LED 显示器/键盘电路。

6.在一个 fosc 为 12MHz 的 89C52 系统中接有一片 ADC0809,它的地址为 7FFFH,试编写 ADC0809 初始化程序和定时采样特点 2 的程序(假设采样频率为 1ms/次,每次采样 4 个数据)。

7.试说明 TLC2543 的特点和与 89C52 的接口方式。

8.DAC0832 与 89C52 单片机连接时有哪些控制信号?其作用是什么?

9.在一个 89C52 单片机与 DAC0832 组成的应用系统中,DAC0832 的地址为 7FFFH,输 出电压为 0~5V。试编写产生矩形波,其波形占空比为 1:4,高电平时电压为 2.5V,低电平时 电压为 1.25V 的转换程序。

10.试说明 TLC5615 的特点。

ASCII(美国标准信息交换码)表

0 1 2 3 4 5 6 7

位 654→

位 3210↓ 000 001 010 011 100 101 110 111

0 0000 NUL DLE SP 0 @ P ` p

1 0001 SOH DC1 ! 1 A Q a q

2 0010 STX DC2 2 B R b r

3 0011 ETX DC3 # 3 C S c s

4 0100 EOT DC4 $ 4 D T d t

5 0101 ENQ NAK % 5 E U e u

6 0110 ACK SYN & 6 F V f v

7 0111 BEL ETB 7 G W g w

8 1000 BS CAN ( 8 H X h x

9 1001 HT EM ) 9 I Y i y

A 1010 LF SUB * : J Z j z

B 1011 VT ESC + ; K [ k {

C 1100 FF FS , < L \ l |

D 1101 CR GS = M ] m }

E 1110 SO RS . > N Ω n ~

F 1111 SI US / ? O o DEL

NUL FF 走纸控制 CAN 作废

SOH 标题开始 CR 回车 EM 纸尽

STX 正文开始 SO 移位输出 SUB

ETX 正文结束 SI 移位输入 ESC 换码

EOT 传输结果 DLE 数据链换码 FS 文字分隔符

ENQ 询问 DC1 设备控制 1 GS 组分隔符

ACK 应答 DC2 设备控制 2 RS 记录分隔符

BEL 报警符(可听见) DC3 设备控制 3 US 单元分隔符

BS 退一格 DC4 设备控制 4 SP 空格符

HT 横向列表 NAK 否定 DEL 作废

LF 换行 SYN 空转同步

VT 垂直制表 ETB 信息组传送结束

对标志影响

续表

续表

续表 B5 direct rel CJNE A,direct,rel 若(A)≠(direct),则(PC)+rel→PC,

若(A)<(direct),则 1→CY √ × × × 3 2 B4 direct rel CJNE A,#data,rel 若(A)≠data,则(PC)+rel→PC,

若(A)< data,则 1→CY √ × × × 3 2 B8~BF

direct rel CJNE Rn,#data,rel 若(Rn)≠data,则(PC)+rel→PC,

若(Rn)<data,则 1→CY √ × × × 3 2 B6, B7

direct rel CJNE @Ri,#data,rel 若((Ri))≠data,则(PC)+rel→PC,

若((Ri))<data,则 1→CY √ × × × 3 2

C51 编译器的运行库中包含有丰富的库函数,使用库函数可以大大简化用户的程序设计工 作,提高编程效率。下面介绍一些常用的库函数,如果用户使用这些库函数,必须在源程序的 开始用预处理命令“#include”将相关的头文件包含进来。

C.1 寄存器头文件

寄存器头文件 regxxx.h(如 reg51.h)中定义了 MCS-51 所有特殊功能寄存器和相应位,

定义时使用的是大写字母。在 C 语言源程序文件的开始,应该把对应的头文件 regxxx.h 包含 进来,在程序中就可以直接使用 MCS-51 中的特殊功能寄存器和相应的位。

C.2 字符函数

字符函数在 ctype.h 头文件中声明,下面给出部分函数。

1.检查英文字母函数 isalpha 函数原型:extern bit isalpha(char c) 再入属性:reentrant

功能:检查参数字符是否为英文字母,是则返回 1,否则返回 0。

2.检查英文字母、数字字符函数 isalnum 函数原型:extern bit isalnum(char c) 再入属性:reentrant

功能:检查参数字符是否为英文字母或数字字符,是则返回 1,否则返回 0。

3.检查数字字符函数 isdigit 函数原型:extern bit isdigit(char c) 再入属性:reentrant

功能:检查参数字符是否为数字字符,是则返回 1,否则返回 0。

4.检查小写字母函数 islower 函数原型:extern bit islower(char c) 再入属性:reentrant

功能:检查参数字符是否为小写字母,是则返回 1,否则返回 0。

5.检查大写字母函数 isupper 函数原型:extern bit isupper(char c) 再入属性:reentrant

功能:检查参数字符是否为大写字母,是则返回 1,否则返回 0。

6.检查十六进制数字字符函数 isxdigit 函数原型:extern bit isxdigit(char c)

再入属性:reentrant

功能:检查参数字符是否为十六进制数字字符,是则返回 1,否则返回 0。

7.数字字符转换十六进制数函数 toint 函数原型:extern char toint(char c) 再入属性:reentrant

功能:将 ASCII 字符的 0~9、A~F 转换成十六进制数,返回数字 0~F。

8.转换小写字母函数 tolower 函数原型:extern char tolower(char c) 再入属性:reentrant

功能:将大写字母转换成小写字母,返回小写字母,如果输入的不是大写字母,则不作 转换直接返回输入值。

9.转换大写字母函数 toupper 函数原型:extern char toupper(char c) 再入属性:reentrant 率 4800b/s,晶振频率为 11.0592MHz,初始化程序段为:

SCON=0x52; //设置串行口方式 1、允许接收、启动发送

TMOD=0x20; //设置定时器 T1 以模式 2 工作

TH1=0xfa; //设置 T1 重装初值

TR1=1; //开 T1

在 stdio.h 文件中声明的输入/输出函数,都是以_getkey 和 putchar 两个函数为基础,如果 需要这些函数支持其他的端口,只需修改这两个函数即可。下面给出部分函数。

1.从串行口输入字符函数_getkey 函数原型:extern char _getkey (void) 再入属性:reentrant

功能:从 51 单片机的串行口读入一个字符,如果没有字符输入则等待,返回值为读入的 字符,不显示。

2.从串行口输入字符并输出函数 getchar 函数原型:extern char getchar(void) 再入属性:reentrant

功能:使用_getkey 函数从 51 单片机的串行口输入一个字符,返回值为读入的字符,并且 通过 putchar 函数将字符输出。

3.从串行口输出字符函数 putchar 函数原型:extern char putchar(char) 再入属性:reentrant

功能:从 51 单片机的串行口输出一个字符,返回值为输出的字符。

4.从串行口输入字符串函数 gets

函数原型:extern char *gets(char *string, int len) 再入属性:non-reentrant

功能:从 51 单片机的串行口输入一个长度为 len 的字符串(遇到换行符结束输入),并将 其存入 string 指定的位置。输入成功返回存入地址的指针,输入失败则返回 NULL。

5.从串行口格式输出函数 printf

函数原型:extern int printf(格式控制字符串,输出参数表) 再入属性:non-reentrant 函数原型:extern int puts(const char *) 再入属性:reentrant

功能:该函数将字符串和换行符输出到串行口,正确返回一个非负数,错误返回 EOF。

8.从串行口格式输入函数 scanf

函数原型:extern int scanf(格式控制字符串,输入参数表) 再入属性:non-reentrant 函数原型:float atof (void *string) 再入属性:non-reentrant

功能:该函数把字符串转换成浮点数并返回。

2.字符串转换整型数函数 atoi 函数原型:int atoi (void *string)

再入属性:non-reentrant

功能:该函数把字符串转换成整型数并返回。

3.字符串转换长整数函数 atol 函数原型:long atol (void *string) 再入属性:non-reentrant

功能:该函数把字符串转换成长整数并返回。

4.申请内存函数 malloc

函数原型:void *malloc (unsigned int size) 再入属性:non-reentrant

功能:该函数申请一块大小为 size 的内存,并返回其指针,所分配的区域不初始化。如 果无内存空间可用,则返回 NULL。

5.释放内存函数 free

函数原型:void free (void xdata *p) 再入属性:non-reentrant extern long labs (long i) 再入属性:reentrant

extern void srand (int seed) 再入属性:reentrant,non-reentrant

功能:rand 函数产生并返回一个 0~32767 之间的伪随机数;srand 用来将随机数发生器初 始化成一个已知的值,对函数 rand 的相继调用将产生相同序列的随机数。

4.求三角函数 cos、sin 和 tan 函数原型: extern float cos (float i)

extern float sin (float i) extern float tan (float i) 再入属性:non-reentrant

功能:3 个函数分别返回 i 的 cos、sin、tan 的函数值。3 个函数变量的范围都是-π/2~+π/2,

变量的值必须在±65535 之间,否则产生一个 NaN 错误。

5.求反三角函数 acos、asin、atan 和 atan2 函数原型: extern float acos (float i)

extern float asin (float i) extern float atan (float i) extern float atan2 (float i, float j) 再入属性:non-reentrant

功能:前 3 个函数分别返回 i 的反余弦值、反正弦值、反正切值,3 个函数的值域都是-π/2~

+π/2;atan2 返回 i/j 的反正切值,其值域是-π~+π。

C.6 内部函数

内部函数在头文件 intrins.h 中声明。

1.循环左移 n 位函数_crol_、_irol_、_lrol_

函数原型分别为:

unsigned char _crol_ (unsigned char, unsigned char n) unsigned int _irol_ (unsigned int, unsigned char n) unsigned long _lrol_ (unsigned long, unsigned char n) 再入属性:reentrant,intrinsic

功能:这些函数都是将第一个参数(无符号字符、无符号整型数、无符号长整型数)循 环左移 n 位,返回被移动后的数。

2.循环右移 n 位函数_cror_、_iror_、_lror_

函数原型分别为:

unsigned char _cror_ (unsigned char, unsigned char n) unsigned int _iror_ (unsigned int, unsigned char n) unsigned long _lror_ (unsigned long, unsigned char n) 再入属性:reentrant,intrinsic

再入属性:reentrant,intrinsic

再入属性:non-reentrant

函数原型:char *strcpy(char *dest, char *src) 再入属性:reentrant

函数原型:char strcmp (char *string1, char *string2) 再入属性:reentrant

功能:该函数逐个字符比较字符串 string1 和 string2,如果相等则返回 0,如果不等,则 返回第一个不等的字符的差值(string1 的字符减 string2 的字符)。

12.字符串 n 个字符比较函数 strncmp

函数原型:char strncmp (char *string1, char *string2, int len) 再入属性:non-reentrant int strpos (const char *string, char cc) 再入属性:reentrant

功能:strchr 函数顺序搜索字符串 src 中第一次出现的字符 cc(包括结束符),如果找到,

则返回指向 cc 的指针,否则返回 NULL。strpos 的功能与 strchr 相似,但返回的是 cc 在字符 串中出现的位置值,未找到则返回-1,第一个字符是 cc 则返回 0。

C.8 绝对地址访问函数

绝对地址访问函数在头文件 absacc.h 中声明。

1.绝对地址字节访问函数 CBYTE、DBYTE、PBYTE、XBYTE 函数原型分别为:#define CBYTE ((unsigned char volatile code*) 0)

#define DBYTE ((unsigned char volatile data *) 0)

#define PBYTE ((unsigned char volatile pdata *) 0)

#define XBYTE ((unsigned char volatile xdata *) 0)

功能:上述宏定义用来对 MCS-51 单片机的存储空间进行绝对地址访问,可以作为字节寻 址。CBYTE 寻址 CODE 区,DBYTE 寻址 DATA 区,PBYTE 寻址分页的 XDATA 区,XBYTE 寻址 XDATA 区。

2.绝对地址字访问函数 CWORD、DWORD、PWORD、XWORD 函数原型分别为:#define CWORD ((unsigned int volatile code*) 0)

#define DWORD ((unsigned int volatile data *) 0)

#define PWORD ((unsigned int volatile pdata *) 0)

#define XWORD ((unsigned int volatile xdata *) 0)

这些宏的功能与前面的宏类似,区别在于这些宏的数据类型是无符号整型 unsigned int。

[1] 李朝青编著.单片机原理及接口技术(第 3 版).北京:北京航空航天大学出版社,

2006.

[2] 谢维成,杨加国主编.单片机原理与应用及 C51 程序设计.北京:清华大学出版社,

2006.

[3] 胡伟,季晓衡编著.单片机 C 程序设计及应用实例.北京:人民邮电出版社,2003.

[4] 周立功等编著.增强型 80C51 单片机速成与实战.北京:北京航空航天大学出版社,

2004.

[5] 谭浩强编著.C 程序设计.北京:清华大学出版社,1999.

[6] 李建忠编著.单片机原理及应用.西安:西安电子科技大学出版社,2002.

[7] 吴黎明主编.单片机原理及应用技术.北京:科学技术出版社,2005.

[8] 何桥主编.单片机原理及应用.北京:中国铁道出版社,2004.

相關文件