基于STC15单片机温度光照检测系统-proteus仿真-源程序

一、系统方案

1、本设计采用STC15单片机作为主控器。

2、光敏电阻采集光照值送到液晶1602和串口显示。

3、DS18B20采集温度值,送到液晶1602和串口显示。

二、硬件设计

原理图如下:

三、单片机软件设计

1、首先是系统初始化

/----------------------------
初始化ADC
----------------------------
/

void InitADC()

{

P1M0 =1;

P1M1 =0;

P1 = 0Xff;

P1ASF = 0xff; //设置P1口为AD口

ADC_RES = 0; //清除结果寄存器

ADC_RESL = 0; //清除结果寄存器

ADC_CONTR = ADC_POWER | ADC_SPEEDLL;

delay_ms(2); //ADC上电并延时

}

2、液晶显示程序

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

功能描述:LCD1602写命令函数

入口参数int8 com

返回值:无

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

void lcd_wcom(uint8 com)

{

lcd1602_rs=0; //选择指令寄存器

lcd1602_rw=0; //选择写

P0=com; //把命令字送入P0

delay_ms(1); //延时一小会儿,让1602准备接收数据

lcd1602_en=1; //使能线电平变化,命令送入1602的8位数据口

lcd1602_en=0;

}

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

功能描述:LCD1602写数据函数

入口参数:uint8 dat

返回值:无

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

void lcd_wdat(uint8 dat)

{

lcd1602_rs=1; //选择数据寄存器

lcd1602_rw=0; //选择写

P0=dat; //把要显示的数据送入P0

delay_ms(1); //延时一小会儿,让1602准备接收数据

lcd1602_en=1; //使能线电平变化,数据送入1602的8位数据口

lcd1602_en=0;

}

3、DS18B20程序

sbit DQ=P2^4; //定义DS18B20总线I/O

//--声明全局函数--//

void Delay(uint i);

uchar Init_DS18B20(void);

uint ReadTemperature(void);

/延时子程序 /

void Delay(uint i) //约7.5us 真实约1.3us

{

while( i-- );

}

/读一个字节 /

unsigned char ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat=0;

for (i=8; i>0; i--)

{

DQ=0; // 给脉冲信号

dat>>=1;

DQ=1; // 给脉冲信号

if(DQ)

dat|=0x80;

Delay(100); //至少60us

}

return(dat);

}

/写一个字节 /

void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ=0;

DQ=dat&0x01;

Delay(100); //至少60us

DQ=1;

Delay(3); //至少1us

dat>>=1;

}

}

//发送温度转换命令

void Tmpchange(void)

{

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0x44); //启动温度转换

}

//DS18B20初始化

uchar Init_DS18B20(void)

{

unsigned char x=0;

DQ=1;

Delay(1000); //稍做延时

DQ=0; //单片机将DQ拉低

Delay(1000); //精确延时,大于480us

DQ=1; //拉高总线

Delay(80);

x=DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败

DQ=1;

Delay(500);

return x;

}

//读取温度值

uint ReadTemperature(void)

{

unsigned char a=0;

unsigned char b=0;

uint t=0;

Tmpchange();

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器

a=ReadOneChar(); //读低8位

b=ReadOneChar(); //读高8位

t=b;

t<<=8;

t=t|a; //高8位左移与低8位相或得到温度值

return t;

}

4、核心算法程序

/----------------------------
读取ADC结果 20210101 注释GetADCResult 用GetADCResultint代替
----------------------------
/

unsigned int GetADCResultint(unsigned char ch)

{

unsigned int ret=0;

ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
nop (); //等待4个NOP
nop ();
nop ();
nop ();

while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成

ADC_CONTR &= ~ADC_FLAG; //Close ADC

ret = ADC_RES*4 + ADC_RESL;

return ret; //返回ADC结果

}

四、 proteus仿真设计

Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。

相关推荐
吠品1 天前
智谱开源 ZCode 之后,真正的考试才开始
单片机·嵌入式硬件·1024程序员节
Chery11401 天前
高速ADC与精密DAC怎么选?DP9230D与DP8532D应用解析
嵌入式硬件·物联网·射频工程
小李不想当小白1 天前
SPI通信外设与W25Q64 (硬件SPI)(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
LCG米1 天前
STM32驱动W5500以太网模块实测:TCP吞吐瓶颈定位、TX指针回绕陷阱与断线重连保活落地
stm32·单片机·嵌入式硬件·tcp/ip
尼喃1 天前
662K/65Z5三脚稳压芯片规格书—PW6566B33/B30引脚功能
嵌入式硬件
创界工坊工作室1 天前
63-基于STC89C52霍尔传感器的智能化电能表设计
stm32·单片机·嵌入式硬件·51单片机·proteus
智购科技自动售货机厂家1 天前
让AI经营自动售货机:从Project Vend看工具权限与业务规则~YH
大数据·服务器·单片机·嵌入式硬件·深度学习
Zwawa1 天前
从 printf 到曲线:把数据送上 VOFA+
c语言·单片机·嵌入式
意法半导体STM321 天前
【官方原创】LAT6048 如何扩大MP2的A35核和M33核共享内存
stm32·单片机·嵌入式硬件·内存映射·stm32mp2
en.en..1 天前
STM32(F429)启动模式与两种烧录方式
stm32·单片机·嵌入式硬件