📄 1.c
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sclk=P1^6;//ds1302控制引脚 时钟引脚
sbit io=P3^5; //数据输入输出引脚
sbit rst=P1^7; //复位引脚
sbit rs= P2^5; //1602控制引脚 数据/命令选择端
sbit rw= P2^6;//读写选择端
sbit e= P2^7; //使能
sbit dq=P2^3;//DS18B20的输出端
sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^4;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
uchar table_date[]="DATE";
uchar table_time[]="TIME";
uchar table1[]="0,1,2,3,4,5,6,7,8,9";
void delay(uchar t) //delay(80)是798us;delay(14)是154us
{ //delay(4)是56us delay(5)是66us
while(t--);
}
void delay_50us(uchar t) //延时50us
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
/**************************************
ds1302声明
***************************************/
void write_1bite_ds1302(uchar dat);
void write_ds1302(uchar add,uchar dat);
uchar read_1bite_ds1302();
uchar read_ds1302(uchar add);
void init_ds1302();
/**************************************
1602声明
***************************************/
void write_commond(uchar commond);
void write_data(uchar data_);
void init_1602(void);
/**************************************
ds18b20声明
***************************************/
void init_ds18b20(); //ds18b20初始化
void write_1bite_ds18b20(uchar dat);
uchar read_1bite_ds18b20(void);
uchar read_ds18b20(void);
/**************************************
ds1302模式
***************************************/
void write_1bite_ds1302(uchar dat) //写一个字节函数
{
uchar i;
ACC=dat;
for(i=0;i<8;i++)
{
io=ACC0;
sclk=1;
sclk=0;
ACC=ACC>>1;
}
}
void write_ds1302(uchar add,uchar dat) //写1302
{
rst=0;
sclk=0;
rst=1;
write_1bite_ds1302(add);
write_1bite_ds1302(dat);
sclk=1;
rst=0;
}
uchar read_1bite_ds1302() //读一个字节函数
{
uchar i;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
ACC7=io;
sclk=1;
sclk=0;
}
return(ACC);
}
uchar read_ds1302(uchar add) //读1302
{
uchar a;
rst=0;
sclk=0;
rst=1;
write_1bite_ds1302(add);
a=read_1bite_ds1302();
sclk=1;
rst=0;
return(a);
}
void init_1302() //初始化
{
write_ds1302(0x8e,0x00);//关闭写保护
write_ds1302(0x90,0xaa);//充电寄存器设置
write_ds1302(0x80,0x00);//秒
write_ds1302(0x82,0x20);//分
write_ds1302(0x84,0x15);//时
write_ds1302(0x86,0x28);//日
write_ds1302(0x88,0x05);//月
write_ds1302(0x8a,0x04);//周
write_ds1302(0x8c,0x09);//年
write_ds1302(0x8e,0x80);//打开写保护
}
/**************************************
1602模式
***************************************/
void write_commond(uchar commond) //1602写指令
{ e=0;
rs=0;
rw=0;
P0=commond;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
void write_data(uchar data_) //1602写数据
{
e=0;
rs=1;
rw=0;
P0=data_;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
void init_1602(void) //1602初始化
{
delay_50us(300); //延时15ms,复位过程
write_commond(0x38); //不检测忙信号
delay_50us(100);
write_commond(0x38); //不检测忙信号
delay_50us(100);
write_commond(0x38); //不检测忙信号
write_commond(0x38);
write_commond(0x08); //显示关闭
write_commond(0x01); //显示清屏
write_commond(0x06); //显示光标移动设置,当读或写一个字符后,地址指针加一,且光标加一
write_commond(0x0c); //显示开及光标设置
}
/**************************************
ds18b20模式
***************************************/
void init_ds18b20()//初始化
{ uchar t;
dq=1;
delay(10);
dq=0;
delay(80);
dq=1;
delay(14);
t=dq;
delay(20);
}
void write_1bite_ds18b20(uchar dat) //向ds18b20写入1比特数据
{
uchar i;
for(i=0;i<8;i++)
{
dq=0;
dq=dat&0x01;
delay(5);
dq=1;
dat=dat>>1;
}
}
uchar read_1bite_ds18b20(void) //从ds18b20读取1比特数据
{ uchar a,i;
for(i=0;i<8;i++)
{
dq=0;
a=a>>1;
dq=1;
if(dq==1)
a=a|0x80;
delay(4);
}
return(a);
}
uchar read_ds18b20(void) //读取其中的温度
{
uchar a,b,t;
init_ds18b20();
write_1bite_ds18b20(0xcc);
write_1bite_ds18b20(0x44);
init_ds18b20();
write_1bite_ds18b20(0xcc);
write_1bite_ds18b20(0xbe);
a=read_1bite_ds18b20();//读取温度的LSB
b=read_1bite_ds18b20();//读取温度的MSB
t=(a>>4)|(b<<4) ; //
if(t>128) //最高位s是符号位,超过7二进制位数
t=~t+1; //所表示的十进制数是,取反加一
return(t);
}
void main()
{ uchar t,t1,t2;//显示温度的变量
uchar i;
uchar sec,sec1,sec2;
uchar min,min1,min2;
uchar hour,hour1,hour2;
uchar day,day1,day2;
uchar month,month1,month2;
uchar week;
uchar year,year1,year2;
EA=1;//开总中断
EX0=1;//开外部中断0
IT0=1;//下降沿触发
init_1302();
delay(5);
init_1602();
delay(5);
/**************************************
将不变的数据写入1602中
***************************************/
for(i=0;i<4;i++)
{
write_commond(0x80+0x00+i);
write_data(table_date[i]);
delay(10);
}
for(i=0;i<4;i++)
{
write_commond(0x80+0x40+i);
write_data(table_time[i]);
delay(10);
}
while(1)
{
/**************************************
从ds1302中读出数据
***************************************/
sec=read_ds1302(0x81);
sec1=sec&0x0f; //ds1302秒的个位 ds1302是8421BCD码显示
sec2=sec>>4; //ds1302秒的十位
min=read_ds1302(0x83);
min1=min&0x0f;
min2=min>>4;
hour=read_ds1302(0x85);
hour1=hour&0x0f;
hour2=hour>>4;
day=read_ds1302(0x87);
day1=day&0x0f;
day2=day>>4;
month=read_ds1302(0x89);
month1=month&0x0f;
month2=month>>4;
week=read_ds1302(0x8b);
year=read_ds1302(0x8d);
year1=year&0x0f;
year2=year>>4;
/**************************************
将从ds1302中读出数据写入1602
***************************************/
write_commond(0x80+0x04); //写年
write_data(table1[year2]);
write_commond(0x80+0x05);
write_data(table1[year1]);
write_commond(0x80+0x06);
write_data('/');
write_commond(0x80+0x07); //写月
write_data(table1[month2]);
write_commond(0x80+0x08);
write_data(table1[month1]);
write_commond(0x80+0x09);
write_data('/');
write_commond(0x80+0x0a);//写日
write_data(table1[day2]);
write_commond(0x80+0x0b);
write_data(table1[day1]);
write_commond(0x80+0x0d);
write_data('W');
write_commond(0x80+0x0e);//写星期
write_data(table1[week]);
write_commond(0x80+0x44); //写时
write_data(table1[hour2]);
write_commond(0x80+0x45);
write_data(table1[hour1]);
write_commond(0x80+0x46);
write_data(':');
write_commond(0x80+0x47); //写分
write_data(table1[min2]);
write_commond(0x80+0x48);
write_data(table1[min1]);
write_commond(0x80+0x49);
write_data(':');
write_commond(0x80+0x4a); //写秒
write_data(table1[sec2]);
write_commond(0x80+0x4b);
write_data(table1[sec1]);
//显示ds18b20
t=read_ds18b20();
t1=t/10; //温度的十位
t2=t%10; //温度的个位
write_commond(0x80+0x4d);
write_data('T');
write_commond(0x80+0x4e);
write_data(table1[t1]);
delay(10);
write_commond(0x80+0x4f);
write_data(table1[t2]);
delay(10);
}
}
void int0() interrupt 0
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -