点亮一个LED
LED发光二极管:Light Emitting Diode
LED正极引脚较长,负极引脚较短
LED正极闪电极较小,负极闪电极较小
SCT89C52单片机的LED是共阳极,我们要控制的是阴极的电平
#include <REGX52.H>
void main()
{
P2=0x55;
while(1){
}
}
LED闪烁
调用延时函数
//延时函数
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms){
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
xms--;
}
}
#include <REGX52.H>
#include <INTRINS.H> //_nop_()函数所在库
voidDelay500ms() //@11.0592MHz
{
unsignedchari, j, k;
_nop_();
i=4;
j=129;
k=119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
voidmain()
{
while(1)
{
P2=0x00;
Delay500ms();
P2=0xFF;
Delay500ms();
}
}
LED流水灯
通过P2寄存器的不断延时赋值,实现了肉眼看到的流水灯
#include <REGX52.H>
#include <INTRINS.H>
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms){
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
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);
}
独立按键控制单个LED
轻触按键:按下时开关接通,松开时开关断开
按下则亮
#include <REGX52.H>
voidmain()
{
while(1)
{
if(P3_1==0)
P2_0=0;
else
P2_0=1;
}
}
一按更换亮暗
按键内部的金属弹片受力弹动来实现接通和断开,所以会有抖动时段,我们要把这个时段消除掉
通过延时函数
#include <REGX52.H>
#include <intrins.h>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0); //判断按键状态,还在按下状态则会一直循环
Delay(20);
P2_0=~P2_0;
}
}
}
独立按键控制LED显示二进制
#include <REGX52.H>
#include <INTRINS.H>
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms){
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
int nub=0;
while(1){
if(P3_1==0){
Delay1ms(20);
while(P3_1==0);
Delay1ms(20);
nub++;
P2=~nub;
}
}
}
独立按键控制LED移位
P3_1右移,P3_0左移
#include <REGX52.H>
#include <INTRINS.H>
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms){
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
xms--;
}
}
unsigned char nub=0;
void main()
{
P2=~0x01;
while(1){
if(P3_1==0){
Delay1ms(20);
while(P3_1==0);
Delay1ms(20);
nub++;
if(nub==8)nub=0;
P2=~(0x01<<nub);
}
if(P3_0==0){
Delay1ms(20);
while(P3_0==0);
Delay1ms(20);
if(nub==0)nub=8;
nub--;
P2=~(0x01<<nub);
}
}
}
静态数码管显示
位选-段选(4个数码管一组)
#include <REGX52.H>
unsigned char table[]={0x3F,0x06,0x5B,0x4F,0X66,0X6D,0X7D,0x07,0x7F,0x6F};
void Nixie(unsigned char location,unsigned char number){
switch(location){
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=table[number];
}
void main(){
Nixie(8,6);
while(1){
}
}
多个数码管动态显示
多个数码管的位选和段选出现了交叉:位选-段选-位选-段选-位选-段选
我们需要进行消影消影,思路是每一数码管位选-段选后回到全灭状态
#include <REGX52.H>
unsigned char table[]={0x3F,0x06,0x5B,0x4F,0X66,0X6D,0X7D,0x07,0x7F,0x6F};
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms--){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void Nixie(unsigned char location,unsigned char number){
switch(location){
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=table[number];
Delay(1);
P0=0x00;
}
void main(){
Nixie(8,6);
while(1){
Nixie(8,6);
Nixie(2,2);
Nixie(3,3);
Nixie(6,6);
}
}