www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]//串行數(shù)碼管顯示 溫度值//芯片 ATMEGA16L //時(shí)鐘 4MHz 內(nèi)部 // DS18B20數(shù)據(jù)線是雙向總線,采用一個(gè)IO口 // DS18B20數(shù)據(jù)線,輸出不是通過IO口直接輸出0和1,而是將IO口的PORT置成0。 // 輸出方式,輸出0; // 輸

//串行數(shù)碼管顯示 溫度值

//芯片 ATMEGA16L
//時(shí)鐘 4MHz 內(nèi)部
// DS18B20數(shù)據(jù)線是雙向總線,采用一個(gè)IO口
// DS18B20數(shù)據(jù)線,輸出不是通過IO口直接輸出0和1,而是將IO口的PORT置成0。
// 輸出方式,輸出0;
// 輸入方式,內(nèi)部上拉電阻無效,引腳為高組態(tài),由于外部上拉電阻,引腳呈現(xiàn)高電平,輸出1.
// 采用系統(tǒng)自帶延時(shí)程序
#include
#include

#define hc164_data PORTD.0 // 164數(shù)據(jù)線
#define hc164_clk PORTD.1 // 164時(shí)鐘線

#define DATA_18B20 DDRD.7 // PD7方向控制,18B20數(shù)據(jù)線
#define DATA_18B20_Input PIND.7 // 18B20數(shù)據(jù)線作為輸入
#define DATA_18B20_Output PORTD.7 // 18B20數(shù)據(jù)線作為輸出或作為輸入時(shí)上拉電阻無效
#define DATA_18B20_Hight DATA_18B20 = 0 // 18B20數(shù)據(jù)線置1,輸入狀態(tài),內(nèi)部上拉電阻無效,引腳為高組態(tài),由于外部上拉電阻,引腳呈現(xiàn)高電平。
#define DATA_18B20_Low DATA_18B20 = 1 // 18B20數(shù)據(jù)線清0,輸出狀態(tài),輸出0

void hc164_send_byte (unsigned char byte); // 164輸出子程序
void leddisplay(void); // 數(shù)碼管顯示子程序

//18B20函數(shù)開始
void DS18B20_init (void); // DS18B20引腳初始化
unsigned char Reset_DS18B20(void); // 復(fù)位子程序
void WR_DS18B20 (unsigned char); // 寫1個(gè)字節(jié)子程序
unsigned char RD_DS18B20 (void); // 讀1個(gè)字節(jié)子程序
unsigned int GetTempDS18B20 (void); // 讀取溫度子程序
//18B20函數(shù)結(jié)束
unsigned char ledxs[8]={16,16,16,16,16,0,0,0}; // 數(shù)碼管顯示緩沖區(qū)
// 溫度 十位 個(gè)位 小數(shù)位
flash unsigned char tab[]={0xb7,0x12,0x67,0x76,0xd2,0xf4,0xf5,0x16,0xf7,0xf6,0xd7,0xf1,0xa5,0x73,0xe5,0xc5,0,0xff};
//共陰極代碼 0-F, 全滅,全亮
void main()
{
unsigned int wendu,temp;
delay_ms(200);
DDRD |= 0x03; // 164驅(qū)動(dòng),PD0、PD1置為輸出方式
DS18B20_init (); // DS18B20引腳初始化
while(1)
{
wendu=GetTempDS18B20(); // 讀取溫度
temp=wendu/100;
ledxs[5]=temp; // 求得溫度十位
temp=wendu%100;
ledxs[6]=temp/10; // 求得溫度個(gè)位
ledxs[7]=temp%10; // 求得溫度小數(shù)位
leddisplay(); // 串行顯示
}

}
void leddisplay() // 數(shù)碼管顯示子程序
{
unsigned char i;
for(i=0;i<8;i++)
{
if(i==6)
hc164_send_byte (tab[ledxs[i]]|0x08); //溫度個(gè)位加小數(shù)點(diǎn)
else
hc164_send_byte (tab[ledxs[i]]);
delay_us(2);
}
}
void hc164_send_byte (unsigned char byte) // 164輸出子程序
{
unsigned char i;
for(i=0;i<8;i++)
{
hc164_data = byte & ( 1 << i );
hc164_clk = 1;
hc164_clk = 0;
}
}
void DS18B20_init (void) // DS18B20引腳初始化
{
DATA_18B20_Output = 0; // 18B20數(shù)據(jù)線的PORT狀態(tài)鎖定為0。輸出方式,輸出0;輸入方式,內(nèi)部上拉電阻無效。
DATA_18B20_Hight; // 18B20數(shù)據(jù)線輸入方式,呈現(xiàn)高電平
}

//----------------------------------------------------------------------------
// 復(fù)位 DS1820
// CPU將數(shù)據(jù)線拉低480us,然后釋放,
// 當(dāng)DS18B20收到信號后等待16~60us左右,后發(fā)出60~240us的存在低脈沖,
// 主CPU收到此信號表示復(fù)位成功。
//----------------------------------------------------------------------------
unsigned char Reset_DS18B20(void)
{
unsigned char flag;
DATA_18B20_Hight; // 18B20數(shù)據(jù)線 =1,數(shù)據(jù)線為輸入方式,內(nèi)部上拉電阻無效,引腳為高組態(tài),由于外部上拉電阻,引腳呈現(xiàn)高電平。
delay_us(2);
DATA_18B20_Low; // 保持低電平至少 480 us
delay_us(500);
DATA_18B20_Hight;
delay_us(60); // 60us延時(shí),等DS18B20 完成采樣
if(DATA_18B20_Input)
flag = 1;
else
flag = 0; // 檢查DS1820 是否存在
delay_us(300); // 等 300 us
return flag; // flag=0復(fù)位成功,flag=1,復(fù)位不成功
}
//----------------------------------------------------------------------------
// 寫1個(gè)字節(jié)到DS18B20
// CPU將數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫起始信號;
// 15us之內(nèi),將所寫的位送到數(shù)據(jù)線上;
// DS18B20在15us~60us之間接收位信息;
// 寫下一個(gè)位之前要有1us以上的高電平恢復(fù);
// 將以上過程重復(fù)8次,即完成一個(gè)字節(jié)的寫操作。
//----------------------------------------------------------------------------
void WR_DS18B20(unsigned char data0)
{
unsigned char i;
for (i=0; i<8; i++)
{
DATA_18B20_Low; // 數(shù)據(jù)線拉成低電平
delay_us(2);
if ((data0&0x01)==0x01)
DATA_18B20_Hight;
else
DATA_18B20_Low; // 送出最低位
data0=data0>>1; // 右移1位
delay_us(60); // 60us延時(shí),等DS18B20 完成采樣
DATA_18B20_Hight; // 數(shù)據(jù)線恢復(fù)高電平
delay_us(2);
}
}
//----------------------------------------------------------------------------
// 從DS1820讀取1個(gè)字節(jié)
// CPU將數(shù)據(jù)線從高電平拉到低電平1us以上,再拉到高電平,產(chǎn)生讀起始信號;
// 15us之內(nèi),CPU讀一位;
// 讀周期為60us,
// 讀下一個(gè)位之前要有1us以上的高電平恢復(fù);
// 將以上過程重復(fù)8次,即完成一個(gè)字節(jié)的讀操作。
//----------------------------------------------------------------------------
unsigned char RD_DS18B20()
{
unsigned char i,data0=0;
for (i=0; i<8; i++)
{
DATA_18B20_Low; // 數(shù)據(jù)線拉成低電平
delay_us(2);
DATA_18B20_Hight; // 數(shù)據(jù)線拉到高電平,準(zhǔn)備接收數(shù)據(jù)
delay_us(2);
data0=data0>>1; // 右移1位
if(DATA_18B20_Input) data0 |= 0x80; // 讀取1位
delay_us(60); // 60us延時(shí)
DATA_18B20_Hight; // 數(shù)據(jù)線恢復(fù)高電平
delay_us(2);
}
return data0;
}
//----------------------------------------------------------------------------
// 讀取溫度
// 返回溫度值*10后的結(jié)果
// (例 24.5 度 => 245 度)
//----------------------------------------------------------------------------
unsigned int GetTempDS18B20()
{
unsigned int temp;
unsigned char flag,th,tl;
flag = Reset_DS18B20(); // 復(fù)位
if(flag) return 0x0000;
WR_DS18B20 (0xcc); // 跳過ROM
WR_DS18B20 (0x44); // 啟動(dòng)溫度轉(zhuǎn)換
delay_ms(1000); // 延時(shí)1s,等待轉(zhuǎn)換結(jié)束
flag = Reset_DS18B20(); // 復(fù)位
if(flag) return 0x0000;
WR_DS18B20 (0xcc); // 跳過ROM
WR_DS18B20 (0xbe); // 發(fā)讀溫度命令
tl = RD_DS18B20(); // 讀溫度低字節(jié)
th = RD_DS18B20(); // 讀溫度高字節(jié)
temp = ((unsigned int)th << 8)|tl; // 溫度高字節(jié)加上溫度低字節(jié)
temp = ((temp>>4)*10)+((((temp&0x0008)>>3)*500)+(((temp&0x0004)>>2)*250)+(((temp&0x0002)>>1)*125)+((temp&0x0001)*62))/100; //溫度值*10
return temp;
}//串行數(shù)碼管顯示 溫度值
//芯片 ATMEGA16L
//時(shí)鐘 4MHz 內(nèi)部
// DS18B20數(shù)據(jù)線是雙向總線,采用一個(gè)IO口
// DS18B20數(shù)據(jù)線,輸出不是通過IO口直接輸出0和1,而是將IO口的PORT置成0。
// 輸出方式,輸出0;
// 輸入方式,內(nèi)部上拉電阻無效,引腳為高組態(tài),由于外部上拉電阻,引腳呈現(xiàn)高電平,輸出1.
// 采用系統(tǒng)自帶延時(shí)程序
#include
#include

#define hc164_data PORTD.0 // 164數(shù)據(jù)線
#define hc164_clk PORTD.1 // 164時(shí)鐘線

#define DATA_18B20 DDRD.7 // PD7方向控制,18B20數(shù)據(jù)線
#define DATA_18B20_Input PIND.7 // 18B20數(shù)據(jù)線作為輸入
#define DATA_18B20_Output PORTD.7 // 18B20數(shù)據(jù)線作為輸出或作為輸入時(shí)上拉電阻無效
#define DATA_18B20_Hight DATA_18B20 = 0 // 18B20數(shù)據(jù)線置1,輸入狀態(tài),內(nèi)部上拉電阻無效,引腳為高組態(tài),由于外部上拉電阻,引腳呈現(xiàn)高電平。
#define DATA_18B20_Low DATA_18B20 = 1 // 18B20數(shù)據(jù)線清0,輸出狀態(tài),輸出0

void hc164_send_byte (unsigned char byte); // 164輸出子程序
void leddisplay(void); // 數(shù)碼管顯示子程序

//18B20函數(shù)開始
void DS18B20_init (void); // DS18B20引腳初始化
unsigned char Reset_DS18B20(void); // 復(fù)位子程序
void WR_DS18B20 (unsigned char); // 寫1個(gè)字節(jié)子程序
unsigned char RD_DS18B20 (void); // 讀1個(gè)字節(jié)子程序
unsigned int GetTempDS18B20 (void); // 讀取溫度子程序
//18B20函數(shù)結(jié)束
unsigned char ledxs[8]={16,16,16,16,16,0,0,0}; // 數(shù)碼管顯示緩沖區(qū)
// 溫度 十位 個(gè)位 小數(shù)位
flash unsigned char tab[]={0xb7,0x12,0x67,0x76,0xd2,0xf4,0xf5,0x16,0xf7,0xf6,0xd7,0xf1,0xa5,0x73,0xe5,0xc5,0,0xff};
//共陰極代碼 0-F, 全滅,全亮
void main()
{
unsigned int wendu,temp;
delay_ms(200);
DDRD |= 0x03; // 164驅(qū)動(dòng),PD0、PD1置為輸出方式
DS18B20_init (); // DS18B20引腳初始化
while(1)
{
wendu=GetTempDS18B20(); // 讀取溫度
temp=wendu/100;
ledxs[5]=temp; // 求得溫度十位
temp=wendu%100;
ledxs[6]=temp/10; // 求得溫度個(gè)位
ledxs[7]=temp%10; // 求得溫度小數(shù)位
leddisplay(); // 串行顯示
}

}
void leddisplay() // 數(shù)碼管顯示子程序
{
unsigned char i;
for(i=0;i<8;i++)
{
if(i==6)
hc164_send_byte (tab[ledxs[i]]|0x08); //溫度個(gè)位加小數(shù)點(diǎn)
else
hc164_send_byte (tab[ledxs[i]]);
delay_us(2);
}
}
void hc164_send_byte (unsigned char byte) // 164輸出子程序
{
unsigned char i;
for(i=0;i<8;i++)
{
hc164_data = byte & ( 1 << i );
hc164_clk = 1;
hc164_clk = 0;
}
}
void DS18B20_init (void) // DS18B20引腳初始化
{
DATA_18B20_Output = 0; // 18B20數(shù)據(jù)線的PORT狀態(tài)鎖定為0。輸出方式,輸出0;輸入方式,內(nèi)部上拉電阻無效。
DATA_18B20_Hight; // 18B20數(shù)據(jù)線輸入方式,呈現(xiàn)高電平
}

//----------------------------------------------------------------------------
// 復(fù)位 DS1820
// CPU將數(shù)據(jù)線拉低480us,然后釋放,
// 當(dāng)DS18B20收到信號后等待16~60us左右,后發(fā)出60~240us的存在低脈沖,
// 主CPU收到此信號表示復(fù)位成功。
//----------------------------------------------------------------------------
unsigned char Reset_DS18B20(void)
{
unsigned char flag;
DATA_18B20_Hight; // 18B20數(shù)據(jù)線 =1,數(shù)據(jù)線為輸入方式,內(nèi)部上拉電阻無效,引腳為高組態(tài),由于外部上拉電阻,引腳呈現(xiàn)高電平。
delay_us(2);
DATA_18B20_Low; // 保持低電平至少 480 us
delay_us(500);
DATA_18B20_Hight;
delay_us(60); // 60us延時(shí),等DS18B20 完成采樣
if(DATA_18B20_Input)
flag = 1;
else
flag = 0; // 檢查DS1820 是否存在
delay_us(300); // 等 300 us
return flag; // flag=0復(fù)位成功,flag=1,復(fù)位不成功
}
//----------------------------------------------------------------------------
// 寫1個(gè)字節(jié)到DS18B20
// CPU將數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫起始信號;
// 15us之內(nèi),將所寫的位送到數(shù)據(jù)線上;
// DS18B20在15us~60us之間接收位信息;
// 寫下一個(gè)位之前要有1us以上的高電平恢復(fù);
// 將以上過程重復(fù)8次,即完成一個(gè)字節(jié)的寫操作。
//----------------------------------------------------------------------------
void WR_DS18B20(unsigned char data0)
{
unsigned char i;
for (i=0; i<8; i++)
{
DATA_18B20_Low; // 數(shù)據(jù)線拉成低電平
delay_us(2);
if ((data0&0x01)==0x01)
DATA_18B20_Hight;
else
DATA_18B20_Low; // 送出最低位
data0=data0>>1; // 右移1位
delay_us(60); // 60us延時(shí),等DS18B20 完成采樣
DATA_18B20_Hight; // 數(shù)據(jù)線恢復(fù)高電平
delay_us(2);
}
}
//----------------------------------------------------------------------------
// 從DS1820讀取1個(gè)字節(jié)
// CPU將數(shù)據(jù)線從高電平拉到低電平1us以上,再拉到高電平,產(chǎn)生讀起始信號;
// 15us之內(nèi),CPU讀一位;
// 讀周期為60us,
// 讀下一個(gè)位之前要有1us以上的高電平恢復(fù);
// 將以上過程重復(fù)8次,即完成一個(gè)字節(jié)的讀操作。
//----------------------------------------------------------------------------
unsigned char RD_DS18B20()
{
unsigned char i,data0=0;
for (i=0; i<8; i++)
{
DATA_18B20_Low; // 數(shù)據(jù)線拉成低電平
delay_us(2);
DATA_18B20_Hight; // 數(shù)據(jù)線拉到高電平,準(zhǔn)備接收數(shù)據(jù)
delay_us(2);
data0=data0>>1; // 右移1位
if(DATA_18B20_Input) data0 |= 0x80; // 讀取1位
delay_us(60); // 60us延時(shí)
DATA_18B20_Hight; // 數(shù)據(jù)線恢復(fù)高電平
delay_us(2);
}
return data0;
}
//----------------------------------------------------------------------------
// 讀取溫度
// 返回溫度值*10后的結(jié)果
// (例 24.5 度 => 245 度)
//----------------------------------------------------------------------------
unsigned int GetTempDS18B20()
{
unsigned int temp;
unsigned char flag,th,tl;
flag = Reset_DS18B20(); // 復(fù)位
if(flag) return 0x0000;
WR_DS18B20 (0xcc); // 跳過ROM
WR_DS18B20 (0x44); // 啟動(dòng)溫度轉(zhuǎn)換
delay_ms(1000); // 延時(shí)1s,等待轉(zhuǎn)換結(jié)束
flag = Reset_DS18B20(); // 復(fù)位
if(flag) return 0x0000;
WR_DS18B20 (0xcc); // 跳過ROM
WR_DS18B20 (0xbe); // 發(fā)讀溫度命令
tl = RD_DS18B20(); // 讀溫度低字節(jié)
th = RD_DS18B20(); // 讀溫度高字節(jié)
temp = ((unsigned int)th << 8)|tl; // 溫度高字節(jié)加上溫度低字節(jié)
temp = ((temp>>4)*10)+((((temp&0x0008)>>3)*500)+(((temp&0x0004)>>2)*250)+(((temp&0x0002)>>1)*125)+((temp&0x0001)*62))/100; //溫度值*10
return temp;
}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

Sept. 2, 2025 ---- TrendForce集邦咨詢表示,2025年第二季DRAM產(chǎn)業(yè)因一般型DRAM (Conventional DRAM)合約價(jià)上漲、出貨量顯著增長,加上HBM出貨規(guī)模擴(kuò)張,整體營收為3...

關(guān)鍵字: DRAM 智能手機(jī) ASP

Sept. 1, 2025 ---- 根據(jù)TrendForce集邦咨詢最新調(diào)查,2025年第二季因中國市場消費(fèi)補(bǔ)貼引發(fā)的提前備貨效應(yīng),以及下半年智能手機(jī)、筆電/PC、Server新品所需帶動(dòng),整體晶圓代工產(chǎn)能利用率與出貨...

關(guān)鍵字: 晶圓代工 智能手機(jī) 筆電

Aug. 28, 2025 ---- 根據(jù)TrendForce集邦咨詢最新調(diào)查,2025年第二季NAND Flash產(chǎn)業(yè)雖面臨平均銷售價(jià)格(ASP)小幅下滑,所幸原廠減產(chǎn)策略緩解供需失衡,疊加中、美兩大市場政策推動(dòng),整體...

關(guān)鍵字: NAND Flash SSD AI

Aug. 26, 2025 ---- NVIDIA(英偉達(dá))近日推出的Jetson Thor被視為機(jī)器人的物理智慧核心,以Blackwell GPU、128 GB記憶體堆疊出2070 FP4 TFLOPS AI算力,是前...

關(guān)鍵字: 機(jī)器人 大型語言模型 AI算力

Aug. 21, 2025 ---- 根據(jù)TrendForce集邦咨詢最新液冷產(chǎn)業(yè)研究,隨著NVIDIA GB200 NVL72機(jī)柜式服務(wù)器于2025年放量出貨,云端業(yè)者加速升級AI數(shù)據(jù)中心架構(gòu),促使液冷技術(shù)從早期試點(diǎn)邁...

關(guān)鍵字: AI 數(shù)據(jù)中心 服務(wù)器

除了充電電路外,鋰電池的放電過程也需要保護(hù)。鋰電池的放電電壓不能低于3.0V,否則電池壽命會(huì)大幅縮短。為了實(shí)現(xiàn)這一保護(hù),工程師們設(shè)計(jì)了DW01芯片與8205 MOS管的電路組合。DW01芯片能夠監(jiān)控鋰電池的放電電壓和電流...

關(guān)鍵字: 鋰電池 電池

在PCB設(shè)計(jì)的宏偉藍(lán)圖中,布局與布線規(guī)則猶如精密樂章中的指揮棒,是鑄就電路板卓越性能、堅(jiān)不可摧的可靠性及經(jīng)濟(jì)高效的制造成本的靈魂所在。恰如一位巧手的園藝師,合理的布局藝術(shù)性地編排著每一寸空間,既削減了布線交織的繁復(fù)迷宮,...

關(guān)鍵字: PCB 電路板

模塊化設(shè)計(jì)作為一種將系統(tǒng)拆分為獨(dú)立、可復(fù)用組件的方法,能夠在低代碼平臺中實(shí)現(xiàn)功能的靈活組合,并最大限度地提升系統(tǒng)性能。本文將探討如何通過模塊化設(shè)計(jì),使得低代碼平臺既能快速適應(yīng)變化,又能保持高效穩(wěn)定的運(yùn)行。

關(guān)鍵字: 模塊化設(shè)計(jì) 嵌入式

EMC電磁兼容性包括EMI(interference)和EMS(susceptibility),也就是電磁干擾和電磁抗干擾。隨著智能化技術(shù)的發(fā)展,單片機(jī)的應(yīng)用也日益廣泛。雖然單片機(jī)本身有一定的抗干擾能力,但是用單片機(jī)為核...

關(guān)鍵字: 電磁兼容 電磁

在電子產(chǎn)品的制造過程中,PCB(印刷電路板)的布局布線是至關(guān)重要的環(huán)節(jié)。它涉及到將電子元器件按照特定要求進(jìn)行合理布置,并通過導(dǎo)線將它們連接起來,以實(shí)現(xiàn)電路的功能。布局布線的質(zhì)量直接影響到產(chǎn)品的性能、可靠性和成本。因此,掌...

關(guān)鍵字: PCB 電路板
關(guān)閉