#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í)序開始
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í)序的長度60us。
}
return (dat);
}
void Write_One_Byte(uchar dat)
{
uchar i = 0;
for(i=8;i>0;i--)
{
DQ = 0; //拉低總線
_nop_(); //至少維持了1us,表示寫時(shí)序(包括寫0時(shí)序或?qū)?時(shí)序)開始
DQ = dat&0x01; //從字節(jié)的最低位開始傳輸
//指令dat的最低位賦予給總線,必須在拉低總線后的15us內(nèi),
//因?yàn)?5us后DS18B20會(huì)對(duì)總線采樣。
delay(10); //必須讓寫時(shí)序持續(xù)至少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); //溫度轉(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();
}
畫流程圖有沒有獎(jiǎng)金呀 ???
畫流程圖有沒有獎(jiǎng)金呀 ???
QQ 85385639 可以聯(lián)系我歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |