好久没有更新了,前两个月在复习备考,9月底刚刚考过,希望能有好结果吧~
这一讲接着讲流水灯,涉及到段选和位选,以及介绍了中断的知识。
先介绍一下使用的单片机的主控引脚:
![](https://i-blog.csdnimg.cn/blog_migrate/6438153ab90b896058796851a8331d08.png)
- 总线型引脚定义:
- RST/Vpd: RST是复位端,高电平持续24个振荡周期,就可以复位,指针就回到最开始的语句。Vpd给RAM提供备用电源
- 同一个口的不同值由寄存器里的值控制
- P3.0/RXD: RXD 串行输入口
- P3.1/TXD:TXD串行输出口
- P3.2,INT0一横,P3.3 INT1一横,外部中断0和外部中断1
- T0/T1: 计时器0和计时器1
- P3.6 WR一横:外部寄存器的写选通
- P3.7 RD一横:外部寄存器的读选通
- XTAL2,XTAL1:外部晶振的输入端
- 晶振
- Vss: 接地
- PDEN一横:一般不用
- ALE/PROG一横:第二功能,输出1/6晶振频率的方波
- EA一横:内部存储器选择控制端
- P0口没有上拉电阻,P1 P2 P3内部有上拉电阻
- 特殊功能寄存器
- 数码管如何显示字符
- 看是共阴极还是共阳极
- 要显示什么数字,要先确定那几个笔画需要显示,再确定管脚
- 段选和位选
WE1就是位选,其他是段选。因为第几个数码管和每个数码管上的每个笔画都是由P0口控制的,所以要由位选段选来控制什么时候控制选数码管还是选数码管上的笔画。
来编程让第一个数码管显示1:
#include<reg52.h>
sbit dula=P2^6;
sbit wela=P2^7;
void main()
{
wela=1; //启动位选
P0=0xfe; // 第一个启动,WE1=0,其他为1
wela=0; //WELA=0, 低电平,锁存上一次的输出结果
dula=1; //启动段选
P0=0x06; //数字1, b, c两段是亮的,即编号4和6管脚导通
dula=0;
}
这是静态控制。
利用人眼的残留效应和数码管的余晖可以实现动态显示。
下面这段让6个数码管同时亮,并且同时按1,2,3……循环变化:
#include<reg52.h>
sbit dula=P2^6;
sbit wela=P2^7;
#define uint unsigned int
#define uchar unsigned char
void delay(uint);
uchar num;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};
void main()
{
wela=1;
P0=0xc0;
wela=0;
while(1)
{
for(num=0;num<16;num++)
{
dula=1;
P0=table[num];
dula=0;
delay(5);
}
}
}
void delay(uint z)
{
uint x,y;
for (x=z; x>0; x--)
{
for (y=5000;y>0;y--)
{}
}
}
中断
- 中断的概念:CPU在处理某时间A时,发生了另外一件事B请求CPU处理(中断发生);CPU暂时中断当前工作,去处理B(中断响应或者中断服务);当处理完B后,CPU再回到原先A被中断的地方继续处理A(中断返回);这个过程被称为中断。
- 中断可以嵌套;
- 中断的地方被称为断点,引起CPU中断的根源被称为中断源
- 80C51有5个中断源,2个优先级,可以实现二级中断嵌套
- 中断允许寄存器IE是一个特殊功能寄存器,之前学的都是I/O口的寄存器。
位序号 |
位符号 |