准备知识
进制转换(计算机应该非常熟练) 二极管特性:在耐压范围内,反向电阻无限大相当于断开
电路图及基本原理
我们是通过控制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全亮