1、实验简介
实现郭天祥老师视频中的DS12C887时钟万年历实验以及一个使用DS18B20进行温度采集的实验。两个实验具体实现的功能如下所示:

1、通过读取按键修改时间、闹钟信息(通过LCD1602显示);
2、闹钟触发时,蜂鸣器报警;
3、将采集到的温度信息显示在LCD或数码管上。

2、电路结构图

Fig 1

如Fig 1所示,DS12C887定时闹钟电路的结构图由四部分组成:数码管显示模块,按键输入模块,蜂鸣器报警模块以及DS12C887时钟电路。在系列(五)、(七)中详细介绍了数码管以及按键部分,在此不做过多赘述。其余的蜂鸣器报警模块电路如Fig 2中所示,由三极管放大电路以及蜂鸣器BELL组成,单片机通过输出高低电平来控制放大电路的开关进而使得蜂鸣器发出声响,有关蜂鸣器的详细资料(有源和无源)请参见相关的芯片手册。DS12C887的芯片引脚图如Fig 3所示,其中需要连接到单片机上的引脚为4-11、13-15以及19号引脚,详细的引脚功能信息请参见芯片手册。
Fig 2
Fig 3

3、代码

为了避免大量重复的代码,将两个模块的核心代码封装成了库文件,如果有源码的需求可以联系我。

1、万年历

```c
#include <reg52.h>
#include <DS12C887.h>
void init()
{

	
	 	uchar num;
		EN=0;
		dula=0;
		wela=0;
		write_zhiling(0x38);
		write_zhiling(0x0c);
		write_zhiling(0x06);
		write_zhiling(0x01);
		write_zhiling(0x80);
		for(num=0;num<15;num++)
		{
			write_shuju(table[num]);
			delay(5);
		}
		write_zhiling(0x80+0x40);
		for(num=0;num<12 ;num++)
		{
			write_shuju(table1[num]);
			delay(5);
		}
		EA=1;
		EX0=1;
		IT0=1;

		set_aclok(10,20,30);	//设置闹钟
		write_ds(0x0b,0x26);//开启定时器闹钟

}
void didi()
{
	Beep=1;
	delay(200);
	Beep=0;
	delay(200);
	Beep=1;
}
void  main()
{
	init();
	while(1)
	{
		keyscan();
		if(flag1==1)
			didi();
		if(flag==0)
		{
			miao=read_ds(0);
			fen=read_ds(2);
			shi=read_ds(4);
			day=read_ds(7);
			month=read_ds(8);
			year=read_ds(9);
		  	week=read_ds(6);
		  
			write_sfm(10,miao);
			write_sfm(7,fen);
			write_sfm(4,shi);
			write_ymd(9,day);
			write_ymd(6,month);
			write_ymd(3,year);
			write_week(12,week);
		} 	
	}
}

2、温度采集

#include <reg52.h>
#include <intrins.h>
#include "LCD1602.H"
#include "DS18B20.H"
#define uchar unsigned char
#define uint unsigned int
void main(void)
{
	uchar TL;//暂存器温度低位
	uchar TH; //高位
	uchar TN;	  //温度整数部分
	uchar TD;	   //小数
	cmg88();
	LcdInitiate();
	delaynms(5);
	if(Init_DS18B20==0)
		display_error();
	display_explain();
	display_symbol();
	display_dot();
	display_cent();
	while(1)
	{
		ReadyReadTemp();
		TL=ReadOneChar();
		TH=ReadOneChar();
		TN=TH*16+TL/16;
		TD=(TL%16)*10/16;
		display_temp1(TN);
		display_temp2(TD);
		delaynms(10);
	}
}