OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5009|回复: 17

[miniF103] MINIV3_DS18B20数字温度显示(支持OLED,TFTLCD,串口打印)测试程序

[复制链接]

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
发表于 2019-1-18 18:32:05 | 显示全部楼层 |阅读模式
本帖最后由 peng1554 于 2019-1-26 16:30 编辑

有用户想要PC0接DS18B20的数据引脚不成功,且用户用的是OLED模块来显示温度数据,所以改了这个程序需要注意的是:

1,DS0(连接在PA8)
2,串口1(波特率:9600,PA9/PA10连接在板载USB转串口芯片CH340上面)
3,ALIENTEK 2.8/3.5/4.3/7寸TFTLCD模块(通过GPIO驱动,连接关系见lcd.h)
4,DS18B20传感器一个(接在PC0上).(板子左上角的18B20引脚用杜邦线接板子正上放PC0引脚)
5.ALIENTEK 0.96'OLED模块



整个工程基于 ALIENTEK Mini STM32开发板范例代码23 修改,将OLED驱动放在了HARDWAVE文件夹并将相关文件添加到工程
由于OLED的字符数组与lcd的字符数组冲突,所以将oledfont.h中的数组名称作了修改

整个工程重要的是这Lcd_Show()和Oled_Show(),分别如下:
[mw_shl_code=c,true]void Lcd_Show()
{
        u8 t=0;                           
        short temperature;   
         LCD_Init();
         POINT_COLOR=RED;//设置字体为红色
        LCD_ShowString(60,50,200,16,16,"Mini STM32");        
        LCD_ShowString(60,70,200,16,16,"DS18B20 TEST");        
        LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(60,110,200,16,16,"2014/3/12");                  
         while(DS18B20_Init())        //DS18B20初始化        
        {
                LCD_ShowString(60,130,200,16,16,"DS18B20 Error");
                delay_ms(200);
                LCD_Fill(60,130,239,130+16,WHITE);
                 delay_ms(200);
        }                                                                  
        LCD_ShowString(60,130,200,16,16,"DS18B20 OK");
        POINT_COLOR=BLUE;//设置字体为蓝色
         LCD_ShowString(60,150,200,16,16,"Temp:   . C");         
        while(1)
        {                        
                 if(t%10==0)//每100ms读取一次
                {                                                                          
                        temperature=DS18B20_Get_Temp();        
                        if(temperature<0)
                        {
                                LCD_ShowChar(60+40,150,'-',16,0);                        //显示负号
                                temperature=-temperature;                                        //转为正数
                        }else LCD_ShowChar(60+40,150,' ',16,0);                        //去掉负号
                        LCD_ShowNum(60+40+8,150,temperature/10,2,16);        //显示正数部分            
                           LCD_ShowNum(60+40+32,150,temperature%10,1,16);        //显示小数部分
                        printf("temperature data is:  %d.%d C\r\n",temperature/10,temperature%10);
                }                                   
                 delay_ms(10);
                t++;
                if(t==20)                                                                                        //LED闪烁,提示程序在运行
                {
                        t=0;
                        LED0=!LED0;
                }
        }
}

void Oled_Show()
{  
        u8 t=0;                           
        short temperature;  
        OLED_Init();                        //初始化OLED   
        OLED_ShowString(0,0,"ALIENTEK",12);  
        OLED_ShowString(0,12, "DS18B20 TEST",12);
         while(DS18B20_Init())        //DS18B20初始化        
        {
                OLED_ShowString(0,24, "DS18B20 Error!",12);
                OLED_Refresh_Gram();//更新显示到OLED
                delay_ms(1000);
        }               
        OLED_ShowString(0,24, "DS18B20 OK!",12);
        OLED_Refresh_Gram();//更新显示到OLED
        delay_ms(1000);
        OLED_ShowString(0,36, "Temp:   . C",16);
        while(1)
        {                        
                 if(t%10==0)//每100ms读取一次
                {                                                                          
                        temperature=DS18B20_Get_Temp();        
                        if(temperature<0)
                        {
                                OLED_ShowChar(40,36,'-',16,1);                                //显示负号
                                temperature=-temperature;                                        //转为正数
                                OLED_Refresh_Gram();                                                //更新显示到OLED
                        }else
                        {
                                OLED_ShowChar(40,36,' ',16,1);                                //去掉负号
                                OLED_ShowNum(40+8,36,temperature/10,2,16);        //显示正数部分
                                OLED_ShowNum(72,36,temperature%10,1,16);        //显示小数部分
                                OLED_Refresh_Gram();                                                //更新显示到OLED
                                printf("temperature data is:  %d.%d C\r\n",temperature/10,temperature%10);
                        }
                }                                   
                 delay_ms(10);
                t++;
                if(t==20)                                                                                        //LED闪烁,提示程序在运行
                {
                        t=0;
                        LED0=!LED0;
                }
        }
}[/mw_shl_code]

通过宏定义OLED_OR_TFTLCD来决定TFTLCD显示还是OLED显示,工程默认使用TFTLCD显示,改为0则是OLED显示
main()函数如下
[mw_shl_code=c,true] int main(void)
{

        delay_init();                                                                                     //延时函数初始化         
        uart_init(9600);                                                                                 //串口初始化为9600
        LED_Init();                                                                                                  //初始化与LED连接的硬件接口
#if        OLED_OR_TFTLCD
         Lcd_Show();
#else
         Oled_Show();
#endif                 
}[/mw_shl_code]
温度截图1.JPG

MINIV3_DS18B20数字温度显示(支持OLED,TFTLCD,串口打印)测试程序.rar

2.42 MB, 下载次数: 412

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
286
金钱
286
注册时间
2018-12-31
在线时间
12 小时
发表于 2019-1-19 10:19:32 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-6-15
在线时间
4 小时
发表于 2019-6-19 13:22:50 | 显示全部楼层
请问楼主有线连接的图片吗,我有点不明白怎么连接的
回复 支持 反对

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
 楼主| 发表于 2019-6-19 15:19:39 | 显示全部楼层
l15180203323 发表于 2019-6-19 13:22
请问楼主有线连接的图片吗,我有点不明白怎么连接的

用的原子的板子 液晶屏/OLED模块,直插就行
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-6-15
在线时间
4 小时
发表于 2019-6-20 09:06:01 | 显示全部楼层
peng1554 发表于 2019-6-19 15:19
用的原子的板子 液晶屏/OLED模块,直插就行

好的,谢谢您
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-6-15
在线时间
4 小时
发表于 2019-6-20 16:26:06 | 显示全部楼层
为什么杜邦线要接那两个引脚
回复 支持 反对

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
 楼主| 发表于 2019-6-20 18:09:45 | 显示全部楼层
l15180203323 发表于 2019-6-20 16:26
为什么杜邦线要接那两个引脚

哪两个?
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-4-27
在线时间
16 小时
发表于 2019-10-18 15:43:10 | 显示全部楼层
好像没用
回复 支持 反对

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
 楼主| 发表于 2019-10-18 17:34:14 | 显示全部楼层

用的原子的板子 OLED和液晶屏 ?
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-4-27
在线时间
16 小时
发表于 2019-10-20 16:02:52 | 显示全部楼层
peng1554 发表于 2019-10-18 17:34
用的原子的板子 OLED和液晶屏 ?

是的 MINI板 显示不出来  
改了代码以后  显示的一直是0
回复 支持 反对

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
 楼主| 发表于 2019-10-21 18:45:16 | 显示全部楼层
JamesGordan 发表于 2019-10-20 16:02
是的 MINI板 显示不出来  
改了代码以后  显示的一直是0

那你那边屏烧写例程正常不?
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-4-27
在线时间
16 小时
发表于 2019-10-21 20:40:39 | 显示全部楼层
peng1554 发表于 2019-10-21 18:45
那你那边屏烧写例程正常不?

ds18b20_init();检测不到ds的存在,一直读取1,进入死循环。
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-10-22
在线时间
5 小时
发表于 2019-10-24 23:43:41 | 显示全部楼层
为什么用您的程序我检测不到传感器,用之前的程序都可以正常使用 那个是只有LCD屏幕显示
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-10-22
在线时间
5 小时
发表于 2019-10-24 23:45:15 | 显示全部楼层
为什么用您的程序检测不到传感器,显示DS ERROR   用之前程序(只有LCD屏幕显示的)就可以正常使用
回复 支持 反对

使用道具 举报

19

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2017-5-19
在线时间
63 小时
发表于 2019-10-25 11:13:23 | 显示全部楼层
这样有一个问题啊,你每次更新显示都会刷屏,给人的感觉是这个屏幕一直在闪,有没有方法能够做到只刷新显示温度的那块oled区域,其他区域不变化,不整个刷屏
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-12-8
在线时间
1 小时
发表于 2019-12-10 17:24:32 | 显示全部楼层
xuehzy 发表于 2019-10-25 11:13
这样有一个问题啊,你每次更新显示都会刷屏,给人的感觉是这个屏幕一直在闪,有没有方法能够做到只刷新显示 ...

用显示字符串函数即可
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2019-12-11
在线时间
8 小时
发表于 2019-12-11 11:28:43 | 显示全部楼层
多谢楼主啊!!!
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2019-7-7
在线时间
9 小时
发表于 2020-2-2 14:33:04 | 显示全部楼层
楼主为啥我用51和ds18B20通信 他却没回应啊 引脚没写错 啊


bit Get18B20Ack()
{
        bit ack;
       
        EA=0;
        IO_18B20=0;
        DelayX10us(50);
        IO_18B20=1;
        DelayX10us(6);
        ack=IO_18B20;
        while(!IO_18B20);
        EA=1;
       
        return ack;

}
我用的是数码管显示  因为没传过来数据导致 一直显示00摄氏度
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 22:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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