资深版主
- 积分
- 10541
- 金钱
- 10541
- 注册时间
- 2017-2-18
- 在线时间
- 1908 小时
|
本帖最后由 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]
|
|