基于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仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。

相关推荐
BT-BOX36 分钟前
第三章|新建STM32CubeMX工程生成keil工程和proteus联调仿真
stm32·嵌入式硬件·proteus
forAllforMe2 小时前
用STM32+LAN9252, 生成一个etherCAT 从机系统,实现数据采集功能
网络·stm32·嵌入式硬件
yezhailiaoke2 小时前
【CANoe测试系列】-程控电源控制
单片机·嵌入式硬件
白掰虾6 小时前
一分钟上手STM32CubeMX2——STM32C5点灯
stm32·单片机·嵌入式硬件·stm2cubemx2·stm32c5
YY_Share6 小时前
为什么笔记本电脑电源适配器基本是19V供电
嵌入式硬件·电路设计
宁静致远20217 小时前
Cadence Allegro 17.4的neck模式(瓶颈模式)走线
嵌入式硬件·硬件
逐步前行7 小时前
STM32_NVIC_中断控制
stm32·单片机·嵌入式硬件
Suifqwu8 小时前
stm32之移植MbedTLS以及算法实现
stm32·嵌入式硬件·算法
forAllforMe8 小时前
用STM32+LAN9252做etherCAT 运动控制从机方案
stm32·单片机·嵌入式硬件
WYH2878 小时前
FreeRTOS工程项目实践
c语言·单片机·嵌入式硬件·学习