⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.c

📁 万年历C程序
💻 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 + -