基于51单片机的多功能时钟温度计设计
(仿真+程序+原理图+PCB+设计报告)
具体功能:
1、采用LCD1602液晶显示。
2、显示项目有:年月日、星期、时分秒,温度。
3、采用时钟芯片DS1302,精确走时。板载3V纽扣电池,断电重新上电无需重新设置时间,由3V提供时钟芯片继续计时
4、五个按键操作:设置时钟键,增加键、减小键、设定闹钟键,秒表键。
5、具有ds18b20测温功能
6、秒表中可以实现开始、暂停、复位等功能
演示视频:
基于51单片机的多功能时钟温度计设计(仿真+程序+原理图+PCB+设计报告)
代码
void Write1302(uchar dat)
{
uchar i;
SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备
delay1(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续写8个二进制位数据
{
DATA=dat&0x01; //取出dat的第0位数据写入1302
delay(2); //稍微等待,使硬件做好准备
SCLK=1; //上升沿写入数据
delay1(2); //稍微等待,使硬件做好准备
SCLK=0; //重新拉低SCLK,形成脉冲
dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位
}
}
void WriteSet1302(uchar Cmd,uchar dat)
{
RST=0; //禁止数据传递
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
delay1(2); //稍微等待,使硬件做好准备
Write1302(Cmd); //写入命令字
Write1302(dat); //写数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
}
uchar Read1302(void)
{
uchar i,dat;
delay(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续读8个二进制位数据
{
dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位
if(DATA==1) //如果读出的数据是1
dat|=0x80; //将1取出,写在dat的最高位
SCLK=1; //将SCLK置于高电平,为下降沿读出
delay1(2); //稍微等待
SCLK=0; //拉低SCLK,形成脉冲下降沿
delay1(2); //稍微等待
}
return dat; //将读出的数据返回
}
uchar ReadSet1302(uchar Cmd)
{
uchar dat;
RST=0; //拉低RST
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
Write1302(Cmd); //写入命令字
dat=Read1302(); //读出数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
return dat; //将读出的数据返回
}
void Init_DS1302(void)
{
WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令
WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值
WriteSet1302(0x82,((12/10)<<4|(12%10))); //根据写分寄存器命令字,写入分的初始值
WriteSet1302(0x84,((11/10)<<4|(11%10))); //根据写小时寄存器命令字,写入小时的初始值
WriteSet1302(0x86,((25/10)<<4|(25%10))); //根据写日寄存器命令字,写入日的初始值
WriteSet1302(0x88,((1/10)<<4|(1%10))); //根据写月寄存器命令字,写入月的初始值
WriteSet1302(0x8c,((13/10)<<4|(13%10))); //nian
WriteSet1302(0x8a,((1/10)<<4|(1%10)));
}
void DisplaySecond(uchar x)
{
uchar i,j;
i=x/10;
j=x%10;
write_com(0xc7);
write_date(0x30+i);
write_date(0x30+j);
}
void DisplayMinute(uchar x)
{
uchar i,j;
i=x/10;
j=x%10;
write_com(0xc4);
write_date(0x30+i);
write_date(0x30+j);
}
void DisplayHour(uchar x)
{
uchar i,j;
i=x/10;
j=x%10;
write_com(0xc1);
write_date(0x30+i);
write_date(0x30+j);
}
void DisplayDay(uchar x)
{
uchar i,j;
i=x/10;
j=x%10;
write_com(0x89);
write_date(0x30+i);
write_date(0x30+j);
}
void DisplayMonth(uchar x)
{
uchar i,j;
i=x/10;
j=x%10;
write_com(0x86);
write_date(0x30+i);
write_date(0x30+j);
}
void DisplayYear(uchar x)
{
uchar i,j;
i=x/10;
j=x%10;
write_com(0x83);
write_date(0x30+i);
write_date(0x30+j);
}
void DisplayWeek(uchar x)
{ uchar i;
x=x*3;
write_com(0x8c);
for(i=0;i<3;i++)
{
write_date(table2[x]);
x++;
}
}
硬件设计
使用元器件:
单片机:STC89C51;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
IC座:DIP40;万能板:9*15 ;
液晶屏:LCD1602;排阻:1k*8;
时钟芯片:DS1302;
蜂鸣器:5V 有源;
三极管 :9012;晶振:11.0592;
电容:22pF,10uF/16V;电阻:1k;
电位器:10K;按键:6*6*5;
接线端子:5.08*2P;
温度传感器:DS18B20;
发光二极管:5mm红色;
自锁开关:8*8;导线:若干;
流程图:
设计资料
01 仿真图
本设计使用proteus7.8和proteus8.7两个版本设计,向下兼容,无需担心!具体如图!
02 原理图
本系统原理图采用Altium Designer19设计,具体如图!
03 程序
本设计使用软件keil4和keil5两个版本编程设计,无需担心!具体如图!
04 设计报告
一万两千字设计报告,具体如下!
05 资料图
资料获取请关注同名公众号,包括仿真源文件 、程序(含注释)、AD原理图、开题报告、设计报告、流程图、任务书等。具体内容如下,全网最全! !
资料获取请观看前面演示视频!
点赞分享,一起学习成长。