蓝桥杯单片机DS18B20代码注释及部分时序图
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯单片机DS18B20代码注释及部分时序图
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
藍橋杯單片機藍橋杯單片機DS18B20代碼注釋及部分時序圖
#include<STC15F2K60S2.H> #include<intrins.h>#define uchar unsigned char #define uint unsigned int sbit DQ=P1^4;uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF}; uchar yi,er,san,si,wu ,liu,qi,ba;void delayms(int ms); void Delay500us(); void Delay100us(); void allinit(); void keyscan(); void dsinit(); uchar read(); uchar temget(); void write(uchar dat); void rel(uchar dong); void display1(uchar yi,uchar er); void display2(uchar san,uchar si); void display3(uchar wu,uchar liu); void display4(uchar qi,uchar ba);void main() {uchar wendu;allinit();yi=11;er=11;san=11;si=11;wu=11;liu=0;qi=0;ba=0;while(1){wendu=temget();liu=wendu/100;qi=wendu%100/10;ba=wendu%10;display1(yi,er);display2(san,si);display3(wu,liu);display4(qi,ba);} }uchar temget() {uchar temp;uchar low,high;dsinit();//單總線上的所有處理均從初始化開始write(0xcc);//Skip ROM(跳過 ROM] [CCH]write(0x44);//Convert Temperature(溫度變換) [44H]Delay500us(); Delay500us(); //轉換需要一段時間,1000us足夠了dsinit();//單總線上的所有處理均從初始化開始write(0xcc);//Skip ROM(跳過 ROM] [CCH]write(0xbe);//Read Scratchpad(讀暫存存儲器) [BEH]low=read();high=read();temp=high<<4;//0000 0101 =0101 0000temp |= (low>>4); // 1010 0110 0000 0110 | 0101 0000=0101 0110return temp; }uchar read() {uchar i;uchar dat;for(i=0;i<8;i++){DQ=0;_nop_();//12M這個是1us,All read time slots must be a minimum of 60 μs in duration with a minimum of a 1 μs recovery timebetween slotsdat>>=1;DQ=1;if(DQ==1){dat |= 0x80;}Delay100us();//60 < tLOW0 < 120 }return dat; }void write(uchar dat) {uchar i;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;//0100 0100 & 0000 0001 // 0000 0001Delay100us();DQ=1;dat>>=1;//dat=dat>>1;//1001 0000//0010 0001} }void dsinit() {DQ=0;Delay500us();DQ=1;Delay500us(); }void Delay100us() //@11.0592MHz {unsigned char i, j;_nop_();_nop_();i = 2;j = 15;do{while (--j);} while (--i); }void Delay500us() //@11.0592MHz {unsigned char i, j;_nop_();_nop_();i = 6;j = 93;do{while (--j);} while (--i); }void delayms(int ms) {int i,j;for(i=ms;i>0;i--)for(j=845;j>0;j--); }void allinit() {P2=0XA0;P0=0X00;//關閉蜂鳴器,繼電器P2=0X80;P0=0XFF;//關閉LED燈P2=0XC0;P0=0XFF;//選擇所有數碼管P2=0XFF;P0=0XFF;//關閉所有數碼管 }void display1(uchar yi,uchar er) {P2=0XC0;//打開位選573 U8P0=0X01;//選擇第一個數碼管P2=0XFF;//打開段選573 U7P0=tab[yi];delayms(1);P2=0XC0;//打開位選573 U8P0=0X02;//選擇第二個數碼管P2=0XFF;//打開段選573 U7P0=tab[er];delayms(1); } void display2(uchar san,uchar si) {P2=0XC0;//打開位選573 U8P0=0X04;//選擇第三個數碼管P2=0XFF;//打開段選573 U7P0=tab[san];delayms(1);P2=0XC0;//打開位選573 U8P0=0X08;//選擇第四個數碼管P2=0XFF;//打開段選573 U7P0=tab[si];delayms(1); }void display3(uchar wu,uchar liu) {P2=0XC0;//打開位選573 U8P0=0X10;//選擇第一個數碼管P2=0XFF;//打開段選573 U7P0=tab[wu];delayms(1);P2=0XC0;//打開位選573 U8P0=0X20;//選擇第一個數碼管P2=0XFF;//打開段選573 U7P0=tab[liu];delayms(1); }void display4(uchar qi,uchar ba) {P2=0XC0;//打開位選573 U8P0=0X40;//選擇第一個數碼管P2=0XFF;//打開段選573 U7P0=tab[qi];delayms(1);P2=0XC0;//打開位選573 U8P0=0X80;//選擇第一個數碼管P2=0XFF;//打開段選573 U7P0=tab[ba];delayms(1); }?
?
執行序列(通過單線總線端口訪問 DS18B20?)
?
步驟1. 初始化
步驟2. ROM 操作指令
步驟3. DS18B20 功能指令
?
每一次 DS18B20 的操作都必須滿足以上步驟,若是缺少步驟或是順序混亂,器件將不會返回值。
例如這樣的順序:發起 ROM 搜索指令[F0h]和報警搜索指令[ECh]之后,總線控制器必須返回步驟 1。
?
初始化
通過單總線的所有執行操作處理都從一個初始化序列開始。
初始化序列包括一個由總線控制器發出的復位脈沖和其后由從機發出的存在脈沖。
存在脈沖讓總線控制器知道 DS18B20 在總線上且已準備好操作
?
兩個讀周期間至少 1us 的恢復時間。
?
詳細英文說明書上傳至我的資源
總結
以上是生活随笔為你收集整理的蓝桥杯单片机DS18B20代码注释及部分时序图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 多个实例 备份_Linux下
- 下一篇: wordpress 自定义分类url 重