小白向单片机笔记一:点灯大师
前言
点灯包括:单个LED闪烁,所有 LED闪烁,LED左流,LED右流,LED循环流
一、单片机LED原理图
VCC为电源,输出高电平。P20-P27为C51芯片引脚。LED灯点亮,电流只能从左流向右。控制芯片引脚默认输出高电平,LED左右均为高电平,即LED默认不亮。要点亮哪个LED灯,只需控制对应引脚输出低电平即可。
二、点灯代码
#include "reg52.h"
#include "intrins.h" //_crol_()和_cror_()函数要用
typedef unsigned int uint;
typedef unsigned char uchar;
sbit LED0 = P2^0;
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit LED4 = P2^4;
sbit LED5 = P2^5;
sbit LED6 = P2^6;
sbit LED7 = P2^7;
#define LED P2 //包含8个LED灯
void delay(uint i){
while(i--){
}
}
void main(){
while(1){
/*第一个LED闪烁*/
/*LED0 = 0;
delay(50000);
LED0=1;
delay(50000);*/
/*全部闪烁*/
/*LED = 0xff;
delay(50000);
LED = 0x00;
delay(50000);*/
uint i;
/*流水灯,右流*/
/*LED = 0xfe;
for(i=0 ; i<7;++i){
delay(10000);
LED = _crol_(LED , 1);
delay(10000);
}*/
/*流水灯,左流*/
/*LED = 0x7f; //循环流保存左右流并注释该行即可
for(i=0 ; i<7;++i){
delay(10000);
LED = _cror_(LED , 1);
delay(10000);
}*/
/*摩斯密码,SB .../_...
不完美,需要用到多线程。前三个和后三个各自闪烁,每个灯各自线程控制,中间俩个灯常亮。
*/
/*
LED = 0xE7;
delay(50000);
LED = 0x00;
delay(50000); */
}
}
代码解释
1.为什么LED闪烁要用两个 delay()函数?
因为程序执行速度非常快,只保留第一个delay()函数,LED熄灭后会很快点亮,虽然其在闪烁,但肉眼无法察觉。
2. 为什么LED=0xfe之类的16进制?
因为LED定义为P2的所有引脚,P2的8个引脚分别控制8个LED灯。0xfe转换为二进制为1111 1110。低位0表示P20引脚为低电平,即第一个LED灯点亮,其他熄灭。在左右流水灯中的左右位移函数 _crol_() 和 _cror_() 中移动给定的十六进制数,以此顺序点亮对应LED灯。
3.为什么for循环中阈值为7而不是8?
要控制8个灯依次点亮,而在for循环体外已经控制点亮了第一个灯,即LED=0xfe。所以只要控制其他七个灯即可。
总结
除了数模电忘干净了很多看不懂,其他比较简单。