刘晓凤
摘 要:采用动态扫描方式驱动数码管一般外围硬件较少,但是对单片机资源耗用巨大。介绍了单片机直接驱动8位数码管时利用定时器中断解决动态扫描工作方式下对单片机时间资源占用的问题。
关键词:单片机;定时器中断;数码管驱动
数码管的显示方式可以分为动态和静态两种。动态扫描方式,是利用发光二极管的余辉效应和人眼的视觉暂留效应来实现的,只要在一定时间内数码管的笔段亮的频率够快,人眼就看不出闪烁,一般外围硬件较少,但是对单片机资源耗用巨大。静态的也较锁存方式,单片机送出数据后控制外围锁存器件锁存数据,这样数码管笔段里的电流不变,数码管稳定显示,这样单片机可以干别的活不用管数码管了。这种方案的优点是对单片机的P口资源和时间耗用很少,但是数码管的外围辅助电路复杂。
多位数码管的常用驱动方法有:
1.不需要芯片的驱动方式,扫描显示
这种方式a~g和DP一共8根线分别占用单片机8个端口线,一般是一整个P口,然后有几位数码管就另外需要几个控制线作为片选。对于MCU的时间占用几乎是全时的,如果没有其他的任务或者其他的任务耗用时间很少可以考虑这种显示方式,比如时钟、温度计等等。
2.74LS164、74HC595等通用移位寄存器驱动
这是一种带锁存的串入并出芯片,需要占用单片机的2或3根线,如果需要多位驱动,一般使用译码器进行快速线选,或者使用权移位寄存器级联的方式实现,这种驱动方式采用扫描显示,对单片机端口的耗用比较少,但是因为是扫描方式所以对单片机时间耗用还是全时的。
3.MAX7219、HD7279、BC7281、ZLG7289、ZLG7290、WH8280、CH451、CH452等专用LED数码管驱动芯片驱动
这是驱动LED数码管最理想的芯片,从典型应用电路上看外围元件极少,直接驱动,最吸引人的是使用了串行接口,只要三根线就可以驱动多达8位的数码管,而且在送完数据后就不用管了,自己消零消隐,有些芯片还带有8*8的键盘接口(键盘输入的时候,从串口输出键盘编码供单片机读取),但这种驱动方法往往价格比较昂贵。
本文重点介绍单片机直接驱动8位数码管时利用定时器中断解决动态扫描工作方式下对单片机时间资源占用的问题。单片机直接驱动8位数码管的电路如右图所示,电路中数码管的a~h共8根线分别占用单片机8个端口线,连接到P0口,8位数码管的公共端(公共阳极)连接到单片机的P2口,作为数码管动态扫描时的片选,该端口通过上拉电阻与电源相连,以提高驱动能力,电路实际制作时,若驱动能力不够,应考虑使用三极管驱动电路或驱动芯片。
在程序设计中,本人将数码管的驱动程序放在定时器T0的中断服务子程序中,定时器每申请一次中断,点亮一位数码管,在下一次中断时,再点亮下一位数码管,中断八次后,八位数码管依次点亮了一遍,重新回到第一位数码管,再依次点亮。
程序如下:
#include“reg51.h”
#define DB P0
#define AB P2
unsigned char w=5,buffer[8]={10,10,10,10,10,10,10,10};
unsigned char h=8,m=30,s=0;
unsigned int time;
unsigned char code dsW[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code dsB[ ]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,
0xbf};
void T0_int( ) interrupt 1
{TH0=(65536-1843)/256;TL0=(65536-1843)%256;//定时器T0重置初值DB=0xff;//清屏
AB=~dsW[w];//送数码管片选代码
DB=dsB[buffer[w];//送相应数码管的段代码
w++;if(w>7)w=0;//准备点亮下一位数码管
/*********以下为数字钟程序********/
time++;
if(time>=250){buffer[2]=buffer[5]=10;}
if(time>=500) {buffer[2]=buffer[5]=11;s++;time=0;}
if(s>59) {s=0;m++;}
if(m>59) {m=0;h++;}
if(h>23) h=0;
buffer[0]=h/10;buffer[1]=h%10;
buffer[3]=m/10;buffer[4]=m%10;
buffer[6]=s/10;buffer[7]=s%10;
/*********以上为数字钟程序********/
}
main()
{TH0=(65536-1843)/256;TL0=(65536-1843)%256;
TMOD=0x01;EA=1;ET0=1;TR0=1;
while(1);
}
程序中,由于数码管的驱动放在定时器T0的中断服务子程序中,只在响应T0中断服务子程序时执行并占用MCU时间,其余MCU时间空闲,很好地解决了动态扫描时单片机被全时占用的问题。为避免数码管抖动,定时器中断间隔不宜过长,本文中定时器中断间隔时间为2ms。
(作者单位 江苏省溧水中等专业学校)
?誗编辑 薛直艳
摘 要:采用动态扫描方式驱动数码管一般外围硬件较少,但是对单片机资源耗用巨大。介绍了单片机直接驱动8位数码管时利用定时器中断解决动态扫描工作方式下对单片机时间资源占用的问题。
关键词:单片机;定时器中断;数码管驱动
数码管的显示方式可以分为动态和静态两种。动态扫描方式,是利用发光二极管的余辉效应和人眼的视觉暂留效应来实现的,只要在一定时间内数码管的笔段亮的频率够快,人眼就看不出闪烁,一般外围硬件较少,但是对单片机资源耗用巨大。静态的也较锁存方式,单片机送出数据后控制外围锁存器件锁存数据,这样数码管笔段里的电流不变,数码管稳定显示,这样单片机可以干别的活不用管数码管了。这种方案的优点是对单片机的P口资源和时间耗用很少,但是数码管的外围辅助电路复杂。
多位数码管的常用驱动方法有:
1.不需要芯片的驱动方式,扫描显示
这种方式a~g和DP一共8根线分别占用单片机8个端口线,一般是一整个P口,然后有几位数码管就另外需要几个控制线作为片选。对于MCU的时间占用几乎是全时的,如果没有其他的任务或者其他的任务耗用时间很少可以考虑这种显示方式,比如时钟、温度计等等。
2.74LS164、74HC595等通用移位寄存器驱动
这是一种带锁存的串入并出芯片,需要占用单片机的2或3根线,如果需要多位驱动,一般使用译码器进行快速线选,或者使用权移位寄存器级联的方式实现,这种驱动方式采用扫描显示,对单片机端口的耗用比较少,但是因为是扫描方式所以对单片机时间耗用还是全时的。
3.MAX7219、HD7279、BC7281、ZLG7289、ZLG7290、WH8280、CH451、CH452等专用LED数码管驱动芯片驱动
这是驱动LED数码管最理想的芯片,从典型应用电路上看外围元件极少,直接驱动,最吸引人的是使用了串行接口,只要三根线就可以驱动多达8位的数码管,而且在送完数据后就不用管了,自己消零消隐,有些芯片还带有8*8的键盘接口(键盘输入的时候,从串口输出键盘编码供单片机读取),但这种驱动方法往往价格比较昂贵。
本文重点介绍单片机直接驱动8位数码管时利用定时器中断解决动态扫描工作方式下对单片机时间资源占用的问题。单片机直接驱动8位数码管的电路如右图所示,电路中数码管的a~h共8根线分别占用单片机8个端口线,连接到P0口,8位数码管的公共端(公共阳极)连接到单片机的P2口,作为数码管动态扫描时的片选,该端口通过上拉电阻与电源相连,以提高驱动能力,电路实际制作时,若驱动能力不够,应考虑使用三极管驱动电路或驱动芯片。
在程序设计中,本人将数码管的驱动程序放在定时器T0的中断服务子程序中,定时器每申请一次中断,点亮一位数码管,在下一次中断时,再点亮下一位数码管,中断八次后,八位数码管依次点亮了一遍,重新回到第一位数码管,再依次点亮。
程序如下:
#include“reg51.h”
#define DB P0
#define AB P2
unsigned char w=5,buffer[8]={10,10,10,10,10,10,10,10};
unsigned char h=8,m=30,s=0;
unsigned int time;
unsigned char code dsW[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code dsB[ ]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,
0xbf};
void T0_int( ) interrupt 1
{TH0=(65536-1843)/256;TL0=(65536-1843)%256;//定时器T0重置初值DB=0xff;//清屏
AB=~dsW[w];//送数码管片选代码
DB=dsB[buffer[w];//送相应数码管的段代码
w++;if(w>7)w=0;//准备点亮下一位数码管
/*********以下为数字钟程序********/
time++;
if(time>=250){buffer[2]=buffer[5]=10;}
if(time>=500) {buffer[2]=buffer[5]=11;s++;time=0;}
if(s>59) {s=0;m++;}
if(m>59) {m=0;h++;}
if(h>23) h=0;
buffer[0]=h/10;buffer[1]=h%10;
buffer[3]=m/10;buffer[4]=m%10;
buffer[6]=s/10;buffer[7]=s%10;
/*********以上为数字钟程序********/
}
main()
{TH0=(65536-1843)/256;TL0=(65536-1843)%256;
TMOD=0x01;EA=1;ET0=1;TR0=1;
while(1);
}
程序中,由于数码管的驱动放在定时器T0的中断服务子程序中,只在响应T0中断服务子程序时执行并占用MCU时间,其余MCU时间空闲,很好地解决了动态扫描时单片机被全时占用的问题。为避免数码管抖动,定时器中断间隔不宜过长,本文中定时器中断间隔时间为2ms。
(作者单位 江苏省溧水中等专业学校)
?誗编辑 薛直艳
摘 要:采用动态扫描方式驱动数码管一般外围硬件较少,但是对单片机资源耗用巨大。介绍了单片机直接驱动8位数码管时利用定时器中断解决动态扫描工作方式下对单片机时间资源占用的问题。
关键词:单片机;定时器中断;数码管驱动
数码管的显示方式可以分为动态和静态两种。动态扫描方式,是利用发光二极管的余辉效应和人眼的视觉暂留效应来实现的,只要在一定时间内数码管的笔段亮的频率够快,人眼就看不出闪烁,一般外围硬件较少,但是对单片机资源耗用巨大。静态的也较锁存方式,单片机送出数据后控制外围锁存器件锁存数据,这样数码管笔段里的电流不变,数码管稳定显示,这样单片机可以干别的活不用管数码管了。这种方案的优点是对单片机的P口资源和时间耗用很少,但是数码管的外围辅助电路复杂。
多位数码管的常用驱动方法有:
1.不需要芯片的驱动方式,扫描显示
这种方式a~g和DP一共8根线分别占用单片机8个端口线,一般是一整个P口,然后有几位数码管就另外需要几个控制线作为片选。对于MCU的时间占用几乎是全时的,如果没有其他的任务或者其他的任务耗用时间很少可以考虑这种显示方式,比如时钟、温度计等等。
2.74LS164、74HC595等通用移位寄存器驱动
这是一种带锁存的串入并出芯片,需要占用单片机的2或3根线,如果需要多位驱动,一般使用译码器进行快速线选,或者使用权移位寄存器级联的方式实现,这种驱动方式采用扫描显示,对单片机端口的耗用比较少,但是因为是扫描方式所以对单片机时间耗用还是全时的。
3.MAX7219、HD7279、BC7281、ZLG7289、ZLG7290、WH8280、CH451、CH452等专用LED数码管驱动芯片驱动
这是驱动LED数码管最理想的芯片,从典型应用电路上看外围元件极少,直接驱动,最吸引人的是使用了串行接口,只要三根线就可以驱动多达8位的数码管,而且在送完数据后就不用管了,自己消零消隐,有些芯片还带有8*8的键盘接口(键盘输入的时候,从串口输出键盘编码供单片机读取),但这种驱动方法往往价格比较昂贵。
本文重点介绍单片机直接驱动8位数码管时利用定时器中断解决动态扫描工作方式下对单片机时间资源占用的问题。单片机直接驱动8位数码管的电路如右图所示,电路中数码管的a~h共8根线分别占用单片机8个端口线,连接到P0口,8位数码管的公共端(公共阳极)连接到单片机的P2口,作为数码管动态扫描时的片选,该端口通过上拉电阻与电源相连,以提高驱动能力,电路实际制作时,若驱动能力不够,应考虑使用三极管驱动电路或驱动芯片。
在程序设计中,本人将数码管的驱动程序放在定时器T0的中断服务子程序中,定时器每申请一次中断,点亮一位数码管,在下一次中断时,再点亮下一位数码管,中断八次后,八位数码管依次点亮了一遍,重新回到第一位数码管,再依次点亮。
程序如下:
#include“reg51.h”
#define DB P0
#define AB P2
unsigned char w=5,buffer[8]={10,10,10,10,10,10,10,10};
unsigned char h=8,m=30,s=0;
unsigned int time;
unsigned char code dsW[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code dsB[ ]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,
0xbf};
void T0_int( ) interrupt 1
{TH0=(65536-1843)/256;TL0=(65536-1843)%256;//定时器T0重置初值DB=0xff;//清屏
AB=~dsW[w];//送数码管片选代码
DB=dsB[buffer[w];//送相应数码管的段代码
w++;if(w>7)w=0;//准备点亮下一位数码管
/*********以下为数字钟程序********/
time++;
if(time>=250){buffer[2]=buffer[5]=10;}
if(time>=500) {buffer[2]=buffer[5]=11;s++;time=0;}
if(s>59) {s=0;m++;}
if(m>59) {m=0;h++;}
if(h>23) h=0;
buffer[0]=h/10;buffer[1]=h%10;
buffer[3]=m/10;buffer[4]=m%10;
buffer[6]=s/10;buffer[7]=s%10;
/*********以上为数字钟程序********/
}
main()
{TH0=(65536-1843)/256;TL0=(65536-1843)%256;
TMOD=0x01;EA=1;ET0=1;TR0=1;
while(1);
}
程序中,由于数码管的驱动放在定时器T0的中断服务子程序中,只在响应T0中断服务子程序时执行并占用MCU时间,其余MCU时间空闲,很好地解决了动态扫描时单片机被全时占用的问题。为避免数码管抖动,定时器中断间隔不宜过长,本文中定时器中断间隔时间为2ms。
(作者单位 江苏省溧水中等专业学校)
?誗编辑 薛直艳