51外设点亮LED灯

准备知识

        进制转换(计算机应该非常熟练) 二极管特性:在耐压范围内,反向电阻无限大相当于断开

电路图及基本原理

我们是通过控制P1 控制电压高低从而控制LED灯亮灭 通过图我们可以观察 LED一端全部接在电源VCC 我们通过控制另一段相应部分就可以 比如P1 = 0xff(1111 1111  没有或电压差过小,LED熄灭) 全灭, P1 = 0;全亮操作

实验说明

        我们想创建一个流水灯的例子,具体表现每次只亮一个灯,灯亮的位置间隔移动(最高位下一位为最低位)

        我们使用了<intrins.h>中的循环左移函数 _cror_() 可以包含文件选中右键open doucememnt打开看下

配套教程源码        

#include <reg52.h>	//51头文件
#include <intrins.h>//包含循环右移函数_cror头文件

#define uchar unsigned char	 //宏定义
#define uint  unsigned int	 //宏定义

sbit LED1 = P1^0; //位定义LED1硬件接口
uchar i;   //申明循环计数变量
uchar temp;//P1口状态暂存变量

//毫秒级延时函数
void delay(uint z)
{
	uint x,y;
	for(x = z; x > 0; x--)
		for(y = 120; y > 0 ; y--);
}

//主函数
void main()
{
	temp = 0x7f; //定义LED灯初始状态,从LED8开始亮
	P1 = temp;	 //赋值给P1,点亮LED8
	delay(1000); //延时1000毫秒
	while(1)	//大循环
	{
		for(i = 0; i < 8; i++)
		{
			temp = _cror_(temp,1);//循环右移,LED从左至右点亮
			P1 = temp;
			delay(1000);	
		}
	} 
}

实验实际非常简单,上面的程序可以更加简化,注意使用延时函数

实验容易遇到的问题

        1) 问题描述 想做LED闪烁

                部分伪代码

                while(1)

                        {

                                P1= x1;

                                delay();

                                P1 = x2;

                        }

                结果LED效果显示为P1 = X1的效果,为什么呢实际在多次循环后 P1 = x2,P1 = x1 delay()

                P1 = x1 的时间大于P1 = x2 视觉暂留效果我们可能看到P1 = x2 的独自较暗效果 当时间远远大于,延时的时间足够长,显示的为X2的值,如果没有延时我们观察到的效果为 P1 = (x1 | x2)

我们由次可以得到灵感可以通过LED亮起的时间设置由暗到亮的设计,在此不过多演示

2)循环直接使用<< 结果LED最终全亮

        1111 1110 不断左移动 末尾不断补0 最终为0 LED全亮

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值