51單片機 8255 18b20 數碼管顯示溫度C程序

2021-01-08 電子產品世界

#include
#include
#define uint unsigned int
#define uchar unsigned char
#define PA 0x7cff //PA口
#define PB 0x7dff //PB口
#define con 0x7fff //控制字

本文引用地址:http://www.eepw.com.cn/article/201611/321016.htm

sbit A8=P2^0; //地址線A0
sbit A9=P2^1; //地址線A1
sbit cs=P2^7; //片選
sbit wr=P3^6; //讀埠
uint temp;
uchar tplsb,tpmsb; // 溫度值低位、高位字節
sbit date=P1^2; //數據通信線

uchar code tableshi[]=
{0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
//數碼管段選 十位

uchar code tablege[]=
{0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef};
//數碼管段選 個位 帶小數點

//uchar code tablewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
//數碼管位選



void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}


void init()
{
uint i;
date=1;
delay(1);

date = 0;
i = 100; //拉低約900us
while (i>0) i--;

date= 1; // 產生上升沿
i = 4;
while (i>0) i--;
}


void wait()
{
uint i;
while(date);
while(~date); // 檢測到應答脈衝
i = 4;
while (i>0) i--;
}


bit readbit()
{
uint i;
bit b;
date = 0;
i++;
date = 1;
i++;i++; // 延時15us以上,讀時隙下降沿後15us,DS18B20輸出數據才有效
b = date;
i = 8;
while(i>0) i--;
return (b);
}


uchar readbyte()
{
uchar i,j,b;
b = 0;
for (i=1;i<=8;i++)
{
j = readbit();
b = (j<<7)|(b>>1);//讀出的數據最低位在最前面,這樣剛好一個字節在DATE裡
}
return(b);
}


void writebyte(uchar b)//
{
uint i;
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp = b&0x01;
b = b>>1; // 取下一位(由低位向高位)
if (btmp) // 寫1
{

date = 0;
i++;i++; // 延時,使得15us以內拉高
date = 1;
i = 8;
while(i>0) i--; // 整個寫1時隙不低於60us
}
else // 寫0
{

date = 0;
i = 8;
while(i>0) i--; // 保持低在60us到120us之間
date = 1;
i++;
i++;
}
}
}


void convert()
{
init(); // 產生復位脈衝,初始化DS18B20
wait(); // 等待DS18B20給出應答脈衝
delay(1); // 延時
writebyte(0xcc); // 跳過rom 命令
writebyte(0x44); // convert T 命令

}


uint readtemp()
{
float tt;
init(); // 產生復位脈衝,初始化DS18B20
wait(); // 等待DS18B20給出應答脈衝
delay(1); // 延時
writebyte(0xcc); // 跳過rom命令
writebyte(0xbe); // read scratchpad 讀暫存器命令
tplsb=readbyte(); // 溫度值低位字節(其中低4位為二進位的"小數"部分)
tpmsb=readbyte(); // 溫度值高位字節(其中高5位為符號位)
temp=tpmsb;
temp<<=8; //合成一個字
temp=temp|tplsb;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}


void display(uint temp)
{
uchar A1,A2,A3;
A1=temp/100;
A2=temp%100/10;
A3=temp%10;


wr=1;
XBYTE[PB]=0xdf; //選通第一位數碼管
wr=0;
delay(1);

wr=1;
XBYTE[PA]=tableshi[A1]; //顯示百位
wr=0;
delay(10);

wr=1;
XBYTE[PA]=0x00; //關掉顯示百位
wr=0;

wr=1;
XBYTE[PB]=0xef; //選通第2位數碼管
wr=0;
delay(1);

wr=1;
XBYTE[PA]=tablege[A2];//顯示十位
wr=0;
delay(10);

wr=1;
XBYTE[PA]=0x00; //關掉顯示十位
wr=0;

wr=1;
XBYTE[PB]=0xf7; //選通第3位數碼管
wr=0;
delay(1);

wr=1;
XBYTE[PA]=tableshi[A3]; //顯示個位
wr=0;
delay(10);

wr=1;
XBYTE[PA]=0x00; //關掉顯示個位
wr=0;


}

void main()
{

wr=1;
XBYTE[con]=0x80;//A組輸入B組輸出方式0
wr=0;
delay(1); // 延時1ms
convert(); // 啟動溫度轉換,需要750ms
delay(1000); // 延時1s
while(1)
{
convert();
display(readtemp());
}

}

相關焦點

  • 51單片機學習之4-數碼管
    圖(b)右邊的電路圖可以看出,所有的二極體正極都接在電源正極,a、b、c、d、e、f、g、dp都接在單片機的IO口上,在《51單片機複習筆記1》:http://www.51hei.com/mcu/2111.html中介紹過驅動二極體的原理,所以這裡只需要在相應的二極體負極給低電平即可讓相應的二極體發光。這裡補充一下,為什麼給高電平二極體就不亮,給低電平就亮呢。
  • 基於51單片機的兩路溫度控制器的設計方案
    本方案中所設計的溫度控制器,採用AT89C51單片機作為內核,採用DS18B20作為溫度傳感器,通過四位LED顯示,通過循環掃描實現了兩路溫度的採集與顯示。
  • MCS_51單片機與8255A的接口設計
    目前,各生產廠家已提供了很多系列的可編程接口,MCS-51單片機常用的兩種接口晶片是8255以及8155。本文引用地址:http://www.eepw.com.cn/article/170507.htm8255和MCS-51相連,可以為外設提供三個8位的I/O埠:A口、B口和C口,三個埠的功能完全由編程來決定。
  • 單片機驅動數碼管設計詳解(74HC595實現)
    數碼管顯示設計本設計使用了一個4位的數碼管,為共陽型,為了節省單片機的IO口,使用了兩片74HC595作為數碼管的驅動晶片,共佔用3個IO口。單片機執行完這個程序後,數據才會在數碼管上顯示出來。> 推薦閱讀 51單片機學習實踐:用NTC電阻測溫並顯示在TM1637數碼管 STC15單片機實驗名稱:使用NTC電阻測量溫度實驗內容:        使用NTC電阻測量溫度並顯示在數碼管上        讀取DS18B20模塊測量溫度作為參考實驗器材:        STC15W408AS_DIP16
  • 51單片機C語言教程(四) 數據類型
    推薦閱讀 51單片機學習實踐:用NTC電阻測溫並顯示在TM1637數碼管 STC15單片機實驗名稱:使用NTC電阻測量溫度實驗內容:        使用NTC電阻測量溫度並顯示在數碼管上        讀取DS18B20模塊測量溫度作為參考實驗器材:        STC15W408AS_DIP16 x1
  • 單片機編程:讓led數碼管顯示數字0到9
    打開APP 單片機編程:讓led數碼管顯示數字0到9 發表於 2018-01-15 16:23:34 led數碼管(LEDSegmentDisplays
  • 單片機與8255晶片連接詳解
    先來看看8255的引腳圖 http://www.51hei.com/chip/161.html首先CS=0,即P25=0,然後就是通過P21,P22分別選中幾個口。所以PA的地址可以0000-D9FF同理PB:DBFF,PC:DDFF,CON:DFFF。通過配置D口來控制P口的功能,不管三七二十一,都配置成輸出就可以(方式一)。
  • 單片機控制八隻數碼管滾動顯示1~8 附PROTEUS軟體仿真圖
    數碼管顯示是每一個單片機初學者都必須學的,而單片機驅動數碼管的數字循環顯示實驗,又是單片機基礎中的基礎,同時也是學好C語言編程的關鍵,此實驗在硬體上可以弄清楚單片機驅動原理和數碼管的顯示原理,在軟體上可以幫助建立編程思維和良好的編程習慣,同時加深C語言中 函數,變量和循環結構語句的學習
  • 單片機控制單只數碼管循環顯示0~F 用PROTEUS軟體仿真
    數碼管顯示是每一個單片機初學者都必須學的,而單片機驅動數碼管的數字循環顯示實驗,又是單片機基礎中的基礎,同時也是學好C語言編程的關鍵,現在供上代碼供大家學習研究,此程序經過一些改進,可以實現按鍵識別 數碼管動態掃描。同時也可以做各種有關顯示調試程序的二次開發等等。
  • 單片機C語言模塊化編程方法
    對於負數會顯示「-」號,除數為零時LCD顯示「錯誤:除數為零」的錯誤提示。3. 開機次數記憶程序:主要對基於IIC總線的EEPROM進行讀寫,單片機每次上電後,將開機次數寫入EEPROM.4. 串口測試程序:進入該程序後,單片機向電腦發送字符串「Hello Word!」,發送數字24(以字符的形式顯示)。編寫此程序的目的是為了能夠方便的向電腦發送字符串和變量,便於程序的調試。
  • 帶詳細注釋的51單片機CS1237電子秤源程序
    工程硬體平臺:    1,51Core-V1.0(51單片機最小系統板)                2,差分ADC模塊-CS1237                3,稱重傳感器模塊                4,OLED顯示器0.96寸,4PIN工程程序版本:51單片機廚房(藥房)秤方案 V1.0.0.0
  • 單片機C語言知識點全攻略(三)
    單片機c語言中共有6種位運算符。推薦閱讀 51單片機學習實踐:用NTC電阻測溫並顯示在TM1637數碼管 STC15單片機實驗名稱:使用NTC電阻測量溫度實驗內容:        使用NTC電阻測量溫度並顯示在數碼管上        讀取DS18B20模塊測量溫度作為參考實驗器材:        STC15W408AS_DIP16 x1
  • 【程序】4*4矩陣鍵盤數碼管顯示按鍵值程序
    4×4矩陣鍵盤數碼管顯示按鍵值程序//電路說明如下。
  • 74HC595控制8位數碼管 51單片機
    關鍵字:74HC595控制  8位數碼管  51單片機 編輯:什麼魚 引用地址:http://news.eeworld.com.cn/mcu/2015
  • 單個數碼管顯示0-9
    一、實驗要求使用51單片機控制單個數碼管,使其循環顯示0-9.二、實驗原理數碼管(Segment Displays)由多個發光二極體封裝在一起組成「8」字型的器件,引線已在內部連接完成,只需引出它們的各個筆劃,公共電極。數碼管實際上是由七個發光管組成8字形構成的,加上小數點就是8個。這些段分別由字母a,b,c,d,e,f,g,dp來表示。
  • 51單片機基礎之靜態數碼管電路
    原理圖多數人也都知道,51單片機的入門第一篇就是Led燈的操作,當然了,那也是最基本的操作。上次玩完LED燈,就相當於是入門,今天我們來看看數碼管,對於數碼管,大家可以是再熟悉不過了,生活中處處都可以見到各種各樣的數碼管,但是你知道其內部的原理嗎,其實還是相當簡單的,老樣子,我們要玩什麼,當然是先看看這個部分的原理圖了:由原理圖可知,八個數碼管並不是直接接在單片機的IO口上的,而是用了74HC595晶片,那麼我們要想驅動數碼管,就必須了解595晶片到底是個什麼玩意兒
  • 單片機4x4矩陣鍵盤掃描程序
    電阻測溫並顯示在TM1637數碼管 STC15單片機實驗名稱:使用NTC電阻測量溫度實驗內容:        使用NTC電阻測量溫度並顯示在數碼管上        讀取DS18B20模塊測量溫度作為參考實驗器材:        STC15W408AS_DIP16 x1        DS18B20  x1        TM1637數碼管 x1
  • 基於proteus的51單片機開發實例30-模塊化程序設計
    基於proteus的51單片機開發實例30-模塊化程序設計1.1.到了第29個實例,我們的程序量已經接近500行了,假設我們要找最後一個函數的內容,那就要用滑鼠撥拉好一會才能找到這個函數,是不是會有「好長啊」的感慨?更為致命的是,我們這個程序中既有延時程序、又有液晶顯示程序、還有DS18B20的讀寫程序。所有這個程序都擠在一個main.c文件中,即使我們已經按照延時、顯示、讀寫進行了劃分,整體感覺是不是有些亂?
  • 51單片機+PID算法水溫控制系統設計
    推薦閱讀 51單片機學習實踐:用NTC電阻測溫並顯示在TM1637數碼管 STC15單片機實驗名稱:使用NTC電阻測量溫度實驗內容:        使用NTC電阻測量溫度並顯示在數碼管上        讀取DS18B20模塊測量溫度作為參考實驗器材:
  • 51單片機之4位數加法計算器的設計報告
    2.2.5 顯示模塊的選擇方案論證方案一:採用帶字庫LCD模塊顯示。能顯示複雜的信息,具有質量輕,體積小,功耗低,指令功能強,接口簡單,可靠性強等優點,顯示內容豐富,圖形美觀,易於人機交流。但是價格昂貴。方案二:採用LED數碼管顯示。數碼管能顯示數字和符號,但是佔用I/O口資源較多,對於簡單的電路可以選用此方案。