找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7075|回复: 11
收起左侧

基于stm32+DS18B20+lcd12864的温度检测设计源码

  [复制链接]
ID:254420 发表于 2018-6-9 22:17 | 显示全部楼层 |阅读模式

主程序:
  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include <stdio.h>
  4. #include "lcd12864.h"
  5. #include "ds18b20.h"  
  6. char bbb[32],ddd[32];  
  7. short aaa,ccc;         //0x20000014
  8. double c,d;
  9. #ifdef __GNUC__
  10. #define PUTCHAR_PROTOTYPE int__io_putchar(int ch)
  11. #else
  12. #define PUTCHAR_PROTOTYPE int fputc(intch, FILE *f)
  13. #endif
  14. int main(void)
  15. {
  16. SystemCoreClockUpdate ();
  17. delay_init(72);
  18. LCD_GPIOInit();
  19. LCD_Init();
  20.        while(DS18B20_Init())/
  21.        {
  22.               delay_ms(500);           
  23.        }     
  24. while (1)
  25. {  
  26.      LCD_Clear();
  27.               aaa=DS18B20_Get_Temp();
  28.    sprintf(bbb,"%d",aaa);
  29.               bbb[3]=bbb[2];
  30.               bbb[2]='.';
  31.               LCD_ShowString(1,1,"Temperature:");
  32.    LCD_ShowString(4, 2,(&(bbb[0])));
  33.               LCD_ShowString(6,2,"℃");
  34.    delay_us(1000000);  
  35. }  
  36. }
  37. 3.系统初始化:
  38. 3.1时钟的初始程序
  39. SystemCoreClockUpdate ();
  40. 3.2.I/O初始化程序
  41. GPIO_InitTypeDef GPIO_InitStructure;    //GPIO
  42. RCC_APB2PeriphClockCmd(       RCC_APB2Periph_GPIOA, ENABLE );    /GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;  
  43. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;  
  44. GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
  45. GPIO_Init(GPIOA,&GPIO_InitStructure);
  46. 3.3.18b20初始化程序
  47. 初始化要用到的几个 GPIO 引脚;初始化 ds18b20芯片;
  48. 程序为:
  49. u8 DS18B20_Init(void)
  50. {
  51.        GPIO_InitTypeDefGPIO_InitStructure;    //GPIO
  52.        RCC_APB2PeriphClockCmd(       RCC_APB2Periph_GPIOA, ENABLE ); //使能PORTA口时钟  
  53.        GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;  
  54.        GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;  //复用推挽输出
  55.        GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
  56.        GPIO_Init(GPIOA,&GPIO_InitStructure);
  57.        GPIO_SetBits(GPIOA,GPIO_Pin_0);
  58.        DS18B20_Rst();
  59.        returnDS18B20_Check();
  60. }
  61. 3.4.ds18b20中读入温度程序
  62. //从ds18b20得到温度值
  63. //精度:0.1C
  64. //返回值:温度值 (-550~1250)
  65. short DS18B20_Get_Temp(void)
  66. {                                                            
  67.    u8 temp;
  68.    u8 TL,TH;
  69.        shorttem;
  70.    DS18B20_Start ();                  
  71.    DS18B20_Rst();
  72.    DS18B20_Check();   
  73.    DS18B20_Write_Byte(0xcc);
  74.    DS18B20_Write_Byte(0xbe);  
  75.    TL=DS18B20_Read_Byte();   
  76.    TH=DS18B20_Read_Byte();
  77.                   
  78.     if(TH>7)
  79.    {
  80.        TH=~TH;
  81.        TL=~TL;
  82.        temp=0;//温度为负  
  83.    }else temp=1;//温度为正        
  84.    tem=TH; //获得高八位
  85.    tem<<=8;   
  86.    tem+=TL;//获得底八位
  87.    tem=(float)tem*0.625;//转换   
  88.        if(temp)returntem; //返回温度值
  89.        elsereturn -tem;   
  90. }
  91. 3.5.LCD显示程序
  92. //LCD端口初始化
  93. void LCD_GPIOInit (void)
  94. {
  95.   GPIO_InitTypeDefGPIO_InitStructure; //定义GPIO结构变量
  96. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能AFIO时钟(下一操作所必需)
  97. GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //启用SW-DP(关闭其他以开放IO口)
  98. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //关闭AFIO时钟
  99. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能数据端口时钟
  100. //以上是对单个I/O的初始化例子,本工程可以一次完成
  101. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能联络端口时钟
  102.   GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP; //推挽输出
  103.   GPIO_InitStructure.GPIO_Pin= LCD_RS_PIN | LCD_EN_PIN | LCD_RW_PIN;
  104. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  105.   GPIO_Init(LCD_EN_PORT,&GPIO_InitStructure);
  106. GPIO_Write(GPIOC,GPIO_ReadOutputData(GPIOC) | 0x000e); //输出高电平
  107. }
  108. //LCD初始化
  109. void LCD_Init (void)
  110. {
  111.   LCD_Wcmd(0x34);      //扩充指令操作
  112.   delay_us(100000);
  113.   LCD_Wcmd(0x30);      //基本指令操作
  114.   delay_us(100);
  115.   LCD_Wcmd(0x0C);      //显示开,关光标
  116.   delay_us(100);
  117.   LCD_Wcmd(0x01);      //清除LCD的显示内容
  118.   delay_us(5000);
  119. }
  120. //设定显示位置
  121. void LCD_SetCursor (u8 x, u8 y)
  122. {                          
  123.   if (y == 0)
  124.     {y = 0x80;}
  125.   else if (y == 1)
  126.     {y = 0x90;}
  127.   else if (y == 2)
  128.     {y = 0x88;}
  129.   else if (y == 3)
  130.     {y = 0x98;}
  131.   LCD_Wcmd(x + y);     //显示地址
  132. }
  133. //从(x,y)处开始显示一个字符串,*p:待显示字符串
  134. void LCD_ShowString (u8 x,u8 y, char *p)
  135. {
  136.          u8 i=0;
  137.   LCD_SetCursor(x, y);
  138.   while(*p != '\0')
  139.   {      
  140.     LCD_Wdata(*p++);
  141.   }  
  142. }
复制代码

全部资料51hei下载地址:
罗靖 课设.rar (347.29 KB, 下载次数: 295)
回复

使用道具 举报

ID:477769 发表于 2019-2-19 11:03 | 显示全部楼层
不好用啊
回复

使用道具 举报

ID:437392 发表于 2019-2-20 21:58 | 显示全部楼层
厉害了
回复

使用道具 举报

ID:407940 发表于 2019-9-2 10:20 | 显示全部楼层
是串行还是并行的程序?
回复

使用道具 举报

ID:779596 发表于 2020-6-15 22:45 | 显示全部楼层
你好,请问这个有proteus仿真图吗?
回复

使用道具 举报

ID:307544 发表于 2020-6-16 10:23 | 显示全部楼层
可以参考,有点使用价值
回复

使用道具 举报

ID:891191 发表于 2021-4-30 15:12 | 显示全部楼层
LCD怎么接的线啊
回复

使用道具 举报

ID:818895 发表于 2021-5-5 12:36 | 显示全部楼层
在偿试中,有得学习了。
回复

使用道具 举报

ID:915979 发表于 2021-5-5 18:03 | 显示全部楼层
那个大哥试了,这个好用吗
回复

使用道具 举报

ID:899569 发表于 2021-5-7 16:44 | 显示全部楼层
下了之后才发现这就是正点原子的示例源码,就改了IO口,里面错的字都一毛一样啊。
回复

使用道具 举报

ID:694006 发表于 2021-5-8 09:28 | 显示全部楼层
可以下载使用吗?
回复

使用道具 举报

ID:891191 发表于 2021-5-9 15:32 | 显示全部楼层
jin111 发表于 2021-5-7 16:44
下了之后才发现这就是正点原子的示例源码,就改了IO口,里面错的字都一毛一样啊。

请问这个怎么接的线啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表