stc89c52-操作LED相关代码
点亮一个LED灯
原理:查阅手册可得,stc是8位的,那么板子上LED灯对应有8个,他们都接在P2系列端口(P20-P27是LED模块)。当给相应端口设置为低电平0时,这个端口的LED才会亮起,下图点亮的是P27端口的D8灯,代码中对应设置P2=0x7F,0x代表十六进制
#include <REGX52.H>
//加上这个头文件可以识别出变量P2
void main()
{
P2=0x7F;// 二进制0111 1111转换成十六进制0xFE
//死循环让程序一直运行,持续看到灯被点亮
while(1)
{
}
}
LED闪烁
原理:在while循环里加延时函数Delay500ms(),实现一闪一灭,间隔时长为500ms
这个Delay500ms()函数直接由stc-isp生成:选择与单片机对应的晶振频率->设置定时长度注意单位->STC89Cxx系列选择STC-Y1指令集->复制代码
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();//这个可以不要,去掉之后就不用加第二个头文件#include <INTRINS.H>
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
//D8灯会先亮然后间隔500ms后再灭...一直这样交替变化
P2=0x7F; //0111 1111
Delay500ms();
P2=0xFF; //1111 1111
Delay500ms();
}
}
LED流水灯
原理:挨个点亮,每点亮一颗LED就时延500ms,如此循环
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0XFE; //1111 1110 D1灯
Delay500ms();
P2=0XFD; //1111 1101 D2灯
Delay500ms();
P2=0XFB; //1111 1011 D3灯
Delay500ms();
P2=0XF7; //1111 0111 D4灯
Delay500ms();
P2=0XEF; //1110 1111 D5灯
Delay500ms();
P2=0XDF; //1101 1111 D6灯
Delay500ms();
P2=0XBF; //1011 1111 D7灯
Delay500ms();
P2=0X7F; //0111 1111 D8灯
Delay500ms();
}
}
LED流水灯Plus控制流水速度
原理:用stc-isp生成Delay1ms()函数,再修改Delay1ms()函数,给它传入一个形参,这个形参用来表示任意想要设置的时延
#include <REGX52.H>
//给Delay1ms传入一个无符号整数xms
void Delay1ms(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 199;
do
{
while (--j);
}while (--i);
xms--;//每循环一次减1毫秒
}
}
void main()
{
while(1)
{
P2=0XFE; //1111 1110
Delay1ms(800);//800毫秒时延
P2=0XFD; //1111 1101
Delay1ms(800);
P2=0XFB; //1111 1011
Delay1ms(100);
P2=0XF7; //1111 0111
Delay1ms(100);
P2=0XEF; //1110 1111
Delay1ms(100);
P2=0XDF; //1101 1111
Delay1ms(100);
P2=0XBF; //1011 1111
Delay1ms(100);
P2=0X7F; //0111 1111
Delay1ms(100);
}
}
独立按键控制LED亮灭
原理:当检测到独立按键P3系列端口为低电平0,就代表对应按键被人按下,让按键被按下后再进行点亮LED操作
#includ <REGX52.H>
void main()
{
while(1)
{
if(P3_1==0)//如果按键K1别按下,P2_1端口就会变成低电平0
{
P2_0=0;//按下按键K1就灯D1亮
}
else
{
P2_0=1;//松开P3_1端口就恢复为高电平1,灯D1灭
}
}
}
独立按键控制LED亮灭带消抖
原理:当我们按下和松开按键时,会产生下沿和上沿抖动,我们可以采取在按下按键后添加20ms延时和松开按键后加20ms延时的方法来消除抖动
#include <REGX52.H>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_1==0)
{
Dalay(20);//按下按键后加20ms延时
while(P3_1==0);//没松手之前让程序一直"停留"在这执行空语句
Dalay(20);//松手就跳出了上一个while循环,紧接着加20ms的延时
P2_0=~P2_0;//上电默认P2_0为高电平1,取反后为低电平0,所以第一次按下后灯D1会一直亮着
//第二次按下按键时,P2_0为上次循环后的状态即低电平0,取反后为高电平1,所以第二次按下后会一直灭
//...
}
}
}
独立按键控制LED以二进制显示
原理:设置一个LED操作数LEDNum,让LEDNum以转换成二进制形式自增,再取反赋给整个P2系列端口
#include <REGX52.H>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
unsigned char LEDNum=0;//设置LED操作数
void main()
{
while(1)
{
if(P3_1==0)
{
//消抖
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;//第一次按下按键后LEDNum自增1变为0000 0001
P2=~LEDNum;//第一次按下按键后对LEDNum取反,所以P2=1111 1110,灯D8亮
/*
LEDNum++;//第二次按下按键后LEDNum自增1变为0000 0010
P2=~LEDNum;//第二次按下按键后对LEDNum取反,所以P2=1111 1101,灯D7亮
LEDNum++;//第三次按下按键后LEDNum自增1变为0000 0011
P2=~LEDNum;//第三次按下按键后对LEDNum取反,所以P2=1111 1100,灯D7、D8亮
如此循环下去,灯以二进制形式被点亮...
*/
}
}
}
独立按键控制LED移位
原理:通过设置LED操作数LEDNum来控制0000 0001中’1’的移位,再将结果取反赋给P2系列端口,实现的功能为按下按键K1(P3_1端口)左移,按下按键K2(P3_0端口)右移
#include <REGX52.H>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
unsigned char LEDNum=0;//设置LED操作数
void main()
{
P2=~0x01;//初始点亮D1灯
while(1)
{
//P3_1端口控制LED从D1->D8方向亮
if(P3_1==0)
{
//消抖
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum==8)
LEDNum=0;
P2=~(0x01<<LEDNum);//0000 0001 将1左移LEDNum位
}
//P3_0端口控制LED从D8->D1方向亮
if(P3_0==0)
{
//消抖
Delay(20);
while(P3_0==0);
Delay(20);
LEDNum--;
if(LEDNum==0)
LEDNum=7;
else
LEDNum--;
P2=~(0x01<<LEDNum);//0000 0001 将1右移上一个LEDNum-1位
}
}
}