标题:
基于stm32+DS18B20+lcd12864的温度检测设计源码
[打印本页]
作者:
kingsleylo
时间:
2018-6-9 22:17
标题:
基于stm32+DS18B20+lcd12864的温度检测设计源码
主程序:
#include "stm32f10x.h"
#include "delay.h"
#include <stdio.h>
#include "lcd12864.h"
#include "ds18b20.h"
char bbb[32],ddd[32];
short aaa,ccc; //0x20000014
double c,d;
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int__io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(intch, FILE *f)
#endif
int main(void)
{
SystemCoreClockUpdate ();
delay_init(72);
LCD_GPIOInit();
LCD_Init();
while(DS18B20_Init())/
{
delay_ms(500);
}
while (1)
{
LCD_Clear();
aaa=DS18B20_Get_Temp();
sprintf(bbb,"%d",aaa);
bbb[3]=bbb[2];
bbb[2]='.';
LCD_ShowString(1,1,"Temperature:");
LCD_ShowString(4, 2,(&(bbb[0])));
LCD_ShowString(6,2,"℃");
delay_us(1000000);
}
}
3.系统初始化:
3.1时钟的初始程序
SystemCoreClockUpdate ();
3.2.I/O初始化程序
GPIO_InitTypeDef GPIO_InitStructure; //GPIO
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); /GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
3.3.18b20初始化程序
初始化要用到的几个 GPIO 引脚;初始化 ds18b20芯片;
程序为:
u8 DS18B20_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure; //GPIO
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); //使能PORTA口时钟
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_0);
DS18B20_Rst();
returnDS18B20_Check();
}
3.4.ds18b20中读入温度程序
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_Get_Temp(void)
{
u8 temp;
u8 TL,TH;
shorttem;
DS18B20_Start ();
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);
DS18B20_Write_Byte(0xbe);
TL=DS18B20_Read_Byte();
TH=DS18B20_Read_Byte();
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0;//温度为负
}else temp=1;//温度为正
tem=TH; //获得高八位
tem<<=8;
tem+=TL;//获得底八位
tem=(float)tem*0.625;//转换
if(temp)returntem; //返回温度值
elsereturn -tem;
}
3.5.LCD显示程序
//LCD端口初始化
void LCD_GPIOInit (void)
{
GPIO_InitTypeDefGPIO_InitStructure; //定义GPIO结构变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能AFIO时钟(下一操作所必需)
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //启用SW-DP(关闭其他以开放IO口)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //关闭AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能数据端口时钟
//以上是对单个I/O的初始化例子,本工程可以一次完成
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能联络端口时钟
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Pin= LCD_RS_PIN | LCD_EN_PIN | LCD_RW_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_EN_PORT,&GPIO_InitStructure);
GPIO_Write(GPIOC,GPIO_ReadOutputData(GPIOC) | 0x000e); //输出高电平
}
//LCD初始化
void LCD_Init (void)
{
LCD_Wcmd(0x34); //扩充指令操作
delay_us(100000);
LCD_Wcmd(0x30); //基本指令操作
delay_us(100);
LCD_Wcmd(0x0C); //显示开,关光标
delay_us(100);
LCD_Wcmd(0x01); //清除LCD的显示内容
delay_us(5000);
}
//设定显示位置
void LCD_SetCursor (u8 x, u8 y)
{
if (y == 0)
{y = 0x80;}
else if (y == 1)
{y = 0x90;}
else if (y == 2)
{y = 0x88;}
else if (y == 3)
{y = 0x98;}
LCD_Wcmd(x + y); //显示地址
}
//从(x,y)处开始显示一个字符串,*p:待显示字符串
void LCD_ShowString (u8 x,u8 y, char *p)
{
u8 i=0;
LCD_SetCursor(x, y);
while(*p != '\0')
{
LCD_Wdata(*p++);
}
}
复制代码
全部资料51hei下载地址:
罗靖 课设.rar
(347.29 KB, 下载次数: 295)
2018-6-9 23:40 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
1339493121
时间:
2019-2-19 11:03
不好用啊
作者:
scj123
时间:
2019-2-20 21:58
厉害了
作者:
1468216262
时间:
2019-9-2 10:20
是串行还是并行的程序?
作者:
豆馅儿
时间:
2020-6-15 22:45
你好,请问这个有proteus仿真图吗?
作者:
hzd530
时间:
2020-6-16 10:23
可以参考,有点使用价值
作者:
萨姆空间
时间:
2021-4-30 15:12
LCD怎么接的线啊
作者:
zzh999
时间:
2021-5-5 12:36
在偿试中,有得学习了。
作者:
641572636
时间:
2021-5-5 18:03
那个大哥试了,这个好用吗
作者:
jin111
时间:
2021-5-7 16:44
下了之后才发现这就是正点原子的示例源码,就改了IO口,里面错的字都一毛一样啊。
作者:
bmdlzwh
时间:
2021-5-8 09:28
可以下载使用吗?
作者:
萨姆空间
时间:
2021-5-9 15:32
jin111 发表于 2021-5-7 16:44
下了之后才发现这就是正点原子的示例源码,就改了IO口,里面错的字都一毛一样啊。
请问这个怎么接的线啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1