1.关键字sfr与sbit的区别
sfr是定义寄存器的字节地址,sbit是定义可位寻址的位地址
例如:sfr P1 =0x90;
sbit A = P1^0 sbit B = P1^1;
2. 单片机引脚有:电源引脚、晶振引脚、复位引脚、下载引脚、GPIO引脚
其中晶振引脚主要是用来提供外部时钟,驱动指令执行,GPIO引脚包含P0、P1、P2、P3 四个端口
3.点亮一个LED灯
从电路图可以得知,LED是P2端口,我们给P2.0针脚一个低电压,也就是0V,就会点亮第一个,程序如下
#include"reg52.h" //引用头文件
int main()
{
P2 = 0xFE; //1111 1110 代表P2.0----P2.7引脚的输出电压状态
while(1)
{
}
return 0;
}
那如果我给P2端口所有引脚输出低电压,P2=0x00;那所有LED就会点亮,如下图
2.LED灯闪烁
通过输出高低电平来控制LED灯闪烁,但由于人眼余晖效应,无法去观看到闪烁情况,就得需要通过延时来达到效果,程序如下
#include"reg52.h" //引用头文件
void Delay(int time)
{
while(time--) //while循环一次需要10us
{
}
}
int main()
{
while(1)
{
P2 = 0xFF;
Delay(50000); //延时大约450ms
P2 = 0xFE;
Delay(50000); //延时大约450ms
}
return 0;
}
实验现象如下
3.LED灯流水灯效果
知道闪烁原理后,我们就可以将所有引脚依次输出0V、延时、输出5V,就能达到流水灯效果,但这样写太呆板,咱们利用C语言for循环,再进行位运算就可以简单达到效果,程序如下
#include"reg52.h" //引用头文件
void Delay(int time)
{
while(time--) //while循环一次需要10us
{
}
}
int main()
{
int i = 0;
while(1)
{
for(i=0;i<8;i++)
{
P2=~(0x01< Delay(50000);
}
}
return 0;
}
实验现象如下
4.独立按键控制LED灯亮灭
根据电路板接线图发现独立按键1按下时,对应的P3^1的引脚是低电平,松开是高电平,那就可以编写程序,加入if判断,程序如下
#include"reg52.h"
sbit KEY1 = P3^1; //需要注意按键1是P3^1引脚,按键2是P3^0引脚
int main()
{
while(1)
{
if(KEY1==0)
{
P2=0xFE;
}
else
P2=0xFF;
}
}
实验现象如下
5.独立按键控制LED灯状态
亮灭实验完成后,就可以控制LED状态,首先我们知道由于机械结构的d性作用,按键开关在闭合时不会一瞬间稳定的接通,在断开时,也不会一下子断开。 所以就得需要程序消抖,也就是适当延时,程序如下
#include"reg52.h"
//定义LED灯
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;
//定义独立按键
sbit KEY1 = P3^1; //需要注意按键1是P3^1引脚,按键2是P3^0引脚
sbit KEY2 = P3^0;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;
void Delay(int time)
{
while(time--) //while循环一次需要10us
{
}
}
int main()
{
while(1)
{
if(KEY1==0)
{
Delay(500);
while(KEY1==0);
Delay(500);
LED1 =~ LED1;
}
}
}
实验现象如下
6.独立按键控制LED灯显示二进制
LED亮灭和控制LED状态实验都已完成,控制LED灯显示二进制就是直接对LED灯P2进行 *** 作,在初始状态下,P2的所有引脚都是输出高电平,那我们直接对P2自减 *** 作就能达到实验效果,程序如下
#include"reg52.h"
//定义独立按键
sbit KEY1 = P3^1; //需要注意按键1是P3^1引脚,按键2是P3^0引脚
void Delay(int time)
{
while(time--) //while循环一次需要10us
{
}
}
int main()
{
while(1)
{
if(KEY1==0)
{
Delay(500);
while(KEY1==0);
Delay(500);
P2--;
}
}
}
实验现象如下
7.独立按键控制LED灯移位
通过控制独立按键KEY1、KEY2来实现左右移位,程序如下
#include"reg52.h"
//定义独立按键
sbit KEY1 = P3^1; //需要注意按键1是P3^1引脚,按键2是P3^0引脚
sbit KEY2 = P3^0;
void Delay(int time)
{
while(time--) //while循环一次需要10us
{
}
}
int main()
{
int num = -1;
while(1)
{
//LED灯右移
if(KEY1==0)
{
Delay(500);
while(KEY1==0);
Delay(500);
num++;
if(num>=8)
num=0;
P2 =~ (0x01<
}
//LED灯左移
if(KEY2==0)
{
if(num<=0)
num=8;
else
{
Delay(500);
while(KEY2==0);
Delay(500);
num--;
P2 =~ (0x01<
}
}
}
实验现象如下
8.静态数码管显示
点亮数码管需要用到P0端口和P2部分端口,P0端口负责显示要输出的数字,P2部分端口负责让哪个数码管点亮,具体的去看电路图,这次还包含了74HC245和74HC138芯片
现在让单片机数码管区域第三位的数码管显示数字5,程序如下
#include"reg52.h"
//定义P2端口
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//用数组来表示数码管上每个数字输出对应的相关电平输入
int str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f};
void Display(int Location,int Number)
{
//利用case语句将8个数码管显示的位置一一列举
switch(Location)
{
case 1: LSC=0;LSB=0;LSA=0; break;
case 2: LSC=0;LSB=0;LSA=1; break;
case 3: LSC=0;LSB=1;LSA=0; break;
case 4: LSC=0;LSB=1;LSA=1; break;
case 5: LSC=1;LSB=0;LSA=0; break;
case 6: LSC=1;LSB=0;LSA=1; break;
case 7: LSC=1;LSB=1;LSA=0; break;
case 8: LSC=1;LSB=1;LSA=1; break;
}
P0=str[Number];
}
int main()
{
Display(3,5); //参数1表示数码管位置,参数2表示要输出的0-9的数字
while(1)
{
}
}
实验现象如下
9.动态数码管显示
这部分主要是注意延时和消除残影的问题,如不加延时的,两个数字切换的非常快,可能会导致篡位,程序如下
#include"reg52.h"
//定义P2端口
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//用数组来表示数码管上每个数字输出对应的相关电平输入
int str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f};
void Delay(int time)
{
while(time--) //while循环一次需要10us
{
}
}
void Display(int Location,int Number)
{
//利用case语句将8个数码管显示的位置一一列举
switch(Location)
{
case 1: LSC=0;LSB=0;LSA=0; break;
case 2: LSC=0;LSB=0;LSA=1; break;
case 3: LSC=0;LSB=1;LSA=0; break;
case 4: LSC=0;LSB=1;LSA=1; break;
case 5: LSC=1;LSB=0;LSA=0; break;
case 6: LSC=1;LSB=0;LSA=1; break;
case 7: LSC=1;LSB=1;LSA=0; break;
case 8: LSC=1;LSB=1;LSA=1; break;
}
P0=str[Number];
//延时一段时间,等待显示稳定,如果不加延时,就可能上一个数字和下一下篡位
Delay(100);
//消除数码管残影
P0=0x00;
}
int main()
{
//参数1表示数码管位置,参数2表示要输出的0-9的数字
while(1)
{
Display(1,1);
Display(2,2);
Display(3,3);
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)