
第5章C51基础-实例
第5章 C 51 基础-实例 1

【例5-1】制作流水灯,8个发光二极管LED0~LED7和STC15F2k60S2芯片。设计电路,并编写程序来控制发光二极管由上至下的反复循环流水点亮,每次点亮一个发光二极管。分析:电路设计部分1、最小系统电路2、LED需要通过并行I/O口控制亮灭,本例中选用P1口控制LED灯。3、灌电流驱动方式有利于芯片稳定,因此应选用低电平驱动。接法为8个发光二极管LED0~LED7经限流电阻分别接至P1口的P1.0~P1.7引脚上,阳极共同接高电平。2
【例5-1】 制作流水灯,8个发光二极管LED0~LED7和STC15F2k60S2 芯片。设计电路,并编写程序来控制发光二极管由上至下的反复循环流水点 亮,每次点亮一个发光二极管。 分析: 电路设计部分 1、最小系统电路 2、LED需要通过并行I/O口控制亮灭,本例中选用P1口控制LED灯。 3、灌电流驱动方式有利于芯片稳定,因此应选用低电平驱动。接法为8 个发光二极管LED0~LED7经限流电阻分别接至P1口的P1.0~P1.7引脚上 ,阳极共同接高电平。 2

+5V+5V+5VRILED引脚引脚LEDK4aAT89S52AT89S52(b)恰当连接:低电平驱动(a)不恰当连接:高电平驱动图5-1发光二极管与单片机并行口的连接3
3 图5-1 发光二极管与单片机并行口的连接 (a)不恰当连接:高电平驱动 (b)恰当连接:低电平驱动

限流电阻的计算限流电阻计算方式,(Up-Ur)/IUp为电源电压,UF为二极管导通压降,IF为二极管长时间工作最大平均电流。常用贴片LED压降和电流红色的压降为1.82-1.88V,电流5-8mA绿色的压降为1.75-1.82V,电流3-5mA橙色的压降为1.7-1.8V,电流3-5mA兰色的压降为3.1-3.3V,电流8-10mA白色的压降为3-3.2V,电流10-15mA假设本例中工作电压为5V用红色贴片LED,压降选择为1.8V,电流选择为5mA,求限流电阻选多大。学
限流电阻的计算 ◼ 限流电阻计算方式,(UP -UF)/IF ◼ Up为电源电压,UF为二极管导通压降,IF为二极管长时 间工作最大平均电流。 ◼ 常用贴片LED压降和电流 ◼ 红色的压降为1.82-1.88V,电流5-8mA ◼ 绿色的压降为1.75-1.82V,电流3-5mA ◼ 橙色的压降为1.7-1.8V,电流3-5mA ◼ 兰色的压降为3.1-3.3V,电流8-10mA ◼ 白色的压降为3-3.2V,电流10-15mA. ◼ 假设本例中工作电压为5V用红色贴片LED,压降选择为 1.8V,电流选择为5mA,求限流电阻选多大。 4

C1H30pFU1X1口19¥39XTAL1PO.O/ADO38P0.1/AD1C37VecPO.2IAD218L36XTAL2PO.3/AD34C35PO.4/AD43430pFLEDOP0.5IAD5R1D33R910kPO.6/AD6329RSTVocP0.7AD7110421LED1P2.0/A8EC22R2VocP2.1/A9服10uFD23DP2.2IA10429P24R10110PSENP2.3/A11300D25福LED2OoALEP2.4/A1230C26R31kEAP2.5/A13C27限中P2.6/A14C28110P2.7IA15LED31010R4P1.0P3.0/RXD2C11P1.1P3.1/TXD30C12110P1.2P3.2/NTO40D13P1.3LED4P3.3.ANT150D14R5P1.4P3.4/TO-60C15P1.5P3.5/T1ZC16P1.6110P3.6AR8C17LED5P1.7P3.7/RDR6AT89C51110LED6R7110LED7R8110图5-2单片机控制的流水灯5
图 5 - 2 单片机控制的流水灯 5

编写程序1、头文件必不可少,至至少要包含芯片定义头文件/*头文件*注释#include#include#include"abcd.h"头文件一般有三类:a、51芯片头文件,主要包含定义好的特殊功能寄存器地址列表。b、库函数,如包含移位函数crol(,)的C、用户自己定义的头文件。用户自已定义的头文件(放在project文件夹里)和安装文件中的头文件用的符号时不同的。6
◼ 编写程序 ◼ 1、头文件 ◼ 必不可少,至少要包含芯片定义头文件 ◼ /*头文件*/ 注释 ◼ #include ◼ #include ◼ #include”abcd.h” ◼ 头文件一般有三类: ◼ a、51芯片头文件,主要包含定义好的特殊功能寄存器地址列表。 ◼ b、库函数,如包含移位函数_crol_( , )的 ◼ c、用户自己定义的头文件。 ◼ 用户自己定义的头文件(放在project文件夹里)和安装文件中的头文件 用的符号时不同的。 6

2、宏定义#define ucharunsignedchar#define uint unsigned int# define Pi 3. 143、SFR中位变量定义4、全局变量声明全局变量声明,整个程序都要用到的变量,从定义开始处往后均可以使用。5、函数声明由于ANSIC的特征是,程序只有先出现才可以使用,因此主程序中用到的函数均需要先定义,或者先声明之后再定义
2、宏定义 #define uchar unsigned char #define uint unsigned int # define Pi 3.14 3、SFR中位变量定义 4、全局变量声明 全局变量声明,整个程序都要用到的变量,从定义开始处往后均可以使 用。 5、函数声明 由于ANSI C的特征是,程序只有先出现才可以使用,因此主程序中用到 的函数均需要先定义,或者先声明之后再定义。 7

主程序void main (void)******/*预处理段*/(1)while/*不断重复主程序******/*主体*/18
◼ 主程序 ◼ void main(void) ◼ { ◼ ****** /*预处理段*/ ◼ while(1) /*不断重复主程序*/ ◼ { ◼ ***** /*主体*/ ◼ } ◼ } 8

参考程序:#include#include//包含移位函数crol()的头文件#define uchar unsigned char#define uint unsigned int//@12.000MHzvoid delay(uchar n){unsigned char i,j,k;for (k=0;k<n;k++)[i = 12;J = 169;do{while (--j) ;I while (--i);19
参考程序: #include #include //包含移位函数_crol_( )的头文件 #define uchar unsigned char #define uint unsigned int void delay(uchar n) //@12.000MHz { unsigned char i,j,k; for(k=0;k<n;k++) { i = 12; j = 169; do { while (-j); } while (-i); } } 9

Ⅱ主程序voidmain()(P1=0xfe;I/向P1口送出点亮数据while (1)(I/500为延时参数,可根据实际需要调整delay(500);P1=_crol_(P1,1);I/函数_crol_(P1,1)把P1中的数据循环左移1位17需要注意crol(m,n)函数包含在库函数中,需要在源文件前些包含该头文件。两个参数,一个是被移位对象,一个是移动位数。crol(m,n)与>符号写程序,还需不需要用头文件,最终的现象是什么呢?10
void main( ) //主程序 { P1=0xfe; //向P1口送出点亮数据 while (1) { delay(500); //500为延时参数,可根据实际需要调整 P1=_crol_(P1,1) ; // 函数_crol_(P1,1)把P1中的数据循环左移1位 } } 需要注意_crol_ (m,n)函数包含在库函数中,需要在源文件前些包含 该头文件。两个参数,一个是被移位对象,一个是移动位数。 _crol_ (m,n)与>符号写程序,还需不需要用头文件,最终的现象是什么 呢? 10