劉曉鳳
摘 要:采用動態掃描方式驅動數碼管一般外圍硬件較少,但是對單片機資源耗用巨大。介紹了單片機直接驅動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。
(作者單位 江蘇省溧水中等專業學校)
?誗編輯 薛直艷