【实验室培训_201810期】 余超 第四周任务
一、任务要求:根据按键的输入状态输出不同温度类型(摄氏度、华氏温度、开氏温度) ,当温度低于某个值,LED灯亮,否则灭
二、工作环境:
开发环境:MDK开发板:STM32F407ZGT6 外设:LED灯、按键开关、DHT11温湿度传感器。
三、实现步骤:
编写一个按键扫描函数,通个按键输入改变设定的一个变量的值,函数循环体中通过判断变量的值,来输出不同类型的温度值。
#include "sys.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "LED.H"
u8 temperatures,humiditys;//¶¨òåζè¡¢êa¶è±äá¿
u8 flag=1;
//¸′λDHT11
void DHT11_Rst()
{
key_mod_out();
key_out=0;
delay_ms(20);
key_out=1;
delay_us(30);//à-¸ß30us£¬μè′yDHT11Ïìó|
}
//¼ì2aDHT11êÇ·ñ¿ÕÏD
u8 DHT11_Check()
{
u8 wait_time=0;
DHT11_Rst();
key_mod_in();
while(key_in&&wait_time<100)
{
delay_us(1);
wait_time++;
}
if(wait_time>=100)
return 0;
else
wait_time=0;
while(!key_in&&wait_time<100)
{
delay_us(1);
wait_time++;
}
if(wait_time>=100)
return 0;
return 1;
}
//¶áò»¸öλ
u8 read_bit()
{
u8 wait_time=0;
while(key_in&&wait_time<100)//μè′y±äμí
{
delay_us(1);
wait_time++;
}
wait_time=0;
while(!key_in&&wait_time<100)//μè′y±ä¸ß
{
delay_us(1);
wait_time++;
}
delay_us(40);
if(key_in)
return 1;
else
return 0;
}
//¶á3öò»¸ö×Ö½úμÄêy¾Y
u8 read_byte()
{
u8 i,val=0;
for(i=0;i<8;i++)
{
val<<=1;
if(read_bit())
{
val|=0x01;
}
}
return val;
}
//¶á3öÎÂêa¶èÖμ
u8 read_data(u8 *a,u8 *b)
{
u8 i,buf,temp=0;
if(DHT11_Check())
{
for(i=0;i<5;i++)
{
buf=read_byte();
}
for(i=0;i<4;i++)
{
temp+=buf;
}
if(temp==buf)
{
//ζèÖμ
a=buf;
a=buf;
//êa¶èÖμ
b=buf;
b=buf;
}
else
return 0;
}
else
return 0;
return 1;
}
int main(void)
{
float temperature,humidity;
delay_init(168);
uart_init(115200);
LED_Init();
key_init();
if(DHT11_Check())
{
printf("ok");
}
else
printf("error");
printf("\r\n");
while(1)
{
KEY_Scan(0);//μ÷óð′¼üé¨Ãèoˉêy£¬¸Ä±äflagÖ죬èôflag=1,êä3öéãêÏζ裬flag=2,êä3ö»aêÏζ裬flag=3,êä3ö¿aêÏζè
delay_ms(2000);//ÿ2Ãë¶áè¡ò»′ÎÎÂêa¶è
if(temperature<19.0)
{
LED0=0;
}//èôζèμíóú19¶è£¬LED0áᣬ·ñÔòϨÃe
else
{
LED0=1;
}
if(read_data(temperatures,humiditys))
{
temperature=temperatures+0.0039*temperatures;
humidity=humiditys+0.0039*humiditys;
if(flag==1)
{
printf("temperature:%.2féãê϶è",temperature);
}
else if(flag==2)
{
printf("temperature:%.2f»aê϶è",temperature*1.8+32);
}
else if(flag==3)
{
printf("temperature:%.2f¿aê϶è",temperature+273);
}
printf("\r\n");
printf("humidity: °ù·ÖÖ®%.2f",humidity);
printf("\r\n");
}
else printf("unknow error\r\n");
}
}
四、实现效果及问题:
编程过程中总会有大大小小的问题,语法错误倒是很容易排查,然而逻辑错误很难排查,通过MDK自带的调试功能可以找出问题所在
:):):):) 你是用的STM32做的任务呀! 是的,学长,其实我是个16级电科的,这学期才加的实验室,我们都没开单片机的课,只有自学了:'(。这学期才加的实验室,后来才发现大三加实验室是个贼尴尬的存在 余超 发表于 2018-12-7 20:30
是的,学长,其实我是个16级电科的,这学期才加的实验室,我们都没开单片机的课,只有自学了。这学期才 ...
没事,大三加实验室也可以学,没关系
页:
[1]