目录
一.LED灯
1.点亮LED灯
步骤如下:
1.用Keil5创建一个project
2.在search中寻找Atmel的AT89C52
3.在target下的group 添加一个item
4.在项目中输入所需代码 并且在options中的output创建一个hex file
5.在STC中找到STC89C52的芯片类型
6.打开程序--在Keil5中写入的程序(hex file)
7.点击下载并重启单片机即可
代码段:
#include <REGX52.H>
int main ()
{
P2=0x55;//P2是控制LED的I/O口
while (1)//该循环是为了卡住该程序,避免瞬间结束
{
}
}
2.使LED闪烁
需要用到Delay函数,在Stc中获取
#include <REGX52.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main ()
{
while (1)
{
P2=0xfe;
Delay500ms();
P2=0xff;
Delay500ms();
}
}
3.LED流水线
是点亮LED和LED闪烁的结合体,直接上代码
#include <REGX52.H>
#include "Delay.h"
int main ()
{
while(1)
{
P2=0x7F;
Delay500ms() ;//每过0.5秒让下一个LED亮
P2=0xBF;
Delay500ms() ;
P2=0xDF;
Delay500ms() ;
P2=0xEF;
Delay500ms() ;
P2=0xF7;
Delay500ms() ;
P2=0xFB;
Delay500ms() ;
P2=0xFD;
Delay500ms() ;
P2=0xFE;
Delay500ms() ;
}
}
二.独立按键
1.原理图
_
独立按键被P3控制
如按下K1则P3_1=0
注意:此过程会“抖”,需要消抖处理
2.C51数据运算
这些运算会用到,先拿出来看看。
3.上代码,代码内有解释
1.控制LED亮灭
#include <REGX52.H>
void main ()
{
while(1)
{
if(P3_1==0)//检测到K1按下,则P2亮起
{
P2_0=0;
}
else//K1没按下,则P2熄灭
{
P2_0=1;
}
}
}
2.控制LED状态(从这往后,只展示在main里面的代码)
while (1)
{
if(P3_1==0)
{
//Delay(20); 视频中讲述此为消抖处理,但经仔细推敲,只要存在while,就不需要消抖
while(P3_1==0);//若K1还在按下没松开,则卡在此循环
//Delay(20); 而且若此处有消抖处理会出现一些问题,后续会讲
P2_0=~P2_0;//~为取反运算
}
}
3.LED显示二进制
unsigned char n=0;//定义n这个二进制的数是实现二进制的关键
while(1)
{
if(P3_1==0)
{
//Delay(20);
while(P3_1==0);
//Delay(20);
n++;
P2=~n;
}
}
4.实现LED的移位
signed char lednum=0;
P2=~0x80;//此代码为了一开始第一位LED能亮
while (1)
{
if(P3_1==0)
{
// Delay(20);
while(P3_1==0);
// Delay(20);
lednum++;
if(lednum>=8)//若if里面不用加{},则第一个; 前的内容就是if里面的内容
lednum=0;
P2=~(0x80>>lednum);//让0x80右移lednum个长度,再取反
}
if(P3_0==0)
{
// Delay(20);
while(P3_0==0);
// Delay(20);
if(lednum==0)//用K2时需要先判断一步
lednum=7;
else
lednum--;
P2=~(0x80>>lednum);
}
}
三.数码管
1.数码管本质上是各个LED组合在一起
2.上原理图
如原理图所示:P2控制LED的段选, P0控制LED位选
P2是从高位开始,且1是选0是不选。如若P2_4=1;P2_3=0;P2_1=0;则接Y4,即段选是LED5
3.上代码
1.静态数码管显示
#include <REGX52.h>
//Location是段选,Number是位选
void Nixie(unsigned char Location,Number)
{
//这是数码管上显示0~9的数
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
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(8,8);
while (1)
{
}
}
2.动态数码管显示(本质上是通过极快的速度扫描)
void Nixie(unsigned char Location,Number)
{
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
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);
Nixie(2,2);
Nixie(3,3);
}
}
四.模块化编程
1.在main文件中,Keil5软件自带文件的头文件用<>,自己写的头文件用" " 如下所示
2.如图所示,所创建的.c .h文件需要在目录下
3.所创建的头文件需要包含一下三个#,并且在#define和#endif中间写出能调用的函数
注意:最后必须要加; 否则编译时会报错