#include<reg52.h> #include <intrins.h> #define WRITE_SECOND 0x80 #define WRITE_MINUTE 0x82 #define WRITE_HOUR 0x84 #define READ_SECOND 0x81 #define READ_MINUTE 0x83 #define READ_HOUR 0x85 #define WRITE_PROTECT 0x8E #define READ_YEAR 0x8D #define READ_MONTH 0x89 #define READ_SUN 0x87 #define WRITE_YEAR 0x8C #define WRITE_MONTH 0x88 #define WRITE_SUN 0x86 #define uchar unsigned char #define uint unsigned int sbit DQ=P3^0; //定義接口 sbit CE=P3^1; sbit SCLK=P3^2; sbit DIO=P3^3; sbit ACC_7=ACC^7; uchar code shuzi[10][16]={ {0x00,0x00,0x00,0x1C,0x36,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1C,0x00,0x00},/*"0",0*/ {0x00,0x00,0x00,0x0C,0x0F,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3F,0x00,0x00},/*"1",1*/ {0x00,0x00,0x00,0x3E,0x63,0x63,0x63,0x30,0x30,0x18,0x0C,0x06,0x63,0x7F,0x00,0x00},/*"2",2*/ {0x00,0x00,0x00,0x3E,0x63,0x63,0x30,0x1C,0x30,0x60,0x60,0x63,0x33,0x1E,0x00,0x00},/*"3",3*/ {0x00,0x00,0x00,0x30,0x38,0x3C,0x36,0x36,0x33,0x33,0x7F,0x30,0x30,0x7C,0x00,0x00},/*"4",4*/ {0x00,0x00,0x00,0x7F,0x03,0x03,0x03,0x1F,0x37,0x60,0x60,0x63,0x33,0x1E,0x00,0x00},/*"5",5*/ {0x00,0x00,0x00,0x3C,0x36,0x03,0x03,0x1F,0x37,0x63,0x63,0x63,0x36,0x1C,0x00,0x00},/*"6",6*/ {0x00,0x00,0x00,0x7F,0x33,0x33,0x18,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x00,0x00},/*"7",7*/ {0x00,0x00,0x00,0x3E,0x63,0x63,0x63,0x36,0x1C,0x36,0x63,0x63,0x63,0x3E,0x00,0x00},/*"8",8*/ {0x00,0x00,0x00,0x1C,0x36,0x63,0x63,0x63,0x76,0x7C,0x60,0x60,0x36,0x1E,0x00,0x00},/*"9",9*/ }; uchar code wenzi1[8][16]={ {0x18,0xF8,0x8C,0x8C,0x86,0xFB,0x99,0x98,0x98,0x98,0xFF,0x80,0x80,0x80,0x80,0x80}, {0xF0,0x30,0x30,0x30,0xF0,0x30,0x30,0x30,0xF0,0x30,0x18,0x18,0x0C,0x06,0x03,0x00}, {0x00,0xFC,0x0C,0x0C,0x0C,0x0C,0xFC,0x0C,0x0C,0x0C,0x0C,0x0C,0xFC,0x0C,0x00,0x00}, {0x00,0x00,0x3F,0x33,0xF3,0x33,0x3F,0xF3,0xB3,0xB3,0x3F,0x00,0x00,0x00,0x00,0x00}, {0x98,0xB8,0x18,0x0C,0x0C,0x06,0x03,0xFD,0x30,0x30,0x30,0x30,0x18,0x8C,0x06,0x03}, {0x38,0x0F,0x0C,0xCC,0xFF,0xCC,0x6E,0x7E,0x3F,0x3F,0x0D,0x0C,0x0C,0x0C,0xCC,0x7C}, {0xC0,0x80,0xFE,0x66,0x66,0xFE,0x66,0xE6,0x06,0xF6,0x66,0xC6,0x86,0xC3,0x73,0x1D}, {0x00,0xF8,0x18,0xD8,0x18,0x18,0xF8,0x18,0xD8,0xD8,0xD8,0xD8,0xCC,0x0C,0x06,0x03}, }; uchar code wenzi2[8][16]={ {0x00,0x3F,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x01,0x7F,0x01,0x01,0x01,0x01,0x01},/*"年",0*/ {0x0F,0x0C,0x0C,0x0C,0x0F,0x0C,0x0C,0x0C,0x0F,0x0C,0x0C,0x0C,0x0C,0x0F,0x06,0x00},/*"月",1*/ {0x00,0x0F,0x0C,0x0C,0x0C,0x0C,0x0F,0x0C,0x0C,0x0C,0x0C,0x0C,0x0F,0x0C,0x00,0x00},/*"日",2*/ {0x0C,0x0C,0x0C,0x0C,0x7F,0x0C,0x0C,0x0C,0x0D,0x0D,0x0C,0x0C,0x0C,0x0C,0x0F,0x06},/*"時(shí)",3*/ {0x01,0x01,0x03,0x06,0x0E,0x1C,0x78,0x37,0x06,0x06,0x06,0x06,0x06,0x07,0x03,0x00},/*"分",4*/ {0x06,0x06,0x06,0x1E,0x37,0x66,0x66,0x06,0x66,0x66,0x30,0x18,0x0C,0x07,0x01,0x00},/*"秒",5*/ {0x00,0x01,0x7F,0x06,0x06,0x3F,0x06,0x07,0x00,0x1F,0x0C,0x06,0x03,0x0E,0x78,0x30},/*"度",6*/ {0x00,0x7F,0x63,0x6F,0x63,0x63,0x7F,0x60,0x6F,0x6C,0x6C,0x6F,0x6C,0x60,0x78,0x30},/*"周",0*/ }; uchar code xinq1[7][16]={ {0x00,0xF8,0x18,0x18,0x18,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00}, {0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00}, {0x00,0xFE,0x66,0x66,0x66,0x66,0x66,0x66,0x36,0x36,0x1E,0x0E,0x06,0xFE,0x06,0x00}, {0x00,0xFE,0xC0,0xC0,0xC0,0xC0,0xC0,0xFC,0x60,0x60,0x60,0x60,0x60,0xFF,0x00,0x00}, {0x60,0xC0,0x80,0x80,0xFF,0x00,0x00,0x60,0xE0,0x60,0x30,0x30,0x18,0x0C,0x06,0x00},
}; uchar code xinq2[7][16]={ {0x00,0x1F,0x18,0x18,0x18,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x00,0x00},/*"日",6*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"一",0*/ {0x00,0x18,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0x00,0x00,0x00},/*"二",1*/ {0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00},/*"三",2*/ {0x00,0x7F,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x7E,0x60,0x60,0x60,0x7F,0x60,0x00},/*"四",3*/ {0x00,0x3F,0x00,0x00,0x00,0x00,0x0C,0x1F,0x0C,0x0C,0x0C,0x0C,0x6C,0xFF,0x00,0x00},/*"五",4*/ {0x00,0x01,0x03,0x01,0xFF,0x00,0x00,0x03,0x06,0x0C,0x18,0x38,0x70,0x70,0x30,0x00},/*"六",5*/
};
uint temp,num; void delay(uint t) { for(;t>0;t--); } void ys(uint z)//延時(shí)z毫秒 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command { DQ = 1; delay(10); //DQ復(fù)位,不要也可行。 DQ = 0; //單片機(jī)拉低總線 delay(80); //精確延時(shí),維持至少480us DQ = 1; //釋放總線,即拉高了總線 delay(20); //此處延時(shí)有足夠,確保能讓DS18B20發(fā)出存在脈沖。 }
uchar Read_One_Byte() //讀取一個(gè)字節(jié)的數(shù)據(jù)read a byte date //讀數(shù)據(jù)時(shí),數(shù)據(jù)以字節(jié)的最低有效位先從總線移出 { uchar i = 0; uchar dat = 0; for(i=8;i>0;i--) { DQ = 0; //將總線拉低,要在1us之后釋放總線 //單片機(jī)要在此下降沿后的15us內(nèi)讀數(shù)據(jù)才會(huì)有效。 _nop_(); //至少維持了1us,表示讀時(shí)序開(kāi)始 dat >>= 1; //讓從總線上讀到的位數(shù)據(jù),依次從高位移動(dòng)到低位。 DQ = 1; //釋放總線,此后DS18B20會(huì)控制總線,把數(shù)據(jù)傳輸?shù)娇偩上 //延時(shí)7us,此處參照推薦的讀時(shí)序圖,盡量把控制器采樣時(shí)間放到讀時(shí)序后的15us內(nèi)的最后部分 if(DQ) //控制器進(jìn)行采樣 { dat |= 0x80; //若總線為1,即DQ為1,那就把dat的最高位置1;若為0,則不進(jìn)行處理,保持為0 } delay(8); //此延時(shí)不能少,確保讀時(shí)序的長(zhǎng)度60us。 } return (dat); }
void Write_One_Byte(uchar dat) { uchar i = 0; for(i=8;i>0;i--) { DQ = 0; //拉低總線 _nop_(); //至少維持了1us,表示寫(xiě)時(shí)序(包括寫(xiě)0時(shí)序或?qū)?時(shí)序)開(kāi)始 DQ = dat&0x01; //從字節(jié)的最低位開(kāi)始傳輸 //指令dat的最低位賦予給總線,必須在拉低總線后的15us內(nèi), //因?yàn)?5us后DS18B20會(huì)對(duì)總線采樣。 delay(10); //必須讓寫(xiě)時(shí)序持續(xù)至少60us DQ = 1; //寫(xiě)完后,必須釋放總線, dat >>= 1; delay(8); } }
uint Get_Tmp() //獲取溫度get the temperature { float tt; uchar a,b; Init_Ds18b20(); //初始化 Write_One_Byte(0xcc); //忽略ROM指令 Write_One_Byte(0x44); //溫度轉(zhuǎn)換指令 Init_Ds18b20(); //初始化 Write_One_Byte(0xcc); //忽略ROM指令 Write_One_Byte(0xbe); //讀暫存器指令 a = Read_One_Byte(); //讀取到的第一個(gè)字節(jié)為溫度LSB b = Read_One_Byte(); //讀取到的第一個(gè)字節(jié)為溫度MSB temp = b; //先把高八位有效數(shù)據(jù)賦于temp temp <<= 8; //把以上8位數(shù)據(jù)從temp低八位移到高八位 temp = temp|a; //兩字節(jié)合成一個(gè)整型變量 tt = temp*0.0625; //得到真實(shí)十進(jìn)制溫度值 //因?yàn)镈S18B20可以精確到0.0625度 //所以讀回?cái)?shù)據(jù)的最低位代表的是0.0625度 temp = tt*10+0.5; //放大十倍 //這樣做的目的將小數(shù)點(diǎn)后第一位也轉(zhuǎn)換為可顯示數(shù)字 //同時(shí)進(jìn)行一個(gè)四舍五入操作。 return temp; } void Write1302 (uchar addr,dat) //地址、數(shù)據(jù)發(fā)送子程序 { uchar i,temp; CE=0; //CE 引腳為低,數(shù)據(jù)傳送 中止 SCLK=0; //清零時(shí)鐘總線 CE=1; //CE 引腳為高,邏輯控制有效 for(i=8;i>0;i--) //循環(huán)8次移位 發(fā)送地址 { SCLK=0; temp=addr; DIO=(bit)(temp&0x01); //每次傳輸?shù)妥止?jié) addr>>=1; //右移一位 SCLK=1; } for(i=8;i>0;i-- ) //發(fā)送數(shù)據(jù) { SCLK=0; temp=dat; DIO=(bit)(temp&0x01); dat>>=1; SCLK=1; } CE = 0; } uchar Read1302(uchar addr) //數(shù)據(jù)讀取子程序 { uchar i,temp,dat1,dat2; CE=0; SCLK=0; CE = 1; for ( i=8; i>0; i-- ) //循環(huán)8次移位 發(fā)送地址 { SCLK=0; temp=addr; DIO=(bit)(temp&0x01); //每次傳輸?shù)妥止?jié) addr>>=1; //右移一位 SCLK=1; } //讀取數(shù)據(jù) for ( i=8; i>0; i-- ) { ACC_7=DIO; SCLK = 1; ACC>>=1; SCLK = 0; } CE=0; dat1=ACC; dat2=dat1/16; //數(shù)據(jù)進(jìn)制轉(zhuǎn)換 dat1=dat1%16; //十六進(jìn)制轉(zhuǎn)十進(jìn)制 dat1=dat1+dat2*10; return (dat1); } void dushij() { uchar i,j,xin,yue,ri,m; uint nian; nian=2012; temp=Get_Tmp(); ri=Read1302(READ_SUN); yue=Read1302(READ_MONTH); nian=Read1302(READ_YEAR); if(yue==1) m=13; if(yue==2) m=14; if(yue>2) m=yue; xin=((nian%100)+((nian%100)/4)+((nian/100)/4)-(2*(nian/100))+((26*(m+1))/10)+ri-1)%7; for(i=0;i<230;i++) for(j=0;j<3;j++) for(num=0;num<16;num++) { if(num+i<16) { P0=0X00; P2=0X00; P1=num; P0=shuzi[Read1302(READ_YEAR)/10][num+i]; P2=shuzi[Read1302(READ_YEAR)%10][num+i]; ys(2); } else if((num+i>=16)&(num+i<32)) { P0=0X00; P2=0X00; P1=num; P0=wenzi1[0][num+i-16]; P2=wenzi2[0][num+i-16]; ys(2); } else if((num+i>=32)&(num+i<48)) { P0=0X00; P2=0X00; P1=num; P0=shuzi[Read1302(READ_MONTH)/10][num+i-32]; P2=shuzi[Read1302(READ_MONTH)%10][num+i-32]; ys(2); } else if((num+i>=48)&(num+i<64)) { P0=0X00; P2=0X00; P1=num; P0=wenzi1[1][num+i-48]; P2=wenzi2[1][num+i-48]; ys(2); } else if((num+i>=64)&(num+i<80)) { P0=0X00; P2=0X00; P1=num; P0=shuzi[Read1302(READ_SUN)/10][num+i-64]; P2=shuzi[Read1302(READ_SUN)%10][num+i-64]; ys(2); } else if((num+i>=80)&(num+i<96)) { P0=0X00; P2=0X00; P1=num; P0=wenzi1[2][num+i-80]; P2=wenzi2[2][num+i-80]; ys(2); } else if((num+i>=96)&(num+i<112)) { P0=0X00; P2=0X00; P1=num; P0=shuzi[Read1302(READ_HOUR)/10][num+i-96]; P2=shuzi[Read1302(READ_HOUR)%10][num+i-96]; ys(2); } else if((num+i>=112)&(num+i<128)) { P0=0X00; P2=0X00; P1=num; P0=wenzi1[3][num+i-112]; P2=wenzi2[3][num+i-112]; ys(2); } else if((num+i>=128)&(num+i<144)) { P0=0X00; P2=0X00; P1=num; P0=shuzi[Read1302(READ_MINUTE)/10][num+i-128]; P2=shuzi[Read1302(READ_MINUTE)%10][num+i-128]; ys(2); } else if((num+i>=144)&(num+i<160)) { P0=0X00; P2=0X00; P1=num; P0=wenzi1[4][num+i-144]; P2=wenzi2[4][num+i-144]; ys(2); } else if((num+i>=160)&(num+i<176)) { P0=0X00; P2=0X00; P1=num; P0=wenzi1[7][num+i-160]; P2=wenzi2[7][num+i-160]; ys(2); } else if((num+i>=176)&(num+i<192)) { P0=0X00; P2=0X00; P1=num; P0=xinq1[xin][num+i-176]; P2=xinq2[xin][num+i-176]; ys(2); } else if((num+i>=192)&(num+i<208)) { P0=0X00; P2=0X00; P1=num; P0=shuzi[temp/100][num+i-192]; P2=shuzi[temp%100/10][num+i-192]; ys(2); } else if((num+i>=208)&(num+i<224)) { P0=0X00; P2=0X00; P1=num; P0=wenzi1[6][num+i-208]; P2=wenzi2[6][num+i-208]; ys(2); } else { P0=0X00; P2=0X00; P1=num; ys(2); } } } void main() { while(1) dushij(); }
|