1、STC单片机 C语言描述语句主 讲:何宾Email: 2016.03在完整的计算机系统中,包含输入输出设备。典型的,在以 PC机 /笔记本为代表的计算机系统中,默认键盘是标准的输入设备,以及显示器是标准的输出设备。通过输入输出设备,进行人机交互。这里的“人”指的是计算机用户或者程序员,而“机”是指的计算机。 注:在 8051单片机系统中,默认标准的输入和输出设备均是串行接口。所以,在单片机系统中,进行输入操作时,必须先对串口进行初始化操作。而在 PC机 /笔记本上则不需要执行此操作过程。输入输出语句当用在 PC机 /笔记本电脑时,该函数向显示终端显示输出一个字符;而当用在 8051单片机 系统
2、时,该函数向串口终端输出一个字符。在程序中,调用 putchar函数格式为:putchar(字母 )注:关于函数的具体说明,见后续章节。【例 11-1】调用 putchar函数的例子代码清单 11-1 main.c文件#include “stdio.h“#include “reg51.h“输入输出 语句-putchar函数int main()char a=S,b=T,c=C; /定义字符变量,并初始化char d=n; /定义字符变量,并初始化char e=H,f=e,g=l,h=l,i=o; /定义字符变量,并初始化SCON= 0x52; /初始化串口相关 /TMOD = 0x20; TCO
3、N = 0x69; TH1 = 0xF3; putchar(a); /输出字符变量 a所表示的字符putchar(b); /输出字符变量 b所表示的字符输入输出 语句-putchar函数putchar(c); /输出字符变量 c所表示的字符putchar(d); /输出字符变量 d所表示的字符putchar(e); /输出字符变量 e所表示的字符putchar(f); /输出字符变量 f所表示的字符putchar(g); /输出字符变量 g所表示的字符putchar(h); /输出字符变量 h所表示的字符putchar(i); /输出字符变量 i所表示的字符putchar(d); /输出字符变
4、量 d所表示的字符return 0;输入输出 语句-putchar函数读者可以进入到本书所提供资料的 stc_program_example例子 11-1目录下,在 Keil Vision5集成开发环境下打开该设计,并进入调试器模式,按 F5按键运行程序。打开 UART #1窗口观察运算得到的结果 注: putch(ch):在当前光标处向文本屏幕输出字符 ch,然后光标自动右移一个字符位置。输入输出 语句-putchar函数当用在 PC机 /笔记本上时,该函数从标准输入设备键盘得到一个字符;而当用在 8051单片机 系统时,该函数从标准输入设备串口终端得到一个字符。调用格式为:整型 变量 =g
5、etchar() 当程序调用 getchar时,程序就等着用户输入。用户输入的字符被放在缓冲区。直到用户按回车键为止,特别要注意回车字符也放在缓冲区内。当用户键入回车键后, getchar函数才开始从标准输入输出流中读入一个字符。 getchar函数的返回值是用户输入输出 语句-getchar函数输入第一个字符的 ASCII码,如出错则返回 -1,且将用户输入的字符回显到屏幕。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓冲区,等待后续 getchar调用读取。也就是说,后续的 getchar调用不会等待用户按键,而直接读取缓冲区的字符,直到缓冲区中的字符读完后,才等待用户按键。
6、输入输出 语句-getchar函数【例 11-2】调用 getchar函数的例子代码清单 11-2 main.c文件#include “stdio.h“#include “reg51.h“void main()char a,b,c; /声明三个字符型变量 a、 b和 cSCON= 0x52; /初始化串口TMOD = 0x20; TCON = 0x69; TH1 = 0xF3; 输入输出 语句-getchar函数a=getchar(); /读输入字符b=getchar(); /读输入字符c=getchar(); /读输入字符putchar(n); /打印换行符putchar(a); /打印输入
7、的字符 aputchar(b); /打印输入的字符 bputchar(c); /打印输入的字符 cputchar(n); /打印换行符输入输出 语句-getchar函数读者可以进入到本书所提供资料的 stc_program_example例子11-2目录下,在 Keil Vision5集成开发环境下打开该设计,并进入调试器模式,按 F5按键运行程序。打开 UART #1窗口,在窗口中输入三个字符,然后输出刚才所输入的三个 字符输入输出 语句-getchar函数在 PC机 /笔记本电脑上,该函数向显示器终端输出指定个数任意类型的数据;而在 8051单片机 系统中,该函数向串口终端输出指定个数任意
8、类型的数据。要输出的文字除了可以使用字符、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义。该函数在 stdio.h头文件中定义,在使用 printf函数的时候必须包含 stdio.h头文件, printf函数的调用格式为:printf(格式控制 ,输出列表 )比如:printf(“%d,%cn”,i,c);输入输出 语句-printf函数格式控制是双撇号括起来的一个字符串,称为“转换控制字符串”,简称格式字符串,包含:格式声明和普通字符。 格式 声明由 “ %” 和 格式字符组成 , 如 %d、 %f等 。 它的作用是将输出的数据转换为指定的格式输出 。 格式声明总是由 “
9、 %” 字符开始 。 其完整的格式表示为 : %flagwidth.precF|N|h|ltype其中: 内为可选项 。输入输出 语句-printf函数 type的字符用于规定输出数据的类型: d( i) , 按照十进制整型数据输出 , i是老式写法 。 o, 按照八进制整型数据输出 。 x( X) , 按照十六进制整型数据输出 。 u, 按照无符号十进制数据输出 c, 输出一个字符 。 s( S) , 输出一个字符串 。输入输出 语句-printf函数 f( lf) , 以系统默认的格式输出实数 。 单精度浮点数用 f, 双精度浮点数用 lf。 e( E) , 以指数形式输出实数 。 p,
10、以 16进制形式输出指针 。 注:可以在格式字符 d、 o、 x和 u前面添加 l字符,用于表示长整型数。 flag规定输出样式 , 取值和含义如下: , 减号 , 左对齐 , 右边填充空格 ( 默认右对齐 ) 。 +, 加号 , 在数字前增加 +或者 。 0, 数字 零 , 将输出的前面补上 0, 直到占满指定列宽为止 ( 不可以搭配使用) 。输入输出 语句-printf函数 空格 , 输出值为正时加上空格 , 为负时加上负号 。 #, 井号 , type为 0、 x或者 X时 , 增加前缀 0、 0x或者 0X;当 type为 e、 E、 f、g和 G时 , 一定要使用小数点;当 type
11、为 g或者 G时 , 保留尾部的 0。 width用于控制显示数值的宽度 , 取值含义为: n(n=1,2,3 ):宽度至少为 n位 , 不够用空格填充 。*格式列表中 , 下一个参数还是 width输入输出 语句-printf函数 width是一个可选的指定最小值字段宽度的十进制数字字符串 。 如果转换值字符少于字段宽度 , 该字段将从左到右按指定的字段宽度填充 。 如果转换结果宽于字段宽度 , 则扩展该字段以包含转换后的结果 , 不会发生截断 。 然而 ,小的精度可能会导致在右边发生截断 。 prec用于控制小数点后面的位数 , 取值和含义如下:如果没有 prec时 ,按默认精度显示 0;
12、当 type为 d、 i、 o、 u或者 x时 , 没有影响;当type为 e、 E或者 f时 , 不显示小数点 。 F|N|h|lF, 远指针; N, 近指针; h, 短整数 ( short int) ; l, 长整数( long int) 。 普通 字符是需要原样输出的字符 。 比如上面 printf函数中双撇号内的逗号 、 空格和换行符 。输入输出 语句-printf函数输出 列表对于 printf函数中的输出表列来说,是需要输出的一些数据,可以是常量、变量或者是表达式。 注:由于 printf语句消耗单片机资源很多,所以不建议大量使用。【例 11-3】调用 printf函数的例子代码清
13、单 11-3 main.c文件#include “stdio.h“#include “reg51.h“int main()int a=10;float b=133452.1243;输入输出 语句-printf函数char s120=“STC Hello“;char c1=a;SCON= 0x52; TMOD = 0x20; TCON = 0x69; TH1 = 0xF3;printf(“a=%dn“,a);printf(“a=%#xn“,a);printf(“a=%+-10dn“,a);输入输出 语句-printf函数printf(“b=%fn“,b);printf(“b=%en“,b);pr
14、intf(“b=% fn“,b);printf(“b=%7.8fn“,b);printf(“%sn“,s1);printf(“%cn“,c1);printf(“%d,%fn“,a,b);printf(“a=%d, b=%dn“,a,b);return 0;输入输出 语句-printf函数读者可以进入到本书所提供资料的 stc_program_example例子11-3目录下,在 Keil Vision5集成开发环境下打开该设计,并进入调试器模式,按 F5按键运行程序。打开 UART #1窗口,可以看到显示的 信息输入输出 语句-printf函数在 PC机 /笔记本电脑上,该函数通过标准输入设备
15、键盘,获取指定个数的任意类型数据 ;而 在 8051单片机系统中,该函数通过串口终端获取指定个数任意类型的数据。与 printf函数一样,该函数也在 stdio.h头文件中定义,在使用 scanf函数的时候必须包含stdio.h头文件, scanf函数的调用格式为:scanf(格式控制 ,地址列表 )比如:scanf(“%d,%d”,输入输出语句- scanf函数格式 控制格式控制是双撇号括起来的一个字符串,称为“转换控制字符串”,简称格式字符串。格式字符串包括格式声明和普通字符两部分。 格式 声明由三类字符构成 , 包含格式声明符 、 空白符和非空白字符 。 格式 声明 符 由 “ %” 和
16、格式字符组成 , 如 %d、 %f等 。 它的作用是将输入的信息转换为指定的格式的数字 。 格式声明总是由“ %” 字符开始 。 其完整的格式表示为:%修饰符 type输入输出语句- scanf函数 对于 type来说 , 包含以下: d( i) , 按照十进制整型数据输入 。 o, 按照八进制整型数据输入 。 x( X) , 按照十六进制整型数据输入 。 u, 按照无符号十进制数据输入 。 c, 输入一个字符 。 s, 输入一个字符串 。 f, 用来以系统默认的格式输入实数 。 e( E) , 以指数形式输入实数 。输入输出语句- scanf函数 p, 读指针的值 。 n, 至此已经读入值得
17、等价字符数对于 type前的修饰符来说 , 可选择以下: L/l长度修饰符 、 输入 “长 “数据 h长度修饰符 、 输入 “短 “数据 W整型常数 、 指定输入数据所占宽度 *表示本 输入 项在读入后不赋值给相应的变量 空白字符 。空白字符会使 scanf()函数在读操作中略去输入中的一个或多个空白字符 。输入输出语句- scanf函数 非 空白字符 。一个非空白字符会使 scanf()函数在读入时剔除掉与这个非空白字符相同的字符 。 普通 字符此外 , 在格式控制串中的普通字符 , 是需要原样输入的字符 。 例如上面 scanf函数中双撇号内的逗号 、 空格和换行符 。地址 列表对于 sc
18、anf函数中的地址列表,它由若干地址组成,可以是变量的地址或者字符串的首地址。输入输出语句- scanf函数输入 规则在使用 scanf语句输入时,需要注意下面的规则: 这里 特别强调是地址 , 而不是变量本身 。 上面的 scanf语句绝不可以写成:scanf(“%d,%d”,a,b); 如果 在格式控制字符串中 , 除了格式声明以外还有其他字符 , 则在输入数据时应在对应位置应输入与这些字符相同的字符 。 前面的 scanf语句中 , 两个 %d之间用 “, ”隔开 , 因此 , 在输入数据的时候就需要用逗号隔开 。输入输出语句- scanf函数 如果 scanf函数写成下面的格式:sca
19、nf(%d%d”,则在输入两个变量 a和 b值的时候 , 只要在两个值之间添加空格键即可 , 因为空格键表示前一个数据的输入完成 。 在 scanf函数中没有精度控制修饰符 , 下面的写法是非法的:scanf(“f%5.2f”, 在 输入参数时 , 要特别注意格式化符的含义 。输入输出语句- scanf函数【 例 11-4】调用 scanf函数的例子代码清单 11-4 main.c文件#include “stdio.h“#include “reg51.h“int main()int i,j; /初始化整型变量 i和 jfloat k; /初始化浮点型变量 kchar c1; /初始化字符型变量 c1SCON= 0x52; /初始化串口输入输出语句- scanf函数TMOD = 0x20; TCON = 0x69; TH1 = 0xF3; printf(“please input two integer numbern“); /提示输入两个整数值scanf(“%d,%d“, /输入变量 i和 j的值,用逗号分隔printf(“please input one float numbern“); /提示输入一个浮点数scanf(“%f“, /输入浮点变量 k的值输入输出语句- scanf函数