当前位置:
文档之家› 第5章+单片机控制发光二极管
第5章+单片机控制发光二极管
5.3.1 点亮一盏灯
【例5-1】 利用AT89S51单片机点亮灯led,原理电路 见图5-1,灯led接单片机P1.0引脚上,编写程序使led点亮。
5.3.1 点亮一盏灯
5.3.1 点亮一盏灯
参考程序(方法一):
#include <reg51.h>//定义头文件 sbit led=P1^0;//对端口进行位定义 void main() {
5.4 流水灯的实现
图5-2 单片机控制的流水灯
5.4 流水灯的实现
参考程序(方法一位定义): #include <reg52.h> #define uint unsigned int sbit led0=P1^0; sbit led1=P1^1; sbit led2=P1^2; sbit led3=P1^3; sbit led4=P1^4; sbit led5=P1^5; sbit led6=P1^6; sbit led7=P1^7; void delayms(uint xms) {
CONTENTS
5.3 I/O端口的编程举例
目
录
5.4 流水灯的实现
5.5 交通灯的实现
5.2 C51程序主体结构
(1)对I/O端口编程控制时,要对I/O端口特殊功能寄存 器声明,在C51的编译器中,这项声明包含在头文件reg51.h 中,编程时,可通过预处理命令#include<reg51.h>,把这个 头文件包含进去。
led=0;
}
5.3.1 点亮一盏灯
参考程序(方法二):
#include <reg52.h> void main()
如何实现一个灯 接一个灯的点亮?
{
P1=0xfe;//11111110
while(1);
}
“while(1);”: while(1)后有分号,是使程序停留
在这指令上,本例用法。
“while(1) {……;}”:反复循环执行大括号内程序 段。
{ uint i,j; for(i=xms;i>0;i--) for( j=110;j>0;j--);
}
5.4 流水灯的实现
参考程序(方法三数组定义):
#include <reg52.h> #define uint unsigned int void delayms(uint xms);函数声明 unsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//建立数组 void main() {
uint k ;//定义局部变量k while(1) {
for(k=0;k<8;k++)//循环读数组中的数 {
P1=table[k]; delayms(1000);
} } } void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--)
for( j=110;j>0;j--); }
{语句(内部可为零)}
例for(i=2;i>0;i--)
思考:是否i越大延时越久呢?
unsigned int i,j; for(i=1000;i>0;i--)
for(j=110;j>0;j--);
可用宏定义 #define uint unsigned int 代替,避免变量名称多次
使用带来编程麻烦
5.3.2 延时函数编写
大部分发光二极管工作电流1~5mA之间,其内阻为 20~100Ω。电流越大,亮度也越高。
为保证发光二极管正常工作,同时减少功耗,限流电阻 选择十分重要,若供电电压为+5V,则限流电阻可选1~3kΩ。
5.1 单片机与发光二极管的连接
第2章已介绍,P0口作通用I/O用,由于漏极开路,需 外接上拉电阻。而P1~P3口内部有30kΩ左右上拉电阻。
delayms(1000);
// 延时
temp=temp<<1; // temp 中数据左移一位
}
从低位到高位点亮
5.4 流水灯的实现
temp=0x80;
// 赋右移初值给temp
for(i=0; i<8; i++) {
P1=~temp; // temp中的数据取反后送P1口
delayms(1000);
下面讨论P1~P3口如何与LED发光二极管驱动连接问 题。
单片机并行端口P1~P3直接驱动发光二极管,电路见 图5-1。
5.1 单片机与发光二极管的连接
拉电流
灌电流
图5-1 发光二极管与单片机并行口的连接
5.1 单片机与发光二极管的连接
当P0口某位为高电平时,可提供400µA的拉电流;当 P0口某位为低电平(0.45V)时,可提供3.2mA的灌电流, 而P1~P3口内有30kΩ左右上拉电阻,如高电平输出,则从 P1、P2和P3口输出的拉电流Id仅几百µA,驱动能力较弱, 亮度较差,见图5-1(a)。
第5章
单片机控制发光二极管的接口设计
单片机原理及接口技术(C51编程)(第3版)
5.1 单片机与发光二极管的连接
5.2 C51程序主体结构
CONTENTS
目
5.3 I/O端口的编程举例
录
5.4 流水灯的实现
5.5 交通灯的实现
5.1 单片机与发光二极管的连接
发光二极管常用来指示系统工作状态,制作节日彩灯、 广告牌匾等。
//延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
5.4 流水灯的实现
void main( ) //主函数
{
uchar i,temp;
while (1)
{
temp=0x01;
//左移初值赋给temp
for(i=0; i<8; i++) {
P1=~temp; // temp中的数据取反后送P1口
• (2)main():主函数程序的入口; void main( ) //主函数 • (3)程序注释://….只能注释一行; {
/*……*/注释任意行;
}
5.1 单片机与发光二极管的连接
5.2 C51程序主体结构
5.3 I/O端口的编程举例
目
5.4 流水灯的实现
录
5.5 交通灯的实现
CONTENTS
5.3.2 延时函数编写
基于for语句的循环 for循环的一般格式为: for(表达式1;表达式2;表达式3) { 循环体语句; } 特点:它不仅可以用于循环次数已知的情况,也可用
于循环次数不确定而只给出循环条件的情况。
5.3.2 延时函数编写 for语句使用例子
for(表达式1;表达式2;表达式3)
// 延时
temp=temp>>1; // temp 中数据右移一位
}
} }
从高位到低位点亮
5.4 流水灯的实现
程序说明: 注意使用移位运算符“>>”、“<<”与使用循 环左移函数“_crol_”和循环右移函数“_cror_” 区别。左移 移位运算“<<”是将高位丢弃,低位补0 ;右移移位运算、 “>>”是将低位丢弃,高位补0。而循环左移函数“_crol_” 是将移出的高位再补到低位,即循环移位;同理循环右移函 数“_cror_” 是将移出的低位再补到高位。
5.4 流水灯的实现
(011)C51函数库中的循环移位函数:循环移位函数包括: OPTION
循环左移函数“_crol_”。 循环右移函数“_cror_”。
本例用循环左移 “_crol_(P1,1)”,函数。括号第1个 参数为循环左移对象,即对P1中的内容循环左移;第2个参 数为左移位数,即左移1位。编程中一定要把含有移位函数 的头文件intrins.h包含在内,例如第2行“#include <intrins.h>”。
循环左移1位
delayms( 1000 ); //100为延时参数,可根据实际
需要调整
} }
5.4 流水灯的实现
02 移位运算符实现
OPTION
使用移位运算符“>>”、“<<”,把送P1口显示控制
数据进行移位,从而实现发光二极管依次点亮。参考
程序:
#include <reg51.h>
#define uchar unsigned char void delayms(uint xms)
5.1 单片机与发光二极管的连接
5.2 C51程序主体结构
5.3 I/O端口的编程举例
目
5.4 流水灯的实现
录
5.5 交通灯的实现
CONTENTS
5.5 交通灯的实现
要求:东西方向绿灯先亮27S后黄灯亮3S,期间南北方向红 灯同时亮30S;然后南北方向绿灯先亮27S后黄灯亮3S,期 间东西方向红灯同时亮30S;然后东西方向,如此反复。
如端口引脚为低电平,能使灌电流Id从单片机外部流入 内部,则将大大增加流过的灌电流值,见图5-1(b)。 AT89S51任一端口要想获得较大的驱动能力,要用低电平输 出。如一定要高电平驱动,可在单片机与发光二极管间加驱 动电路,如74LS04、74LS244等。
5.1 单片机与发光二极管的连接 5.2 C51程序主体结构
• 不带参数 • void delayms( )
• 带参数 void delayms(uint xms)
{ uint i,j;
for(i=1000;i>0;i--) for(j=110;j>0;j--);