继续学习单片机
2.8.2 PSW寄存器——了解即可
PSW全称为程序状态字标志寄存器,是一个8位寄存器;位于单片机内特殊功能寄存器区,字节地址D0H;用来存放运算结果的一些特征,如有无进位、借位等;
使用汇编编程时PSW寄存器很有用;但利用C语言编程时,编译器会自动控制该寄存器,很少人为操作它,只需简单了解即可。
1.CY——进位标志位:它表示运算是否有进位(或借位)。如果操作结果在最高位有进位(加法)或借位(减法),则该位为1,否则为0;
2.AC——辅助进位标志,又称半进位标志:它指两个8位数运算低四位是否有半进位,即低四位相加(或相减)是否进位(或借位)。如果有则AC为1,否则为0;
3.F0——由用户使用的一个状态标准位:可用软件来使它置1或清0,也可由软件来测试它,以控制程序的流向;
4.RS1,RS0——4组工作寄存器区选择控制位,在汇编语言中这两位用来选择4组工作寄存器中的哪一组为当前工作寄存区;
5.OV——溢出标志位:反映带符号数的运算结果是否有溢出;有溢出时此位为1,否则为0;
6.P——奇偶标志位:反应累加器ACC内容的奇偶性;如果ACC中的运算结果有偶数个1(如11001100B,其中有4个1),则P为0,否则P为1。
2.8.3 利用C51自带库函数_crol_(),以间隔0.5s在单片机上实现流水灯程序
代码
#include <reg52.h> //52系列单片机头文件
#include <intrins.h> //包含_crol_函数所在的头文件
#define uint unsigned int //宏定义
#define uchar unsigned char
void delayms(uint); //声明子函数
uchar aa; //定义一个变量,用来给P1口赋值
void main() //主函数
{
aa=0xfe; //赋初值11111110
while(1) //大循环
{
P2=aa; //先点亮第一个发光二极管
delayms(500); //延时500毫秒
aa=_crol_(aa,1); //将aa循环左移一位后再赋给aa
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即代表延时x毫秒
for(j=110;j>0;j--);
}
“aa=_crol_(aa,1); ”语句:_crol_是一个带返回值的函数,所以先执行等号右边表达式,即将aa这个变量循环左移一位(aa初值为0xfe,即11111110),得到新值0xfd,并重新赋给aa变量,等到while(1)中的最后一条语句执行完毕,回到第一条语句重新执行,此时aa的值为0xfd,即11111101。
第二篇 内外部资源操作篇
第3章 数码管显示原理及应用实现
3.1 数码管显示原理
数码管分为单位数码管、双位数码管和四位数码管。单位数码管电路图如下:
共阴极数码管:8个发光二极管的阴极连接在一起并接地 ,各个阳极独立;
共阳极数码管:8个发光二极管的阳极连接在一起1并接5V高电平,各个阴极独立;
需要显示什么数字只需要对应的发光二极管发光,即在共阴极数码管上对应的引脚送高电平,或在共阳极数码管上对应的引脚送低电平。
注:数码管内部发光二极管点亮时需要5mA以上的电流,电流不可过大否则会烧坏发光二极管;由于单片机I/O口送不出这么大的电流,所以数码管与单片机连接时需要加驱动电路,可以用上拉电阻或者使用专门的数码管驱动芯片;STC89C52单片机使用的是74HC245D锁存器,其输出电流较大,电路接口简单,可借鉴使用。
3.1.1 数码管内二极管的控制
二位一体、四位一体的数码管内部的各个二极管的公共端是独立的,独立的公共端控制多位一体的数码管某个二极管点亮;负责某位数码管显示什么数字的段线全部是连接在一起的,而连接在一起的段线可以控制单位数码管点亮什么数字;公共端叫做“位选线”,连接在一起的段线叫做“段选线”,凭借这两个线通过单片机及外部驱动电路就可以控制任意数码管显示任意数字。
一般单位数码管有10个引脚,二位数码管也是10个引脚,四位数码管是12个引脚;最直接的检测引脚标号方法就是数字万用表测量,若没有数字万用表也可用5V直流电源串联1kΩ电阻后测量统计。
3.1.2 如何用万用表检测数码管的引脚排列
数字万用表:红色表笔连接表内部电池正极,黑色表笔连接表内部电池负极;当数字万用表置于二极管挡时,两表笔间开路电压约为1.5V,两表笔正确加在二极管两端时,可以点亮发光二极管。
使用方法:将数字万用表置于二极管挡,红表笔接在1脚,用黑表笔接触其他各引脚,假设只有接触9脚时,数码管a段发光,而接触其余引脚不发光;由此可知被测数码管为共阴极结构类型,9脚是公共阴极,1脚则是数码管的a段;接下来黑表笔接9脚,用红表笔接触其他引脚测出标号,即可绘制出该数码管内部结构和引脚排列图。
3.2 数码管静态显示
当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,而“段选”是连接在一起的;
我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示数字始终相同;
因为它们的段选时连接在一起的,所以送入所有数码管的段选信号是相同的,所以显示数字完全相同,数码管的这种显示方法叫做静态显示。
单片机实验板上数码管与单片机连接如下图所示:
查看原理图时标号相同的节点在实际电路中是物理电气相连的,这是为了让原理图看上去简洁整齐。
可以看到图*阴极数码管的所有阳极连接在一起,然后与下面的U1元件73HC573锁存器1的数据输出端相连,锁存器的数据输入端连接单片机的P0口(公司使用的单片机开发板是P1口),P0口同时加了上拉电阻。
数码管中WE1,WE2,WE3,WE4,WE5,WE6是它们的位选端,每一位数码管对应一个位选端,与下面U2元件74HC573的数据输出端的低6位相连,U2的数据输入端也连接到单片机的P0口。两个锁存器的锁存端分别与单片机的P2.6和P2.7相连,这样便可以用单片机控制锁存器的锁存端,进而控制锁存器的数据输出,从而控制任意数码管显示任意数字。
3.2.1 第一个数码管显示一个8字
分析原理:
让第一个数码管显示8字,所以关闭其它数码管的位选,只打开第一个数码管位选;
操作时,先给U2锁存器的锁存端一个高电平,然后将数据从单片机的P0口直接送出到锁存器U2的1数据输出端1,然后再关闭U2锁存端;
由于数码管为共阴极,所以位选选通时为低电平,位选关闭时为高电平,即只有W1端对应数据为0,其他都为1,因此P0口要输出的数据为0xFE(二进制为11111110);
位选确定后,再确定段选,要显示8,那么只有h段为0,其余段都为1,所以接着用同样的方法给U1数据输出端再送一个0x7F(二进制为01111111)。