基于STC15单片机-LM35-DS8B20温度测量-DS1302计时-proteus仿真-源程序

一、系统方案
本设计采用STC15单片机作为主控器。
DS18B20采集温度值送到液晶1602显示。
DS1302计时,日期送到液晶1602显示。
LM35采集另一路温度值送到数码管显示。
在这里插入图片描述

二、硬件设计
原理图如下:
在这里插入图片描述

三、单片机软件设计
1、首先是系统初始化

/IO初始化为准双向/
void IO_Init()
{
P0M0 = 0x00;P0M1 = 0x00;
P1M0 = 0x00;P1M1 = 0x00;
P2M0 = 0x00;P2M1 = 0x00;
P3M0 = 0x00;P3M1 = 0x00;
P4M0 = 0xFF;P4M1 = 0x00;
P5M0 = 0x00;P5M1 = 0x00;
P6M0 = 0x00;P6M1 = 0x00;
P7M0 = 0x00;P7M1 = 0x00;
P0 = 0x00;P1 = 0x00;P2 = 0x00;P3 = 0x00;
P4 = 0x00;P5 = 0x00;P6 = 0x00;P7 = 0x00;
}

2、液晶显示程序

//==写指令函数=
void LCD_write_command(uchar command)
{
LCD_DB=command;
LCD_RS=0;//指令
LCD_RW=0;//写入
LCD_E=1;
LCD_E=0;
delay_ms(2);//等待执行完毕 。。。
}
//=写数据函数=
void LCD_write_data(uchar dat)
{ LCD_DB=dat;
LCD_RS=1;//数据寄存器
LCD_RW=0;//写入数据
LCD_E=1;
LCD_E=0;
delay_ms(2);//等待程序执行完毕 。。。
}
//=初始化函数
=
void LCD_init(void)
{
LCD_write_command(0x38);//设置8位格式,2行,57
LCD_write_command(0x38);//设置8位格式,2行,5
7
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
LCD_write_command(0x06);//设定输入方式,增量不移位
LCD_write_command(0x01);//清屏显示
LCD_write_command(0x80);
delay_ms(2);
}
3、DS1302检测程序
/*******************************************************************************

  • 函 数 名 : Ds1302Write
  • 函数功能 : 向DS1302命令(地址+数据)
  • 输 入 : addr,dat
  • 输 出 : 无
    *******************************************************************************/

void Ds1302Write(uchar addr, uchar dat)
{
uchar n;
RST = 0;
nop();

SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1; //然后将RST(CE)置高电平。
_nop_();

for (n=0; n<8; n++)//开始传送八位地址命令
{
	DSIO = addr & 0x01;//数据从低位开始传送
	addr >>= 1;
	SCLK = 1;//数据在上升沿时,DS1302读取数据
	_nop_();
	SCLK = 0;
	_nop_();
}
for (n=0; n<8; n++)//写入8位数据
{
	DSIO = dat & 0x01;
	dat >>= 1;
	SCLK = 1;//数据在上升沿时,DS1302读取数据
	_nop_();
	SCLK = 0;
	_nop_();	
}	
	 
RST = 0;//传送数据结束
_nop_();

}

/*******************************************************************************

  • 函 数 名 : Ds1302Read
  • 函数功能 : 读取一个地址的数据
  • 输 入 : addr
  • 输 出 : dat
    *******************************************************************************/

uchar Ds1302Read(uchar addr)
{
uchar n,dat,dat1;
RST = 0;
nop();

SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1;//然后将RST(CE)置高电平。
_nop_();

for(n=0; n<8; n++)//开始传送八位地址命令
{
	DSIO = addr & 0x01;//数据从低位开始传送
	addr >>= 1;
	SCLK = 1;//数据在上升沿时,DS1302读取数据
	_nop_();
	SCLK = 0;//DS1302下降沿时,放置数据
	_nop_();
}
_nop_();
for(n=0; n<8; n++)//读取8位数据
{
	dat1 = DSIO;//从最低位开始接收
	dat = (dat>>1) | (dat1<<7);
	SCLK = 1;
	_nop_();
	SCLK = 0;//DS1302下降沿时,放置数据
	_nop_();
}

RST = 0;_nop_();	//以下为DS1302复位的稳定时间,必须的。	
SCLK = 1;_nop_();	
DSIO = 0;_nop_();
DSIO = 1;_nop_();

return dat;	

}

/*******************************************************************************

  • 函 数 名 : Ds1302Init
  • 函数功能 : 初始化DS1302.
  • 输 入 : 无
  • 输 出 : 无
    *******************************************************************************/

void Ds1302Init()
{
uchar n;
Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能
for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
{
Ds1302Write(WRITE_RTC_ADDR[n],time[n]);
}
Ds1302Write(0x8E,0x80); //打开写保护功能
}

/*******************************************************************************

  • 函 数 名 : Ds1302ReadTime
  • 函数功能 : 读取时钟信息
  • 输 入 : 无
  • 输 出 : 无
    *******************************************************************************/

void Ds1302ReadTime()
{
uchar n;
for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
{
time[n] = Ds1302Read(READ_RTC_ADDR[n]);
}

}

4、核心算法程序

/温度转换显示函数/
void Disp_Temperature(uint temp) //显示温度
{
uchar WenduData[8]; //实时温度
float tp=0.0;
tp=temp;
temp=tp0.0625100+0.5;
sprintf(WenduData,“%d.%d”,temp/100,temp%100);
gotoxy(0,2);
LCD_display(WenduData);
LCD_write_data(0xdf);LCD_write_data(‘C’);//LCD显示温度数据
}
四、proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bbxyliyang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值