标题: 基于stm32+DS18B20+lcd12864的温度检测设计源码 [打印本页]

作者: kingsleylo    时间: 2018-6-9 22:17
标题: 基于stm32+DS18B20+lcd12864的温度检测设计源码

主程序:
  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)



作者: 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