文章目录
- 1. STC89C52单片机介绍
- 2. 单片机预备知识
- 3. LED灯操作系列
- 1. 点亮LED
- (1)LED原理图连接方式
- (2) proteus接线图
- (3)keil代码
- 2. LED灯闪烁
- (1)实验电路图
- (2)keil源代码
- (3)实验结果
- 3. switch条件判断和开关控制流水灯
- (1)实验电路图
- (2)keil源代码
- (3)实验效果
- 4. switch条件判断流水灯
- (1)keil源代码
- (2)实验结果
- 5. 位运算实现流水灯
- (1)keil源代码
- 6. 按键控制流水灯
- (1)实验电路图
- (2)keil源代码
- (3)实验结果
1. STC89C52单片机介绍
-
所属系列:51单片机系列
-
公司:STC公司
-
位数:8位
-
RAM:512字节
-
ROM:8K(Flash)
-
工作频率12MHz
-
单片机版型
-
单片机开发板具体结构
- 超声波模块接口
- NRF24L01无线模块接口
- 无源蜂鸣器
- DS18B20温度传感器接口
- 红外接收头
- 电源开关
- 自动下载电路(CH340转换芯片)
- miniUSB接口(供电或下载程序或串口通信)
- ISP下载接口(为AT及AVR系列单片机下载)
- 复位按键
- LCD12864模块接口
- LCD1602模块接口
- 数码管模块(2个四位一体共阴数码管)
- DS1302时钟模块
- LED模块(8个LED)
- 独立按键模块(4个独立按键)
- 单片机所有IO口(方便用户外扩功能模块)
- 单片机紧缩座
- 矩阵按键模块
- LED点阵模块
- 74HC245芯片(驱动数码管模块)
- 步进电机模块(五线四项步进电机,驱动芯片ULN2003,也可以驱动直流电机)
- 74HC138译码器芯片(控制数码管位选)
- EEPROM模块(24C02芯片)
- 74HC595模块(内含8个LED)
- AD/DA模块
2. 单片机预备知识
-
电平特性
-
数字电路中只有两种电平:高电平和低电平
- 高电平:5V或3.3V,取决于单片机电源;
- 低电平:0V。
-
RS232电平:计算机串口的电平
- 高电平:-12V;
- 低电平:12V。
-
所以当我们用单片机跟电脑通信的时候,我们要通过各种元器件将单片机的电平转换为计算机可识别的电平才能跟电脑进行通信。
-
-
8051单片机内部结构图
-
总线:是计算机各部件之间传送信息的公共通道。微机中有内部总线和外部总线两类。内部总线是CPU内部之间的连线;外部总线是CPU与其他部件之间的连线。外部总线有三种:数据总线、地址总线、控制总线。
-
CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器。
-
RAM:用于存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据。
-
ROM:用以存放程序、一些原始数据和表格。
-
I/O口:四个8位并行I/O口,既可以用作输入又可以用作输出。
-
T/C:两个定时器/计数器,既可以工作在定时模式,也可以工作在计数模式。
-
五个中断源的中断控制系统。
-
一个全双工UART的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信。
-
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振荡频率取决于单片机型号及性能。
-
-
单片机工作的基本时序
-
时钟周期:也称振荡周期, 是指为单片机提供时钟脉冲信号的振荡源的周期,我们开发板上为12MHz。
-
状态周期:每个状态周期为时钟周期的 2 倍, 是振荡周期经二分频后得到的。
-
机器周期:一个机器周期包含 6 个状态周期S1~S6, 也就是 12 个时钟周期。 在一个机器周期内, CPU可以完成一个独立的操作。
-
指令周期:它是指CPU完成一条操作所需的全部时间。 每条指令执行时间都是由一个或几个机器周期组成。MCS - 51 系统中, 有单周期指令、双周期指令和四周期指令。
-
-
单片机IO口的结构
-
上拉电阻就是将不确定的信号通过一个电阻拉到高电平,同时此电阻起到一个限流的作用,下拉就是下拉到低电平。
-
作用:
-
OC门要输出高电平,外部必须加上上拉电阻
-
加大普通IO的驱动能力
-
起到限流的作用
-
抵抗电磁干扰
-
-
-
C-51数据类型扩充定义
-
sfr
:特殊功能寄存器声明sfr 变量名=地址值;
-
sbit
:特殊功能位声明sbit 变量名=地址值;
-
bit
:位变量声明 -
#ifndef…#endif
:条件编译,常用于头文件的定义还有一些程序条件编译#ifndef __LED_H #define __LED_H #endif
-
-
单片机最小系统
- 电源电路
- 复位电路
- 时钟电路
- 下载电路
3. LED灯操作系列
1. 点亮LED
(1)LED原理图连接方式
LED的正极通过电阻连接到电源上,阴极连接P2口,此时只有给P2口低电平的时候,LED灯才会亮。
(2) proteus接线图
(3)keil代码
#include "reg52.h"
//将单片机的P2.0端口定义为led
sbit led=P2^0;
void main()
{
while(1)
{
//P2.0端口设置为低电平
led=0;
}
}
2. LED灯闪烁
(1)实验电路图
电路图与点亮LED灯的电路图相同,设置P2.0口输出低电平的时候,LED灯会点亮;设置P2.0口为低电平的时候,LED灯会熄灭。然后通过一定的延时,可以让LED灯出现闪烁的效果。
(2)keil源代码
#include <reg51.h>
#include "intrins.h"
//延时函数,会提供500ms的延时
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
//灯亮
P2=0xfe;
//延时
Delay500ms();
//灯灭
P2=0xff;
//延时
Delay500ms();
}
}
(3)实验结果
从结果可以看出,LED灯在闪烁,间隔500ms亮灭。
3. switch条件判断和开关控制流水灯
(1)实验电路图
(2)keil源代码
#include<AT89X51.h>
#include "intrins.h"
int t=0,j,i;
void Delay150ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 2;
j = 13;
k = 237;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while (1)
{
if (P3_1==0)
{
Delay150ms(); //消振
if (P3_1==0)
{
t++;
if (t==9)
t=1;
}
}
switch(t)
{
case 1:P2=0xfe;break;
case 2:P2=0xfd;break;
case 3:P2=0xfb;break;
case 4:P2=0xf7;break;
case 5:P2=0xef;break;
case 6:P2=0xdf;break;
case 7:P2=0xbf;break;
case 8:P2=0x7f;break;
default :P2=0xff;break;
}
}
}
(3)实验效果
从实验结果可以看出,每次按键按下的时候,LED灯亮的位置会向右移动一位。
4. switch条件判断流水灯
(1)keil源代码
#include<AT89X51.h>
void delay(unsigned int n)
{
unsigned int i,j;
for (i=n;i>0;i--)
for (j=110;j>0;j--);
}
void main()
{
unsigned int t=0;
while (1)
{
switch(t)
{
case 0:P2=0xfe;delay(250);break;
case 1:P2=0xfd;delay(250);break;
case 2:P2=0xfb;delay(250);break;
case 3:P2=0xf7;delay(250);break;
case 4:P2=0xef;delay(250);break;
case 5:P2=0xdf;delay(250);break;
case 6:P2=0xbf;delay(250);break;
case 7:P2=0x7f;delay(250);break;
default :P2=0xff;delay(250);break;
}
t++;
t=t%8;
}
}
(2)实验结果
5. 位运算实现流水灯
(1)keil源代码
#include<AT89X51.h>
int i,j,t;
int a[8]={0,1,1,1,1,1,1,1};
void delay(int n)
{
for (i=n;i>0;i--)
for (j=150;j>0;j--);
}
void main()
{
while(1)
{
P2=0xff;
delay(250);
for (t=0;t<8;t++)
{
P2=(P2<<1)+a[t];
delay(250);
}
}
}
6. 按键控制流水灯
(1)实验电路图
(2)keil源代码
#include<AT89X51.h>
void delay(int n)
{
unsigned int i,j;
for (i=n;i>0;i--)
for (j=150;j>0;j--);
}
void main()
{
int t;
while (1)
{
if (P3_1==0)
{
P2_0=0; P2_1=0;
delay(250);
P2_0=1; P2_1=1;
delay(250);
}
if (P3_0==0)
{
for (t=0;t<2;t++)
{
P2_2=0; P2_3=0;
delay(250);
P2_2=1; P2_3=1;
delay(250);
}
}
if (P3_2==0)
{
for (t=0;t<3;t++)
{
P2_4=0; P2_5=0;
delay(250);
P2_4=1; P2_5=1;
delay(250);
}
}
if (P3_3==0)
{
for (t=0;t<4;t++)
{
P2_6=0; P2_7=0;
delay(250);
P2_6=1; P2_7=1;
delay(250);
}
}
}
}
(3)实验结果
从实验结果可以看出,用四个按键控制四组LED灯的闪烁,第一组使用按键P31
,前面两个LED灯会闪烁一次;第二组使用按键P30
,第三第四个LED灯会闪烁两次;第三组使用按键P32
控制,第五第六个LED灯会闪烁三次;第四组使用按键P33
控制,最后两个LED灯会闪烁四次(顺序从左向右)。