欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

18b20配合數(shù)碼管顯示溫度

作者:huqin   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年12月15日   【字體:
接上篇:http://www.raoushi.com/mcu/2576.html

1、效果圖
2、代 碼

                                


                    效果圖


 

代碼:
#include <reg52.h>

#include <intrins.h>

sbit DQ = P2^0; //定義總線(xiàn)的I/O管腳
sbit dm = P2^2; //段碼
sbit wm = P2^3; //位碼

unsigned char hc[8]={0x3f,0x3f,0x3f}; //顯示緩存
unsigned char DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~F
unsigned char WM[]={0xdf,0xbf,0x7f};//分別對(duì)應(yīng)相應(yīng)的數(shù)碼管點(diǎn)亮,即位碼
void SendByte(unsigned char dat);
void Delay(unsigned char j);

void sm() //數(shù)碼管掃描函數(shù)1(95 + 45= 150 us)
 
{
unsigned char k=3;
while (k--)
{
P1 = 0; //消影
dm = 1;
dm = 0;

P1 = WM[k]; //寫(xiě)入位碼
wm = 1;
wm = 0;

P1 = hc[k]; //寫(xiě)入段碼
dm = 1;
dm = 0;
Delay(1);
}
}

void sm2(unsigned char k) ////數(shù)碼管掃描函數(shù)2(19+15+4 大概 42us)
{
P1 = 0; //消影
dm = 1;
dm = 0;

P1 = WM[k]; //寫(xiě)入位碼
wm = 1;
wm = 0;

P1 = hc[k]; //寫(xiě)入段碼
dm = 1;
dm = 0;
Delay(1);
}
void Delay6us() //空閑7個(gè)指令周期
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void Delay(unsigned char j) //一個(gè)循環(huán)15us
{
unsigned char i;
while(j--)
{
i = 5;
while (--i);
}
}
bit d18b20_qs() //18b20 起始
{
bit dat;
DQ = 1; //DQ復(fù)位
_nop_();
DQ = 0; //拉低總線(xiàn)
sm(); //這里延時(shí) 150us
Delay(15); //這里延時(shí)大概 225us
sm();//這里延時(shí) 150us
DQ = 1; //拉高總線(xiàn)
Delay(2); //這里延時(shí)大概 30us
dat = DQ; //讀取返回值(0:有18b20存在 1:是沒(méi)有)
Delay(2);
return dat; //返回?cái)?shù)值
}

void d18b20_x(unsigned char dat) //寫(xiě) 8 位 數(shù) 據(jù)
{
unsigned char i;
for(i=0;i<8;i++) //8位計(jì)數(shù)器
{
DQ = 0; //拉低總線(xiàn)
DQ = dat & 0x01; //取最低位賦值給總線(xiàn)
sm2(2); //延時(shí)45us
DQ = 1; //拉過(guò)總線(xiàn)準(zhǔn)備寫(xiě)下一個(gè)數(shù)據(jù)(或者總線(xiàn)復(fù)位)
dat >>= 1; //數(shù)據(jù)右移一位
}
}
unsigned char d18b20_d() //讀 8 位 數(shù) 據(jù)
{
unsigned char i,dat=0;
for(i=0;i<8;i++) //8位計(jì)數(shù)器
{
DQ = 0; //拉低總線(xiàn)
dat >>= 1; //數(shù)據(jù)右移一位
DQ = 1; //拉過(guò)總線(xiàn)(準(zhǔn)備讀取數(shù)據(jù))
if(DQ) //判斷是否是 1 如果是就把數(shù)據(jù)賦值給變量的高位
dat |= 0x80;
sm2(1);
}
return dat; //返回讀取到數(shù)據(jù)數(shù)據(jù)
}


unsigned int wd() //讀取溫度函數(shù)
{
unsigned char i = 0; //低8位數(shù)據(jù)
unsigned char j = 0; //高8位數(shù)據(jù)
unsigned int k = 0; //無(wú)符號(hào)16整形用來(lái)存儲(chǔ)讀回來(lái)的 16位溫度數(shù)據(jù)(j和i組合后的數(shù)據(jù))

d18b20_qs(); //初始化
d18b20_x(0xCC); //跳過(guò)序列號(hào)的操作(因?yàn)?8b20在總線(xiàn)上可以?huà)旌芏鄠(gè),這個(gè)序列號(hào)和網(wǎng)卡MAC地址類(lèi)似)
d18b20_x(0x44); //開(kāi)啟溫度轉(zhuǎn)換
for(;k<15;k++) //開(kāi)啟溫度轉(zhuǎn)換需要時(shí)間這里延時(shí)一下15*150us
sm();
d18b20_qs(); //初始化
d18b20_x(0xCC); //跳過(guò)序列號(hào)的操作(因?yàn)?8b20在總線(xiàn)上可以?huà)旌芏鄠(gè),這個(gè)序列號(hào)和網(wǎng)卡MAC地址類(lèi)似)
d18b20_x(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
i = d18b20_d(); //讀取低8位
sm();
j = d18b20_d(); //讀取高8位

k = j;
k <<= 8;
k = k + i;
return k; //返回讀取到的16位數(shù)據(jù)
}
void zh(unsigned int i) //數(shù)碼管顯示緩存寫(xiě)入函數(shù)
{
unsigned char x,z;
x = i & 0x0f; //取出小數(shù)
i >>=4;
z = i & 0xff; //取出整數(shù)
switch(x) //小數(shù)位寫(xiě)人顯示緩存
{
case 0: hc[2]=DM[0];break;
case 1: hc[2]=DM[1];break;
case 2: hc[2]=DM[1];break;
case 3: hc[2]=DM[2];break;
case 4: hc[2]=DM[3];break;
case 5: hc[2]=DM[3];break;
case 6: hc[2]=DM[4];break;
case 7: hc[2]=DM[4];break;
case 8: hc[2]=DM[5];break;
case 9: hc[2]=DM[6];break;
case 10: hc[2]=DM[6];break;
case 11: hc[2]=DM[7];break;
case 12: hc[2]=DM[8];break;
case 13: hc[2]=DM[8];break;
case 14: hc[2]=DM[9];break;
case 15: hc[2]=DM[9];break;
}
x = z/10; //取出十位
hc[0]=DM[x];//十位緩存寫(xiě)入
x = z%10; //取出個(gè)位
hc[1] = DM[x] | 0x80;//個(gè)位緩存寫(xiě)入
}
/******************************串口操作函數(shù)********************************
void CSH  (void) //初始化串口
{

    SCON  = 0x50;        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重裝
    TH1   = 0xFD;               // TH1:  重裝值 9600 波特率 晶振 11.0592MHz  
    TR1   = 1;                  // TR1:  timer 1 打開(kāi)                         
    EA    = 1;                  //打開(kāi)總中斷
    //ES    = 1;                  //打開(kāi)串口中斷
}
void SendByte(unsigned char dat) //發(fā)送一個(gè)字符
{
 SBUF = dat; //SBUF 串行數(shù)據(jù)緩沖器
 while(!TI);  //TI發(fā)送中斷標(biāo)志位 (當(dāng)數(shù)據(jù)發(fā)送完畢后由硬件置 1 否則等待硬件置 1)
      TI = 0; 
}
*********************************串口操作函數(shù)**************************************/             
void main()
{
unsigned char k,i;
while(1)
{
zh(wd());
for(k=0;k<200;k++)
{
sm();
for(i=0;i<5;i++)
Delay6us();
}
}
}  

關(guān)閉窗口

相關(guān)文章