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

相关推荐
Jason_zhao_MR4 小时前
Linux与实时控制如何兼得
linux·嵌入式硬件·机器人·工业控制
BSD_CGQ5 小时前
FSR传感器STM32 DMA高速采样工程实现(高精度、低CPU占用)
stm32·单片机·嵌入式硬件·压力传感器·源头工厂·柔性薄膜压力传感器·可变电阻压力传感器
芯岭技术郦7 小时前
32 位 ARM® Cortex®-M0+ 内核MCU普冉MS32C001-C
单片机·嵌入式硬件
骑着毛驴数星星7 小时前
STM32 CAN波特率与采样点计算,基于HAL库
stm32·单片机·嵌入式硬件
zhangrelay8 小时前
Arduino-MEGA-ESP单片机理论课笔记02-硬件-2026
笔记·单片机·嵌入式硬件
艾芯微科技9 小时前
钰泰 ETA5055V330DD1E|SOT-223 3.3V LDO,低压差、大电流线性稳压选型分享
网络·单片机·嵌入式硬件·集成测试·51单片机
新晨单片机设计10 小时前
S023A-基于STM32单片机智能插座【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus·单片机智能插座
威嵌神州10 小时前
恩智浦 T1022 性能怎么样?QorIQ 架构中端工业嵌入式优势解析
嵌入式硬件
weixin_6906547410 小时前
龙迅#LT9611EX 现MIPI转HDMI1.4功能主推型号,分辨率高达4K30HZ,IC内置I2C无需外部12C控制。
嵌入式硬件·音视频·信号处理
EatFans11 小时前
全栈自造 Status Deck(四):硬件终于到了,从点亮屏幕到跑通第一个 Demo
单片机·物联网