第一节:51单片机的基本介绍
一、单片机简介
- 单片机,英文Micro Controller Unit,简称MCU。内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等-系列电脑的常用硬件功能
- 单片机的任务是信息采集 (依靠传感器) 、处理 (依靠CPU) 和硬件设备(例如电机,LED等)的控制单片机
- 跟计算机相比,单片机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用。同时,学习使用单片机是了解计算机原理与结构的最佳选择
二、命名规则与管脚图片
VCC代表电源正极,GND代表电源负极。
命名规则
单片机内部结构图
STC89C52系列单片机的内部结构框图如下图所示。
STC89C52单片机中包含中央处理器(CPU)、程序存储器(Flash)、数据存储器(SRAM)、定时/计数器、UART串口、VO接口、EEPROM、看门狗等模块。
开发版基本模块以及对应模块原理图
注:编号相同的地方代表它们之间有线相连
第二节:LED模块
一、点亮一个LED
1.LED介绍
2.LED原理图
1.电阻大小确认方式:最后一位为10的n次方 eg.2308 230*10^8
2.电阻作用:限流电阻,防止LED因电流过大而烧毁
3.电源正负极:**++不亮,+ - 亮。**因此 控制单片机引脚输出高低电频
TTL: 高电频 5V,低电频 0V,控制单片机的P2口输出高低电频
3、CPU通过配置寄存器控制硬件电路
4.二进制转换
5、点亮一个LED的代码
#include <REGX52.H>
void main()
{
P2=0x55;//1111 1110
while(1)
{
}
}
然后再将代码保存,用软件stc-isp对接单片机,控制单片机点亮。
二、LED闪烁
1.利用ISP中的软件延时计算器
记得设定系统频率与定时长度,然后生成C代码,复制代码到keil中使用。
加头文件#include< INTRINS.H>;
2.LED闪烁代码
#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;
Delay500ms();
P2=0xFF;
Delay500ms();
}
}
三、LED流水灯
LED流水灯代码
#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
Delay500ms();
P2=0xFD;//1111 1101
Delay500ms();
P2=0xFB;//1111 1011
Delay500ms();
P2=0xF7;//1111 0111
Delay500ms();
P2=0xEF;//1110 1111
Delay500ms();
P2=0xDF;//1101 1111
Delay500ms();
P2=0xBF;//1011 1111
Delay500ms();
P2=0x7F;//0111 1111
Delay500ms();
}
}
第三节、独立按键
原理图
1.独立按键介绍
2.按键的抖动
按键消抖方法:1.硬件消除 2.软件程序消抖 延时20ms 等抖动过去再开始执行程序。
3.一个独立按键按下LED亮,松开LED灭
#include <REGX52.H>
//长按独立按键,LED点亮
void main()
{
while(1)
{
if(P3_1==0){
P2_0=0;
}
else{
P2_0=1;
}
}
}
4.独立按键按一次亮,再按一次灭
#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){
Delay(20);
while(P3_1==0);
Delay(20);
P2_0=~P2_0;
}
}
}
5.独立按键控制LED二进制闪烁
#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);
}
}
void main()
{
unsigned char LEDNum=0;
while(1)
{
if(P3_1==0){
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
P2=~LEDNum;
}
}
}
6.独立按键控制LED左右移位
#include <REGX52.H>
void Delay(unsigned int xms);
unsigned char LEDNum;
void main()
{
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);
}
}
}
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
第四节、LED数码管
原理图
COM共阴极,GRN共阳极。
1.LED数码管介绍
2.数码管引脚定义
一、一位数码管:
左图: 由八个LED组成(ABCDEFG DP 段),对应一个字节八位,上面一个图是共阴极连接,下面是共阳极连接。
右图:十个引脚,3,8号为共级引脚,就近引出。
控制数码管显示数字:
例:显示数字6:需要将ACDEFG点亮,其余熄灭。
共阴极:公共端 (负极)接地 位选端 0,ACDEFG高电平,其余低电平。
共阳极:公共端接VCC,ACDEFG低电平,其余高电平。
二、四位一体数码管:(开发板)
1.引脚序号12个,上面图为共阴极连接,下面图为共阳极连接。
2 .四位数码管分为四个单元,公共端单独引出,所有相同字母的LED连在同一个引脚 8+4=12。
静态一位数字显示
例:第三位显示数字1:共阴极
公共端第三个单元给0(正负极相接短路,单元永远不会亮),其余公共端给1;BC段引脚给1,其余给0。
缺点:同一时刻只能有一个数码管被点亮,即使有多个被点亮,显示的数据也是相同的。
优点:引脚数较少,操作方便。
动态数码管显示
想要点亮多个不同数字,利用人眼暂留,数码管显示余辉效应,
很块地在不同单元出现数字,循环,就可以显示。
3.138译码器介绍
作用:将8条线转化为3条线(数码管上8个公共端8条线,利用进制转化为ABC上的三条线)
CBA ----- Y
0 0 0 ---- Y0
二进制—十进制 (000 到 111 ,0~7)
静态数码管显示代码1
#include <REGX52.H>
//在LED6上输出一个数字6
void main()
{
P2_4=1;
P2_3=0;
P2_2=1;
P0=0x7D;
while(1)
{
}
}
静态数码管显示代码2(利用子程序简化输入)
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void NixieTube(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()
{
NixieTube(7,2);
while(1)
{
}
}
动态数码管
1.改变主函数
循环在123位上分别显示123,利用人眼余辉效应看起来像静态123
while(1)
{
NixieTube(1,1);
NixieTube(2,2);
NixieTube(3,3);
}
2.消影:
位选 段选 位选 段选(段选与位选之间时间过短,导致数字串位,需要段选后先清零)用Delay函数。
P0=NixieTable[number];
Delay(1);
P0=0x00;
3.动态数码管代码(在123位上分别显示123)
注意Delay函数的频率为11.059
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
void NixieTube(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)
{
NixieTube(1,1);
NixieTube(2,2);
NixieTube(3,3);
}
}
4.补充段码表与其他(LED八小段共阴极)