#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},/*"時",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)//延時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復位,不要也可行。 DQ = 0; //單片機拉低總線 delay(80); //精確延時,維持至少480us DQ = 1; //釋放總線,即拉高了總線 delay(20); //此處延時有足夠,確保能讓DS18B20發出存在脈沖。 }
uchar Read_One_Byte() //讀取一個字節的數據read a byte date //讀數據時,數據以字節的最低有效位先從總線移出 { uchar i = 0; uchar dat = 0; for(i=8;i>0;i--) { DQ = 0; //將總線拉低,要在1us之后釋放總線 //單片機要在此下降沿后的15us內讀數據才會有效。 _nop_(); //至少維持了1us,表示讀時序開始 dat >>= 1; //讓從總線上讀到的位數據,依次從高位移動到低位。 DQ = 1; //釋放總線,此后DS18B20會控制總線,把數據傳輸到總線上 //延時7us,此處參照推薦的讀時序圖,盡量把控制器采樣時間放到讀時序后的15us內的最后部分 if(DQ) //控制器進行采樣 { dat |= 0x80; //若總線為1,即DQ為1,那就把dat的最高位置1;若為0,則不進行處理,保持為0 } delay(8); //此延時不能少,確保讀時序的長度60us。 } return (dat); }
void Write_One_Byte(uchar dat) { uchar i = 0; for(i=8;i>0;i--) { DQ = 0; //拉低總線 _nop_(); //至少維持了1us,表示寫時序(包括寫0時序或寫1時序)開始 DQ = dat&0x01; //從字節的最低位開始傳輸 //指令dat的最低位賦予給總線,必須在拉低總線后的15us內, //因為15us后DS18B20會對總線采樣。 delay(10); //必須讓寫時序持續至少60us DQ = 1; //寫完后,必須釋放總線, 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); //溫度轉換指令 Init_Ds18b20(); //初始化 Write_One_Byte(0xcc); //忽略ROM指令 Write_One_Byte(0xbe); //讀暫存器指令 a = Read_One_Byte(); //讀取到的第一個字節為溫度LSB b = Read_One_Byte(); //讀取到的第一個字節為溫度MSB temp = b; //先把高八位有效數據賦于temp temp <<= 8; //把以上8位數據從temp低八位移到高八位 temp = temp|a; //兩字節合成一個整型變量 tt = temp*0.0625; //得到真實十進制溫度值 //因為DS18B20可以精確到0.0625度 //所以讀回數據的最低位代表的是0.0625度 temp = tt*10+0.5; //放大十倍 //這樣做的目的將小數點后第一位也轉換為可顯示數字 //同時進行一個四舍五入操作。 return temp; } void Write1302 (uchar addr,dat) //地址、數據發送子程序 { uchar i,temp; CE=0; //CE 引腳為低,數據傳送 中止 SCLK=0; //清零時鐘總線 CE=1; //CE 引腳為高,邏輯控制有效 for(i=8;i>0;i--) //循環8次移位 發送地址 { SCLK=0; temp=addr; DIO=(bit)(temp&0x01); //每次傳輸低字節 addr>>=1; //右移一位 SCLK=1; } for(i=8;i>0;i-- ) //發送數據 { SCLK=0; temp=dat; DIO=(bit)(temp&0x01); dat>>=1; SCLK=1; } CE = 0; } uchar Read1302(uchar addr) //數據讀取子程序 { uchar i,temp,dat1,dat2; CE=0; SCLK=0; CE = 1; for ( i=8; i>0; i-- ) //循環8次移位 發送地址 { SCLK=0; temp=addr; DIO=(bit)(temp&0x01); //每次傳輸低字節 addr>>=1; //右移一位 SCLK=1; } //讀取數據 for ( i=8; i>0; i-- ) { ACC_7=DIO; SCLK = 1; ACC>>=1; SCLK = 0; } CE=0; dat1=ACC; dat2=dat1/16; //數據進制轉換 dat1=dat1%16; //十六進制轉十進制 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(); }
|