proteus仿真stm32103r6,实现18B20温度值在1602上显示,可测量正负温度。程序及仿真工程已上传附件,利用proteus仿真18b20温度为0和-0.1时返回值均为零,新手上路,请多指教。使用proteus8.8版本进行仿真。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机部分程序如下:
#include "stm32f10x.h"
#include "bsp-lcd1602.h"
#include "delay.h"
#include "sys.h"
#include "ds18b20.h"
#include <stdio.h>
#include "math.h"
short tem,tem1;
u8 a,b,c,t;
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
void Delay_DS18B20(int num)
{
while(num--) ;
}
int main(void)
{
SystemCoreClockUpdate ();
LCD1602_Init();
LCD1602_ShowStr(2,0,"tempe=000.0C",13);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef g;
g.GPIO_Mode = GPIO_Mode_Out_PP;
g.GPIO_Speed = GPIO_Speed_10MHz;
g.GPIO_Pin = GPIO_Pin_8 ;
GPIO_Init(GPIOB,&g);
GPIO_SetBits(GPIOB,GPIO_Pin_8); //输出1
t=DS18B20_DQ_IN;
while(t){
DS18B20_IO_OUT(); //SET PG11 OUTPUT
DS18B20_DQ_OUT=0; //拉低DQ
Delay_DS18B20(750); //拉低750us
DS18B20_DQ_OUT=1; //DQ=1
Delay_DS18B20(15); //15US
DS18B20_IO_IN(); //SET PG11 INPUT
Delay_DS18B20(100);
t=DS18B20_DQ_IN;
// LCD_ShowNum(13,0,t);
}
tem=DS18B20_Get_Temp();
Delay_DS18B20(1000000);
while(1)
{
tem=DS18B20_Get_Temp();
if( tem>0)
{ a=tem/100;
b=tem%100/10;
c=tem%10;
LCD_ShowChar(8,0,'+');
LCD_ShowNum(9,0,a);
LCD_ShowNum(10,0,b);
LCD_ShowNum(12,0,c);
}
else
{
// tem1=(int)tem;
// tem1=abs(tem1);
tem1=-(tem);
tem1=tem1+1;
a=tem1/100;
b=tem1%100/10;
c=tem1%10;
LCD_ShowChar(8,0,'-');
LCD_ShowNum(9,0,a);
LCD_ShowNum(10,0,b);
LCD_ShowNum(12,0,c);
}
Delay_DS18B20(100000);
}
全部资料51hei下载地址:
STM32+1602+18B20.7z
(327.43 KB, 下载次数: 1805)
|