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

相关推荐
萧技电创EIIA25 分钟前
基于stc12单片机的PID恒温烙铁设计
单片机·嵌入式硬件·pid过程控制
szxinmai主板定制专家2 小时前
基于 ZYNQ ARM+FPGA+AI YOLOV4 的电网悬垂绝缘子缺陷检测系统的研究
arm开发·人工智能·嵌入式硬件·yolo·fpga开发
光子物联单片机2 小时前
STM32G474单片机开发入门(八)内部FLASH详解及读写实战
stm32·单片机·嵌入式硬件·mcu
BreezeJuvenile2 小时前
通用定时器_输入捕获介绍及案例实操
stm32·单片机·嵌入式硬件·输入捕获·通用定时器
时空自由民.3 小时前
无人机系统耗电,低功耗管理问题解决方法(chatgpt)
单片机·嵌入式硬件·无人机
时空自由民.3 小时前
无人机系统耗电,低功耗管理问题解决方法(腾讯元宝)
单片机·嵌入式硬件·无人机
清风6666664 小时前
基于单片机的双档输出数字直流电压源设计
单片机·mongodb·毕业设计·nosql·课程设计
牛马大师兄4 小时前
STM32独立看门狗IWDG与窗口看门狗WWDG知识梳理笔记
笔记·stm32·单片机·嵌入式硬件·嵌入式·看门狗
夜月yeyue4 小时前
STM32 Flash 访问加速器详解(ART Accelerator)
linux·单片机·嵌入式硬件·uboot·bootloard
A9better5 小时前
嵌入式开发学习日志37——stm32之USART
stm32·嵌入式硬件·学习