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