|
代碼如下:
此程序在stc15系列單片機(jī)上運(yùn)行無(wú)誤 如需換成51單片機(jī)運(yùn)行 只需要更改溫度函數(shù)中的延時(shí)函數(shù)即可,應(yīng)為15系列單片機(jī)的運(yùn)行速度為51的10倍左右
微信圖片_20171231171017.jpg (103.23 KB, 下載次數(shù): 41)
下載附件
2018-1-5 19:04 上傳
此為效果圖
微信截圖_20180105190556.png (43.4 KB, 下載次數(shù): 44)
下載附件
2018-1-5 19:09 上傳
微信截圖_20180105190625.png (11.26 KB, 下載次數(shù): 41)
下載附件
2018-1-5 19:09 上傳
1515150439(1).jpg (126.92 KB, 下載次數(shù): 51)
下載附件
2018-1-5 19:09 上傳
此為電路圖
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sfr AUXR=0x8e;
sbit rw=P2^1;
sbit rs=P2^0;
sbit en=P1^2;
sbit CE=P1^3;
sbit SCL=P1^7;
sbit io=P2^3;
sbit DQ=P1^4;
uchar hang1[17]={"temperature= "}; //溫度顯示
uchar hang2[17]={"2000-00-00-00-00"}; //時(shí)間日期顯示
//年 月 時(shí) 分 秒
uchar hang3[17]={"Happy New Year!"};
uchar int_ds[]={50,59,23,31,12,7,17}; //初始化時(shí)間
// 秒分 時(shí) 日 月 周 年
uchar cmd_ds[7]; //存放讀取的時(shí)間
uchar new_char[]={0x04,0x0e,0x15,0x04,0x04,0x04,0x04,0x00}; //一個(gè)新的字符
uint sec_add;
bit sec_flag;
void int_t0();
void w_cmd(uchar cmd); //1602寫一個(gè)命令
void w_dat(uchar dat); //1602寫一個(gè)數(shù)據(jù)
void int_1602(); //初始化1602
void w_zfc(uchar x,uchar y,uchar *p); //寫入一個(gè)字符串
void delay_ms(uint time); //毫秒延時(shí)
void add_char(uchar cmd,uchar *p); //新增一個(gè)自定義字符 cmd為字符地址 *p為字符點(diǎn)陣函數(shù)
void DS1302_wuchar(uchar cmd); //1302寫入一個(gè)字節(jié)命令
uchar DS1302_ruchar(); //1302讀取一個(gè)字節(jié)命令
void write_DS1302(uchar cmd,uchar dat); //向cmd寄存器寫入一個(gè)dat命令
uchar red_DS1302(); //讀取一個(gè)字節(jié)函數(shù)
void red_ds(); //
void int_DS1302();
uchar red_temp(); //溫度傳感器函數(shù)
void DS_int();
void write_DS(uchar cmd);
uchar red_DS_1820();
void Delay500us();
void Delay100us();
void main()
{
uchar temp;
int_1602();
int_t0();
int_DS1302();
add_char(0,new_char);
w_zfc(0,0,hang1);
w_zfc(0,1,hang2);
while(1)
{
red_ds();
if(sec_flag)
{
temp=red_temp();
sec_flag=0;
}
hang1[12]=temp/10+0x30;
hang1[13]=temp%10+0x30;
hang2[14]=cmd_ds[0]/10+0x30; //秒
hang2[15]=cmd_ds[0]%10+0x30;
hang2[11]=cmd_ds[1]/10+0x30; //分
hang2[12]=cmd_ds[1]%10+0x30;
hang2[8]=cmd_ds[2]/10+0x30; //時(shí)
hang2[9]=cmd_ds[2]%10+0x30;
hang2[2]=cmd_ds[6]/10+0x30; //年
hang2[3]=cmd_ds[6]%10+0x30;
hang2[5]=cmd_ds[4]/10+0x30; //月
hang2[6]=cmd_ds[4]%10+0x30;
w_zfc(0,0,hang1);
w_zfc(0,1,hang2);
}
}
void t0() interrupt 1
{
sec_add++;
if(sec_add==1000)
{
sec_add=0;
sec_flag=1;
}
}
void int_t0()
{
AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0xCD; //設(shè)置定時(shí)初值
TH0 = 0xD4; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
EA=1;
ET0=1;
}
void w_cmd(uchar cmd)
{
rs=0;
rw=0;
en=0;
P0=cmd;
delay_ms(1);
en=1;
delay_ms(1);
en=0;
}
void w_dat(uchar dat)
{
rs=1;
rw=0;
en=0;
P0=dat;
delay_ms(1);
en=1;
delay_ms(1);
en=0;
}
void int_1602()
{
w_cmd(0x38);
w_cmd(0x08);
w_cmd(0x01);
w_cmd(0x06);
w_cmd(0x0c);
}
void add_char(uchar cmd,uchar *p)
{
uchar i;
cmd<<=4;
for(i=0;i<8;i++)
{
w_cmd(0x40|cmd+i);
w_dat(*p);
p++;
}
}
void w_zfc(uchar x,uchar y,uchar *p)
{
if(y==0)
w_cmd(0x80+x);
else
w_cmd(0xc0+x);
while(*p!='\0')
{
w_dat(*p);
p++;
}
}
void delay_ms(uint time) //毫秒延時(shí)函數(shù) 根據(jù)單片機(jī)速度不同更改 此處為15系列單片機(jī)速度 51應(yīng)i應(yīng)改成120左右
{
uint i;
while(time--)
{
for(i=0;i<800;i++);
}
}
void int_DS1302() //初始化DS1302,把int_ds[]數(shù)組里的數(shù)寫入相應(yīng)時(shí)間寄存器地址
{
write_DS1302(0x8e,0x00);
write_DS1302(0x80,int_ds[0]); //miao
write_DS1302(0x82,int_ds[1]); //fen
write_DS1302(0x84,int_ds[2]); //shi
write_DS1302(0x86,int_ds[3]); //ri
write_DS1302(0x88,int_ds[4]); //yue
write_DS1302(0x8a,int_ds[5]); //zhou
write_DS1302(0x8c,int_ds[6]); //nian
write_DS1302(0x8e,0x80);
}
void DS1302_wuchar(uchar cmd)
{
uchar i;
for(i=0;i<8;i++)
{
SCL=0;
io=cmd&0x01;
SCL=1;
cmd>>=1;
}
}
uchar DS1302_ruchar()
{
uchar dat,i;
for(i=0;i<8;i++)
{
SCL=0;
dat>>=1;
if(io)
dat|=0x80;
SCL=1;
}
return dat;
}
void write_DS1302(uchar cmd,uchar dat)
{
uchar x;
CE=0;
SCL=0;
CE=1;
DS1302_wuchar(cmd);
x=(dat/10<<4)|(dat%10);//十進(jìn)制轉(zhuǎn)換十六進(jìn)制
DS1302_wuchar(x);
CE=0;
}
uchar red_DS1302(uchar cmd)
{
uchar dat;
uchar dat1,dat2;
CE=0;
SCL=0;
CE=1;
DS1302_wuchar(cmd);
dat=DS1302_ruchar();
dat1=dat/16; //十六進(jìn)制轉(zhuǎn)十進(jìn)制
dat2=dat%16;
dat=dat1*10+dat2;
io=0;
CE=0;
return dat;
}
void red_ds()
{
write_DS1302(0x8e,0x00);
cmd_ds[0]=red_DS1302(0x81);
cmd_ds[1]=red_DS1302(0x83);
cmd_ds[2]=red_DS1302(0x85);
cmd_ds[3]=red_DS1302(0x87); //
cmd_ds[4]=red_DS1302(0x89); //
cmd_ds[5]=red_DS1302(0x8b); //
cmd_ds[6]=red_DS1302(0x8d); //
write_DS1302(0x8e,0x80);
}
void DS_int() //總線初始化
{
DQ = 0;
Delay500us();// 延時(shí)大于480us
DQ = 1;
Delay500us();
}
void write_DS(uchar cmd) //寫命令到DS18B20
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=cmd&0x01;
Delay100us();
DQ=1;
cmd>>=1;
}
}
void Delay500us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
void Delay100us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
uchar red_DS_1820() //讀取一個(gè)字節(jié)溫度
{
uchar temp,i;
for(i=0;i<8;i++)
{
DQ=0;
temp>>=1;
DQ=1;
if(DQ)
{
temp=temp|0x80;
}
Delay100us();
}
return temp;
}
uchar red_temp()
{
uchar low,high,temp;
DS_int();
write_DS(0xcc);
write_DS(0x44);
DS_int();
write_DS(0xcc);
write_DS(0xbe);
low=red_DS_1820();
high=red_DS_1820();
temp=high<<4;
temp=temp|(low>>4);
return temp;
}
|
-
-
1602萬(wàn)年歷 溫度顯示.rar
2018-1-5 19:11 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
396.87 KB, 下載次數(shù): 80, 下載積分: 黑幣 -5
評(píng)分
-
查看全部評(píng)分
|