余超 发表于 2018-12-5 20:27:31

【实验室培训_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自带的调试功能可以找出问题所在

李维强-15级 发表于 2018-12-6 22:05:23

:):):):)

鲁亮 发表于 2018-12-7 20:25:20

你是用的STM32做的任务呀!

余超 发表于 2018-12-7 20:30:17

是的,学长,其实我是个16级电科的,这学期才加的实验室,我们都没开单片机的课,只有自学了:'(。这学期才加的实验室,后来才发现大三加实验室是个贼尴尬的存在

鲁亮 发表于 2018-12-7 20:54:46

余超 发表于 2018-12-7 20:30
是的,学长,其实我是个16级电科的,这学期才加的实验室,我们都没开单片机的课,只有自学了。这学期才 ...

没事,大三加实验室也可以学,没关系
页: [1]
查看完整版本: 【实验室培训_201810期】 余超 第四周任务