#include <reg52.h> #include <intrins.h> #define MAIN_Fosc 11059200UL //宏定義主時鐘HZ /*==================================== 自定義類型名 ====================================*/ typedef unsigned char INT8U; typedef unsigned char uchar; typedef unsigned int INT16U; typedef unsigned int uint; /*==================================== 硬件接口位聲明 ====================================*/ sbit DS = P2^2; //DS18B20單總線 sbit DU = P2^6; //數碼管段選 sbit WE = P2^7; //數碼管位選 /*==================================== 共陰極數碼管段選碼 ====================================*/ uchar code table[]={ //0 1 2 3 4 5 6 7 8 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, //9 A B C D E F - . 關顯示 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x80, 0x00 }; /*==================================== 數碼管位選碼 ====================================*/ //第1位 2位 3位 4位 5位 6位 7位 8位 uchar code T_COM[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};//數碼管位碼 /*==================================== 函數:void Delay_Ms(INT16U ms) 參數:ms,毫秒延時形參 描述:12T 51單片機自適應主時鐘毫秒級延時函數 ====================================*/ void Delay_Ms(INT16U ms) { INT16U i; do{ i = MAIN_Fosc / 96000; while(--i); //96T per loop }while(--ms); } /*us延時函數,執行一次US--所需6.5us進入一次函數需要11.95us*/ void Delay_us(uchar us) { while(us--); } /*==================================== 函數:void Display(INT16U Value) 參數:Value,顯示值 取值0-65535 描述:共陰極數碼管顯示函數可顯示一個字節的數 ====================================*/ void Display(INT16U Value) //注意由于需要顯示的數大于一個字節所有形參需為int型 { //------------------------------ DU = 0; //關閉段選 P0 = table[Value/100]; //數碼管顯示百位 DU = 1; //打開段選 DU = 0; //關閉段選 WE = 0; //關閉位選 P0 = T_COM[0]; //第一位數碼管 WE = 1; //打開位選 WE = 0; //關閉位選 Delay_Ms(3); //------------------------------- DU = 0; P0 = table[Value%100/10]|0x80; //顯示十位 DU = 1; DU = 0; WE = 0; P0 = T_COM[1]; //第二位數碼管 WE = 1; WE = 0; Delay_Ms(3); //------------------------------- DU = 0; P0 = table[Value%10]; //顯示個位 DU = 1; DU = 0; WE = 0; P0 = T_COM[2]; //第三位數碼管 WE = 1; WE = 0; Delay_Ms(3); } /*單總線初始化時序*/ bit ds_init() { bit i; DS = 1; _nop_(); DS = 0; Delay_us(75); //拉低總線499.45us 掛接在總線上的18B20將會全部被復位 DS = 1; //釋放總線 Delay_us(4); //延時37.95us 等待18B20發回存在信號 i = DS; Delay_us(20); //141.95us DS = 1; _nop_(); return (i); } /*寫一個字節*/ void write_byte(uchar dat) { uchar i; for(i=0;i<8;i++) { DS = 0; _nop_();//產生些時序 DS = dat & 0x01; Delay_us(10);//76.95us DS = 1; //釋放總線準備下一次數據寫入 _nop_(); dat >>= 1; } } uchar read_byte() { uchar i, j, dat; for(i=0;i<8;i++) { DS = 0; _nop_();//產生讀時序 DS = 1; _nop_();//釋放總線 j = DS; Delay_us(10);//76.95us DS = 1; _nop_(); dat = (j<<7)|(dat>>1); } return (dat); } void main() { uint i; uchar L, M; /* ds_init();//初始化DS18B20 write_byte(0xcc);//發送跳躍ROM指令 write_byte(0x4e);//寫暫存器指令 write_byte(0x7f); write_byte(0xf7); write_byte(0x1f);//配置工作在9位模式下 ds_init();//初始化DS18B20 write_byte(0xcc);//發送跳躍ROM指令 write_byte(0x48);*/ while(1) { ds_init();//初始化DS18B20 write_byte(0xcc);//發送跳躍ROM指令 write_byte(0x44);//發送溫度轉換指令 ds_init();//初始化DS18B20 write_byte(0xcc);//發送跳躍ROM指令 write_byte(0xbe);//讀取DS18B20暫存器值 L = read_byte(); M = read_byte(); i = M; i <<= 8; i |= L; i = i * 0.0625 * 10 + 0.5; Display(i); } }
|