内容正文:
任务1 跑马灯
1.了解跑马灯的工作过程及控制原理。
2.掌握单片机I/O口控制外部负载的合理设计方法。
3.掌握移位和延时程序的设计方法。
4.能够设计并制作跑马灯控制系统。
本任务选用单片机P0口控制8只发光二极管(D1~D8),使D1~D8由低位到高位依次点亮,时间间隔为1s,如此往复循环,完成跑马灯控制系统的设计与制作。
一、函数
1.标准库函数
即由C编译系统提供的库函数,在C编译系统中将一些独立的功能模块编写成公用函数,并将它们集中存放在系统的函数库中,供程序设计时使用。
丰富的可直接调用的库函数是C51功能强大及其高效率的重要体现之一,多使用库函数可使程序代码简化,结构清晰,易于调试和维护。
2.用户自定义函数
即用户根据自己的需要而编写的函数。从函数定义的形式上可以划分为无参数函数、有参数函数和空函数。
无参函数的一般形式为:
函数类型 函数名(void) //用“void”声明该函数为
//无参函数
{
局部变量定义;
函数体语句;
}
其中:
函数类型定义了该函数返回值的类型。
函数名后括号中的“void”,声明了该函数为无参函数,可以省略不写,但括号不能少。
局部变量的定义就是对在本函数内部使用的变量进行定义,只在本函数内部有效。它与全局变量相对,全局变量则是定义在函数的外部,一般位于程序的顶部,它的有效范围为从定义开始的位置到源文件结束。
二、移位运算符
C51中移位运算符主要包括左移(“<<”)和右移(“>>”)两种。
“<< ”运算符的功能是:将一个二进制数的各位全部左移若干位,移动过程中,高位舍弃,低位补0。
“>>”运算符的功能是:将一个二进制数的各位全部右移若干位,移动过程中,低位舍弃,高位补0。
[例] 将无符号字符型变量m中的数据左环移n(n<8)位。
解: a = m <<n; //将变量m左移n位后并赋给中间变量a
b = m>>(8-n); /*将变量m右移(8-n)位后并赋给中间变量b
m = a | b; /*将两个中间变量中的数据进行按位“或”运算再返还给变量m,则此时m中的数据即为左环移n位后的结果 */
在C51中若要实现汇编移位指令中的环移功能,可以借助C编译系统中的“INTRINS.H”库函数,其中包含了字符循环左移(_crol_)和字符循环右移(_cror_)指令。
三、延时程序
采用for三重循环语句结构完成1s延时的函数:
void delay1s(void) //定义一个延时为1s的无参函数供主函数调用
{
unsigned char i, j, k; //局部变量定义
/* 最外层循环共要循环10次,共计延时约为10×0.1s =1s*/
for(k=10 ; m>0 ; m--)
/*次外层循环共要循环200次,共计延时约为200×0.5ms=100ms=0.1s*/
for(j=200 ; j>0 ; j--)
/*内循环共要循环250次,共计延时约为250×2μs=500μs=0.5ms*/
for(i=250 ; i>0 ; i--) ; /*最内层的循环体为空,循环每次延时2μs*/
}
此延时函数的时间延时只是近似1s,而并非标准的1s时间,因此只能用于对延时时间要求不是很准确的场合,若要实现标准的1s延时,可利用以后学习的定时器功能来完成。
一、设计并绘制电路原理图
单片机对LED控制的连接电路有两种方式,如下图所示。相应地,硬件上的不同连接方式也决定了软件上的不同控制逻辑,见下表:
端口控制逻辑电平
端口 LED状态 逻辑电平
P0.0 亮 0
灭 1
P2.0 亮 1
灭 0
在Proteus中根据上述分析绘制跑马灯电路原理图:
AT89S51的I/O口在外接负载时,要注意其负载能力。P0每位可驱动8个TTL负载,每一位最大的吸收电流为26mA,P1~P3口每位可驱动4个TTL负载,每一位最大的吸收电流为15mA。
输 出 端 口 说 明
P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0
D8 D7 D6 D5 D4 D3 D2 D1
1 1 1 1 1 1 1 0 D1亮
1 1 1 1 1 1 0 1 D2亮
1 1 1 1 1 0 1 1 D3亮
1 1 1 1 0 1 1 1 D4亮
1 1 1 0 1 1 1