一、什么是數(shù)碼管
數(shù)碼管,也稱作輝光管,是一種可以顯示數(shù)字和其他信息的電子設(shè)備。玻璃管中包括一個金屬絲網(wǎng)制成的陽極和多個陰極。大部分?jǐn)?shù)碼管陰極的形狀為數(shù)字。管中充以低壓氣體,通常大部分為氖加上一些汞和/或氬。給某一個陰極充電,數(shù)碼管就會發(fā)出顏色光,視乎管內(nèi)的氣體而定,一般都是橙色或綠色。
盡管在外觀上和真空管相似,其原理并非為加熱陰極放射電子。因而它被稱為冷陰極管或霓虹燈的一個變種。在室溫下,即使處于極端的室內(nèi)工作條件下,這種管子的溫度很少超過40℃。
數(shù)碼管的最常見形式有10個陰極,形狀為數(shù)字0到9,某些數(shù)碼管還有一個或兩個小數(shù)點(diǎn)。然而也有其他類型的數(shù)碼管顯示字母、標(biāo)記和符號。如一種“數(shù)碼管”,其陰極為一個模板制成的面具,上面有數(shù)字形狀的孔。一些俄羅斯的數(shù)碼管,如IN-14,使用倒立的數(shù)字2代表5,大概是為了節(jié)約生產(chǎn)成本,而沒有明顯的技術(shù)或美學(xué)方面的原因。俄羅斯的數(shù)碼管大部分都使用了倒立的2作為5。
將170伏的直流電壓加在陰極和陽極之間,每一個陰極可以發(fā)出氖的的紅橙色光。由于混合氣體的不同,不同類型的數(shù)碼管之間的顏色有所區(qū)別。壽命較長的數(shù)碼管在制造中加入了汞,減少了濺射,結(jié)果發(fā)出的光的顏色為藍(lán)色或紫色調(diào)。在某些情況下,這些顏色被玻璃上的紅色或橙色過濾涂層過濾。
數(shù)碼管分類
數(shù)碼管也稱LED數(shù)碼管,不同行業(yè)人士對數(shù)碼管的稱呼不一樣,其實(shí)都是同樣的產(chǎn)品。
按發(fā)光二極管單元連接方式可分為共陽極數(shù)碼管和共陰極數(shù)碼管。共陽數(shù)碼管是指將所有發(fā)光二極管的陽極接到一起形成公共陽極(COM)的數(shù)碼管,共陽數(shù)碼管在應(yīng)用時應(yīng)將公共極COM接到+5V,當(dāng)某一字段發(fā)光二極管的陰極為低電平時,相應(yīng)字段就點(diǎn)亮,當(dāng)某一字段的陰極為高電平時,相應(yīng)字段就不亮。共陰數(shù)碼管是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數(shù)碼管,共陰數(shù)碼管在應(yīng)用時應(yīng)將公共極COM接到地線GND上,當(dāng)某一字段發(fā)光二極管的陽極為高電平時,相應(yīng)字段就點(diǎn)亮,當(dāng)某一字段的陽極為低電平時,相應(yīng)字段就不亮。
驅(qū)動方式
概述
數(shù)碼管要正常顯示,就要用驅(qū)動電路來驅(qū)動數(shù)碼管的各個段碼,從而顯示出我們要的數(shù)字,因此根據(jù)數(shù)碼管的驅(qū)動方式的不同,可以分為靜態(tài)式和動態(tài)式兩類。
靜態(tài)顯示驅(qū)動
靜態(tài)驅(qū)動也稱直流驅(qū)動。靜態(tài)驅(qū)動是指每個數(shù)碼管的每一個段碼都由一個單片機(jī)的I/O端口進(jìn)行驅(qū)動,或者使用如BCD碼二-十進(jìn)制譯碼器譯碼進(jìn)行驅(qū)動。靜態(tài)驅(qū)動的優(yōu)點(diǎn)是編程簡單,顯示亮度高,缺點(diǎn)是占用I/O端口多,如驅(qū)動5個數(shù)碼管靜態(tài)顯示則需要5×8=40根I/O端口來驅(qū)動,要知道一個89S51單片機(jī)可用的I/O端口才32個,實(shí)際應(yīng)用時必須增加譯碼驅(qū)動器進(jìn)行驅(qū)動,增加了硬件電路的復(fù)雜性。
動態(tài)顯示驅(qū)動
數(shù)碼管動態(tài)顯示接口是單片機(jī)中應(yīng)用最為廣泛的一種顯示方式之一,動態(tài)驅(qū)動是將所有數(shù)碼管的8個顯示筆劃“a,b,c,d,e,f,g,dp”的同名端連在一起,另外為每個數(shù)碼管的公共極COM增加位選通控制電路,位選通由各自獨(dú)立的I/O線控制,當(dāng)單片機(jī)輸出字形碼時,所有數(shù)碼管都接收到相同的字形碼,但究竟是哪個數(shù)碼管會顯示出字形,取決于單片機(jī)對位選通COM端電路的控制,所以我們只要將需要顯示的數(shù)碼管的選通控制打開,該位就顯示出字形,沒有選通的數(shù)碼管就不會亮。
通過分時輪流控制各個數(shù)碼管的的COM端,就使各個數(shù)碼管輪流受控顯示,這就是動態(tài)驅(qū)動。在輪流顯示過程中,每位數(shù)碼管的點(diǎn)亮?xí)r間為1~2ms,由于人的視覺暫留現(xiàn)象及發(fā)光二極管的余輝效應(yīng),盡管實(shí)際上各位數(shù)碼管并非同時點(diǎn)亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù),不會有閃爍感,動態(tài)顯示的效果和靜態(tài)顯示是一樣的,能夠節(jié)省大量的I/O端口,而且功耗更低。
二、74hc164簡介
74HC164、74HCT164 是高速硅門 CMOS 器件,與低功耗肖特基型 TTL (LSTTL) 器件的引腳兼容。74HC164、74HCT164 是 8 位邊沿觸發(fā)式移位寄存器,串行輸入數(shù)據(jù),然后并行輸出。數(shù)據(jù)通過兩個輸入端(DSA 或 DSB)之一串行輸入;任一輸入端可以用作高電平使能端,控制另一輸入端的數(shù)據(jù)輸入。
74HC164設(shè)備特性
門控串行數(shù)據(jù)輸入 異步中央復(fù)位 符合 JEDEC 標(biāo)準(zhǔn)no. 7A 靜電放電(ESD)保護(hù)
·HBM EIA/JESD22-A114-B 超過2000
V·MM EIA/JESD22-A115-A 超過 200 V 。多種封裝形式額定從 -40 °C 至 +85 °C 和 -40 °C 至 +125 °C
74HC164引腳說明
74HC164引腳圖
74hc595引腳說明
74HC164極限參數(shù)
直流電壓 VDD:l-0.5V——7V
輸入鉗位電流 :-20MA—20MA
輸出鉗位電流 :-20MA—20MA
連續(xù)輸出電流:-25MA—25MA
通過VCC 或GND的電流:-50MA—50MA
引腳焊接溫度:+265度
三、74hc164驅(qū)動控制16個數(shù)碼管程序
#include 《stc.h》
#include “intrins.h” //_nop_();延時函數(shù)用
#define uchar unsigned char
#define uint unsigned int
//================18b20數(shù)據(jù)口定義===============
uint temp; // 定義一個16位變量用于COPY數(shù)據(jù)
sbit DQ = P2^6;
char flash,presence;
uint temp1,temp2; //讀出溫度暫放
uchar s1,s2,s3,s4; //顯示單元數(shù)據(jù),共6個數(shù)據(jù)和一個運(yùn)算暫用
//=======164端口定義==========
sbit ge=P2^5; //個位
sbit shi=P2^4; //十位
sbit bai=P2^3; //百位
sbit qian=P2^2; //千位
sbit clk=P2^1; //164時鐘線
sbit data1=P2^0; //164數(shù)據(jù)線
sbit a0=ACC^0; //累加器
uchar code LED[10]={ //不帶小數(shù)點(diǎn)的代碼表
0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90,};
uchar code led1[10]={ //帶小數(shù)點(diǎn)的代碼表
0x40,0x79,0x24,0x30,0x19,
0x12,0x2,0x78,0x0,0x10,};
//======164數(shù)據(jù)轉(zhuǎn)換程序=======
void chuanshu164(uchar data_buf)
{
uchar i;
ACC=data_buf; //數(shù)據(jù)送累加器
for(i=8;i》0;i--)
{
clk=0;
data1=a0;
clk=1;
ACC=ACC》》1;
}
clk=0;
}
/*****************延時函數(shù)*************************/
void delay(uint t)
{
for (;t》0;t--);
_nop_();
}
//========顯示4位數(shù)碼管函數(shù)===========
void xianshi(uint shu)
{
uchar ss;
for(ss=10;ss》0;ss--)
{
uint wei1,wei2,wei3,wei4;
wei1=shu/1000; //將千位分離
wei2=shu%1000/100; //將百位分離
wei3=shu%100/10; //將十位分離
wei4=shu%10; //將個位分離
chuanshu164(led[wei1]); //顯示第一位數(shù)碼管
qian=0;
delay(200);
qian=1;
chuanshu164(led[wei2]); //顯示第二位數(shù)碼管
bai=0;
delay(200);
bai=1;
chuanshu164(led1[wei3]); //顯示第三位數(shù)碼管
shi=0;
delay(200);
shi=1;
chuanshu164(led[wei4]); //顯示第四位數(shù)碼管
ge=0;
delay(200);
ge=1;
//}
}
}
//=================18b20相關(guān)函數(shù)開始==============
/****************DS18B20復(fù)位函數(shù)************************/
ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_(); //從高拉倒低
DQ=0;
delay(550); //550 us
DQ=1;
delay(66); //66 us
presence=DQ; //presence=0 復(fù)位成功,繼續(xù)下一步
}
delay(500); //延時500 us
presence=~DQ;
}
DQ=1; //拉高電平
}
/****************DS18B20寫命令函數(shù)************************/
void write_byte(uchar val) //向1-WIRE 總線上寫1個字節(jié)
{
uchar i;
for(i=8;i》0;i--)
{
DQ=1;_nop_();_nop_(); //從高拉倒低
DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us
DQ=val&0x01; //最低位移出
delay(66); //66 us
val=val/2; //右移1位
}
DQ=1;
delay(10);
}
//
/****************DS18B20讀1字節(jié)函數(shù)************************/
uchar read_byte(void) //從總線上取1個字節(jié)
{
uchar i;
uchar value=0;
for(i=8;i》0;i--)
{
DQ=1;_nop_();_nop_();
value》》=1;
DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us
DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us
if(DQ)value|=0x80;
delay(66); //66 us
}
DQ=1;
return(value);
}
/****************讀出溫度函數(shù)************************/
read_temp()
{
ow_reset(); //總線復(fù)位
write_byte(0xcc); //發(fā)命令
write_byte(0x44); //發(fā)轉(zhuǎn)換命令
ow_reset();
delay(1);
write_byte(0xcc); //發(fā)命令
write_byte(0xbe);
temp1=read_byte(); //讀溫度值的低字節(jié)
temp2=read_byte(); //讀溫度值的高字節(jié)
temp=(temp2*256+temp1)*0.625;
return temp; //返回溫度值
}
//=================18b20相關(guān)函數(shù)結(jié)束==============
//=================主函數(shù)=========================
void main(void)
{
ow_reset(); //開機(jī)先轉(zhuǎn)換一次
write_byte(0xcc); //Skip ROM
write_byte(0x44); //發(fā)轉(zhuǎn)換命令
while(1)
{
xianshi(read_temp());
//xianshi(read_temp());
//xianshi(read_temp());
//delay(500);
}
}