目录
一.LED模块
单片机需要通过CPU控制寄存器的值,进而通过驱动器加大控制力度,由控制电路输出高低电平(对应寄存器1/0)。因此,程序需要在对应的寄存器上写1或0,即可控制LED的亮灭。
1.点亮一个LED
//一个端口低电平
#include <REGX52.H>
void main()
{
P2=0xFE;//1111 1110
while(1)
{
}
}
2.LED闪烁
调用延时函数
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
P2=0xFE;//1111 1110
Delay500ms();
P2=0xFF;//1111 1111
Delay500ms();
while(1)
{
}
}
3.LED流水灯
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
}
P2=0xFE;//1111 1110
Delay500ms();
P2=0xFD;//1111 1101
Delay500ms();
P2=0xFB;//1111 1011
Delay500ms();
P2=0xF7;//1111 0111
Delay500ms();
P2=0xEF;//1110 1111
Delay500ms();
P2=0xDF;//1101 1111
Delay500ms();
P2=0xBF;//1011 1111
Delay500ms();
P2=0x7F;//0111 1111
Delay500ms();
}
使延迟秒数自定
#include <REGX52.H>
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms!=0)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
P2=0xFE;
Delay1ms(100);
P2=0xFD;
Delay1ms(100);
P2=0xFB;
Delay1ms(100);
P2=0xF7;
Delay1ms(100);
P2=0xEF;
Delay1ms(100);
P2=0xDF;
Delay1ms(100);
P2=0xBF;
Delay1ms(100);
P2=0x7F;
Delay1ms(100);
}
}
4.独立按键控制LED亮灭
同时控制8位
单独控制某一位
#include <STC89C5xRC.H>
void main()
{
while(1)
{
if(P30==0)//按下
{
P20=0;//灯亮
}
else //松开
{
P20=1;//灯灭
}
}
}
5.独立按键控制LED状态
按键消抖,检测松手,才改变LED灯的状态,使其松开按键后长亮或长灭。
#include <STC89C5xRC.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P31==0)
{
Delay(20); // 按键抖动
while(P31==0);//松手跳出循环
Delay(20); // 松手检测
P20=~P20; //亮暗交替
}
}
}
6.独立按键控制LED显示二进制
通过不停的按下按键,使得灯以二进制的方式,不断往上加一,达到用灯来表示按键次数
#include <STC89C5xRC.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
unsigned char LEDNum=0;
while(1)
{
if(P31==0)
{
Delay(20);
while(P31==0);
Delay(20);
LEDNum++;
P2=~LEDNum;
}
}
}
7.独立按键控制LED移位
按下P31,往左边移一位;按下P30,往右边移一位,以LED灯来展示。
#include <REGX52.H>
void Delay(unsigned int xms);
unsigned char LEDNum;
void main()
{
P2=~0x01;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)//防止溢出
{
LEDNum=0;
}
P2=~(0x01<<LEDNum);
}
if(P3_0==0)
{
Delay(20);
while(P3_0==0);
Delay(20);
LEDNum--;
if(LEDNum==0)//防止溢出
LEDNum=7;
else
LEDNum--;
P2=~(0x01<<LEDNum);
}
}
}
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms!=0)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
基础知识
二.数码管模块
1.138译码器原理
A B C中C为高位,138译码器可以将可将地址端(A、B、C)的二进制编码在Y0至Y7对应的输出端以低电平译出。Y表示三位二进制对应的十进制数,当Y=0时表示Y0有效,既Y0为0,其余位为1,其他位的输出也是如此。
2.数码管显示原理
数码管分为位选和段选,138译码器控制数码管的位选,通过138译码器选择LED1~8哪个显示数字,74HC245控制数码管段选,显示数字的每个部分实质上是LCD灯,通过点亮不同部分的而实现数字的显示,例如要使第一个数码管显示数字1,在段选的时候就要点亮f段和e段,对应的八位二进制数为1111 0011转化为十六进制为E3,每个数码管可以显示的数字均为0~9,可以通过数组存储每个数字显示的所对应的十六进制断码,进而访问数组的各个元素,实现数码管数字的显示。
3.静态数码管显示
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char m,n;
sbit dula=P2^6; //段选锁存器-使能控制
sbit wela=P2^7; //位选锁存器-使能控制
void Delay_ms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
wela=1; //位选锁存器使能
//P0=0xFE; //1111 1110 :启用第一个数码管-左边第一个
P0=0xFD; //1111 1101 :启用第二个数码管-左边第二个
wela=0;
dula=1; //段选锁存器使能
P0=0X7F; //0111 1111 :显示数字8
dula=0;
while(1)
{
}
}