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.