單匯流排延時函式
//單匯流排延時函式,此處延時函式很重要,根據自己的時鐘頻率而定
void
delay_onewire
(unsigned
int t)
//y5指令集,fosc:11059200l,軟體延時15us(t=1)
}
單匯流排寫時序
//通過單匯流排向ds18b20寫乙個位元組
void
write_ds18b20
(unsigned
char dat)
delay_onewire(2);}
單匯流排讀時序
//從ds18b20讀取乙個位元組
unsigned
char
read_ds18b20
(void
)delay_onewire(2
);}return dat;
}
//ds18b20裝置初始化
bit init_ds18b20
(void
)
//讀取溫度
float
rd_temperature
(void
)
#include
"reg52.h"
#include
"ds18b20.h"
#define fosc 11059200l
#define t1ms (65536-fosc/1000)
//1t模式
#define n 10
sfr auxr =
0x8e
;sbit n_relay = p0^4;
sbit n_buzz = p0^6;
sbit led_1 = p0^0;
sbit led_2 = p0^1;
unsigned
char code duan=
;//共陰極段選0~9
unsigned
char code wei=
;//共陰極位選 1--8
unsigned
char c[n]
;unsigned
char
smg_chai
(unsigned
int t)
;float temperature =0;
unsigned
int t =58;
unsigned
char s=
0,i1=0;
void
t0init()
void
main()
else
i1 =
smg_chai
(temperature)
;//注釋:鎖存器真麻煩
// p0=0x00; p2 = 0xc0; p2 = 0x00; //關閉下位選,達到消隱的目的。
p0=0xff
;//關閉下段選,達到消隱的目的。
p2 =
0xe0
; p0=
~duan[c[s]
]; p2 =
0x00
; p0=
0x00
;//進入位選前先把p0清零,禁止選通數碼管。
p2 =
0xc0
; p0=
~wei[
7-s]
; p2 =
0x00
; p0=
0xff;}
}/* timer0 interrupt routine */
void
tm0_isr
() interrupt 1
else
s=0;if
(count--==0
)}unsigned
char
smg_chai
(unsigned
int t)
c[i]
=t;}
return i;
}
程式還有許多可改進之處,歡迎各路大神批評指正。
單匯流排協議對時序要求嚴格,一定按照datasheet給的時序一步一步寫;讀取到錯誤值4095或者沒有值,一定先檢查時序。
ct107d開發板的鎖存器可能有其獨到之處,首先節省了io口,其次作為驅動使用,但是在使用之時注意何時開何時關。
寫程式邏輯和時序很重要。
溜了溜了~~~
藍橋杯CT107D之PCF8591
include reg52.h include intrins.h include iic.h 匯流排引腳定義 sbit sda p2 1 資料線 sbit scl p2 0 時鐘線 void iic delay unsigned char i while i 匯流排啟動條件 void iic st...
CT107D微控制器DS18b20程式
1 初始化 2 rom指令 3 暫存器指令 注意 官方提供的初始化驅動應延時500微妙,讀寫驅動應延時80微妙 include include define uchar unsigned char define uint unsigned int sbit dq p1 4 uchar code ta...
CT107D藍橋杯EEPROM使用(8)
今天我給大家講一下eeprom的使用,該記憶體採用的是iic通訊,所有我們要有乙個iic驅動程式,或者自己寫乙個,我前面寫過乙個,我這裡就不寫了。那麼下面我寫乙個開機計數的程式吧,這裡需要顯示出來。這裡我選擇數碼管顯示,數碼管驅動前面也有,我就直接用了 unsigned char read eepr...