目录
1.LED灯
1.1点亮第一个LED灯
1.1.1添加工程
在file中点击新建项目project,选择合适的文件夹新建,选择89C52(视频中是找的Atmel,然而如果是最新的kail5,是找不到Atmel的,因为Atmel被收购了,这时选择microchip中选择即可或者进行搜索)
1.1.2点亮LED
先写主函数,p2对应的是一个LED灯。
注意:那个头文件需要右击选择open此头文件即可,而且需要用16进制。
写好后如下
#include <REGX52.H>
void main()
{
P2=0xFE;//1111 1110
}
打开stc-isp选择hex文件打开,下载程序,然后重启单片机即可。
1.1.3LED灯闪烁
这里需要引入一个新的知识,延迟,因为如果你正常写程序的话,灯由于闪烁太快,无法被人眼捕捉,因此要引入delay。
在主函数中引用该函数即可。
1.1.4LED流水线
多次循环利用1.1.3的内容,轮换亮灯的位置即可。
2.独立按键
2.1独立按键基本知识
独立按键被p3控制
2.2独立按键控制LED亮灭
#include <REGX52.H>
void main ()
{
while(1)
{
if(P3_1==0)
{
P2_0=0;
}
else
{
P2_0=1;
}
}
}
按下亮,松开灭。
2.3独立按键控制LED状态
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz
{
while(xms)
{
unsigned char i, j;
i = 2;
j = 239;
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;
}
}
}
至于这个Delay,是因为按键按下时会有抖动,大概在10-15ms,为了规避这个对按键按下的影响,所以定义了一个Delay函数,并对其进行调用。
按一次亮,再按一次灭。
2.4独立按键控制LED展示二进制
#include <REGX52.H>
void Delay(unsigned int xms)
{
while (xms)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}void main()
{
while (1)
{
if (P3_1 == 0)
{
Delay(20);
while (P3_1 == 0);
Delay(20);
P2--;
}
}
}
另一种写法是运用~
unsigned char n=0;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
n++;
P2=~n;
}
}
2.5独立按键控制LED移位
#include <REGX52.H>
void Delay(unsigned int xms)
{
while (xms)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
}
while (--i);
xms--;
}
}void main()
{
unsigned char LEDNum;
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);
if (LEDNum == 0)
{
LEDNum = 7;
}
else
{
LEDNum--;
}
P2 = ~(0x01 << LEDNum);
}
}
}
3.数码管
3.1数码管结构
数码管就是通过线路将各个LED灯连接在一起。
如原理图所示:P2控制LED的段选, P0控制LED位选。
读取时从低位向高位读取,P2_2为高位P2_4为地位,例如P2_4 = 1; P2_3 = 0; P2_2 = 1,那么表示的就是LED6这个接口。
3.2静态数码管显示
#include <REGX52.H>
unsigned char NixieTable[] = {0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
void Nixie(unsigned char Location, 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 = NixieTable[Number];
}
void main()
{
Nixie(2, 3);
while (1)
{
}
}
3.3动态数码管显示
#include <REGX52.H>
void Delay(unsigned int xms)
{
while (xms)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
unsigned char NixieTable[] = {0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
void Nixie(unsigned char Location, 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 = NixieTable[Number];
Delay(1);
P0=0x00;
}
void main()
{
while (1)
{
Nixie(1, 1);
// Delay(2);
Nixie(2, 3);
// Delay(2);
Nixie(4, 6);
// Delay(2);
}
}