一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 4831|回复: 10
收起左侧

[STM8/STM32] 簡易 溫溼度顯示 使用溫溼度模組以及LED 顯示模組

[复制链接]
发表于 2015-4-18 14:29 | 显示全部楼层 |阅读模式
手頭許多 7段顯示模組 LGC-12002 搭配 DHT01 作一個 溫溼度顯示 這個電路是由 時鐘溫度計變更程式的,電路板同一片 加上10K電阻 10K的NTC 兩個開關則可以變成時間溫度計




DHT.JPG


TEMPHUMI.jpg




//for PCB layout setting
#include "STM8s.h"
#include "stm8s_clk.h"
#include "stm8s_tim4.h"
#define DHT_Port GPIOF
#define DHT_data GPIO_PIN_4
#define LEDPORT GPIOC
#define DIN GPIO_PIN_4  //
#define STB GPIO_PIN_2  //3
#define Clk GPIO_PIN_3  //2
#define LED2PORT GPIOC
#define STB2 GPIO_PIN_1



u8 a,b,tg,th;
u8 count80,count81;//計數時間
u8 DHT_get;
u8 DHT[5];
display_2table[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
u16 display_time;
u16 DHTI1,DHTBuf1;//avg humidity
u16 DHTI2,DHTBuf2;//avg temperature

u8 display_flag;
u8 avg_count;

void Delayus(u16 ust)//
{
        while(ust !=0)
        {
                ust--;
        }
}

void DelayMs(u16 mst)
{
        while( mst !=0)
        {
                Delayus(1315);//164
                mst--;
        }
}

void GPIOinit(void)
{
        GPIO_Init(LEDPORT,DIN|STB|Clk|STB2,GPIO_MODE_OUT_PP_HIGH_FAST);//for LCM driver
        GPIO_Init(LED2PORT,STB2,GPIO_MODE_OUT_PP_HIGH_FAST);//for LCM driver-------------STB independence
        }

       
/*
  20141116 send Databyte
*/

void Send6961_Data(u8 Dat)
{
          u8 i;
                                GPIO_WriteLow(LEDPORT,STB);

         for (i=0;i<8;i++)
         {
          if((Dat & 0x01)!=0)// SER=Dat & 0x80;
                                        {
                                         GPIO_WriteHigh(LEDPORT,DIN);
                                  }
                                        else
                                        {
                                        GPIO_WriteLow(LEDPORT,DIN);
                                        }
          Dat>>=1;
                                  GPIO_WriteLow(LEDPORT,Clk);//  GPIO_WriteLow(LEDPORT,Clk);
                                  GPIO_WriteHigh(LEDPORT,Clk);
         }       
                                GPIO_WriteLow(LEDPORT,STB);  
}

/*
   20141116 send command byte
*/

void Send6961_Cmd(u8 Dat)
{
          u8 i;
                    GPIO_WriteHigh(LEDPORT,STB);
                                GPIO_WriteLow(LEDPORT,STB);

         for (i=0;i<8;i++)
         {
          if((Dat & 0x01)!=0)// SER=Dat & 0x80;
                                        {
                                         GPIO_WriteHigh(LEDPORT,DIN);
                                  }
                                        else
                                        {
                                        GPIO_WriteLow(LEDPORT,DIN);
                                        }
          Dat>>=1;
                                  GPIO_WriteLow(LEDPORT,Clk);// Clk=0;
                                  GPIO_WriteHigh(LEDPORT,Clk);
         }
                                GPIO_WriteHigh(LEDPORT,STB);
}


//LED2

void Send6961_Cmd2(u8 Dat)
{
          u8 i;
                    GPIO_WriteHigh(LED2PORT,STB2);
                                GPIO_WriteLow(LED2PORT,STB2);

         for (i=0;i<8;i++)
         {
          if((Dat & 0x01)!=0)// SER=Dat & 0x80;
                                        {
                                         GPIO_WriteHigh(LEDPORT,DIN);
                                  }
                                        else
                                        {
                                        GPIO_WriteLow(LEDPORT,DIN);
                                        }
          Dat>>=1;
                                  GPIO_WriteLow(LEDPORT,Clk);// Clk=0;
                                  GPIO_WriteHigh(LEDPORT,Clk);
         }
                                GPIO_WriteHigh(LED2PORT,STB2);
}


void Send6961_Data2(u8 Dat)
{
          u8 i;
                    GPIO_WriteLow(LED2PORT,STB2);
                                GPIO_WriteLow(LED2PORT,STB2);

         for (i=0;i<8;i++)
         {
          if((Dat & 0x01)!=0)// SER=Dat & 0x80;
                                        {
                                         GPIO_WriteHigh(LEDPORT,DIN);
                                  }
                                        else
                                        {
                                        GPIO_WriteLow(LEDPORT,DIN);
                                        }
          Dat>>=1;
                                  GPIO_WriteLow(LEDPORT,Clk);// Clk=0;
                                  GPIO_WriteHigh(LEDPORT,Clk);
         }
                                GPIO_WriteLow(LED2PORT,STB2);
}


void PT6961_Init(void) // 8bit mode
{
        DelayMs(200);
        Send6961_Cmd(0x40);//CMD 2 fix address normal mode
        Send6961_Cmd(0xc0);//CMD 3 address=0
        Send6961_Data(0x0);
        Send6961_Data(0x00);
        Send6961_Data(0x00);
        Send6961_Data(0x00);       
        Send6961_Cmd(0x02);//CMD 1 6digit 12segment
        Send6961_Cmd(0x89);//CMD 4 display control bright 14/16
        DelayMs(1);
       
        //        DelayMs(200);
        Send6961_Cmd2(0x40);//CMD 2 fix address normal mode
        Send6961_Cmd2(0xc0);//CMD 3 address=0
        Send6961_Data2(0x0);
        Send6961_Data2(0x00);
        Send6961_Data2(0x00);
        Send6961_Data2(0x00);       
        Send6961_Cmd2(0x02);//CMD 1 6digit 12segment
        Send6961_Cmd2(0x89);//CMD 4 display control bright 14/16
        DelayMs(1);
}



void DEMO_display(void)
{//display humidity
        Send6961_Cmd(0x40);//CMD 2 fix address normal mode
        Send6961_Cmd(0xc0);//CMD 3 address=0
        Send6961_Data(0xf0);//空白
  Send6961_Data(display_2table[a]);//5
        Send6961_Data(0xf0);//空白
        Send6961_Data(display_2table);//5
        Send6961_Data(0xf0);//空白
        Send6961_Data(0x50);//r
        Send6961_Data(0xf0);//空白
        Send6961_Data(0x76);//H
        Send6961_Cmd(0x02);//CMD 1 6digit 12segment
        Send6961_Cmd(0x89);//CMD 4 display control bright 14/16                       
        DelayMs(1);       
}


void DEMO_display1(void)
{
//display temperature
        Send6961_Cmd2(0x40);//CMD 2 fix address normal mode
        Send6961_Cmd2(0xc0);//CMD 3 address=0
        Send6961_Data2(0xf0);//空白
        Send6961_Data2(display_2table[tg]);//5
        Send6961_Data2(0xf0);//空白
        Send6961_Data2(display_2table[th]);//5
        Send6961_Data2(0xf0);//空?
        Send6961_Data2(0x63);//5?
        Send6961_Data2(0xf0);//空白
        Send6961_Data2(0x39);//C
        Send6961_Cmd2(0x02);//CMD 1 6digit 12segment
        Send6961_Cmd2(0x89);//CMD 4 display control bright 14/16
        DelayMs(1);       
}

void TransData(void)
{
   DHTI1/= 6;
         DHTI2/= 6;
        a=DHTI1/10;
        b=DHTI1%10;       
        tg=DHTI2/10;
        th=DHTI2%10;
        DHTI1=0;
        DHTI2=0;
        }


void DHT_Start(void)
{

        GPIO_Init(DHT_Port,DHT_data,GPIO_MODE_OUT_PP_HIGH_FAST);
        GPIO_WriteLow(DHT_Port,DHT_data);
        DelayMs(18);//18.17ms
        GPIO_WriteHigh(DHT_Port,DHT_data);//10us
        Delayus(20);

}

u8 DHT_Read(void)
{
        u8 i, j,pulse,k;
        pulse=0;
        count81=0;       
                while(!GPIO_ReadInputPin(DHT_Port,DHT_data));
                while(GPIO_ReadInputPin(DHT_Port,DHT_data));
                for(i=0;i<5;i++)
                {
                        for (j=0;j<8;j++)
                        {
                                while(!GPIO_ReadInputPin(DHT_Port,DHT_data));
                                 while(GPIO_ReadInputPin(DHT_Port,DHT_data))
                                 {
                                  count81++;
                                 }
                                                pulse<<=1;
                                   if(count81>20)
                                                pulse +=1;
                                                else
                                                pulse +=0;                       
                                                count81=0;
                        }
                        DHT=pulse;
                        pulse=0;
                }
}

void tim4init(void)
{
        TIM4_TimeBaseInit(TIM4_PRESCALER_128,250);//16m/128/250=500=2ms
        TIM4_SetCounter(250);
        TIM4_ITConfig(TIM4_IT_UPDATE,ENABLE);//2Mhz/8/250
        TIM4_Cmd(ENABLE);
}

void tim4svc(void)
{
display_time++;
if(display_time==200)//10us
{       
        DHT_Start();//送出讀取的指令
        GPIO_Init(DHT_Port,DHT_data,GPIO_MODE_IN_PU_NO_IT);//此一 設定大大會影響 時間所以要獨立出來
        DHT_Read();         
        DelayMs(1);
        avg_count++;       
        DHTBuf1 += (u16)DHT[0];
        DHTBuf2 += (u16)DHT[2];
        display_time=0;
        if(avg_count>5)
        {
        DHTI1=DHTBuf1;
        DHTI2=DHTBuf2;
        display_flag=1;
        avg_count=0;
        DHTBuf1=0;
        DHTBuf2=0;
        }
}       
TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
}




main()
{
                GPIOinit();//顯示用
                PT6961_Init();       
                tim4init();
          rim();                 
       
                CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//以16m速度 進行
                GPIO_Init(DHT_Port,DHT_data,GPIO_MODE_OUT_PP_HIGH_FAST);
        while (1)
        {       
                if(display_flag==1)
                {
                        TransData();
                        DEMO_display1();
                        DEMO_display();
                        display_flag=0;
                }               
        }
       
}

/*
@far @interrupt void TIM1_OVF_IRQ(void)
{
        tim1svc();
}
*/
@far @interrupt void TIM4_OVF_IRQ(void)
{
        tim4svc();
}




#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(u8* file, u32 line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/



评分

参与人数 1一乐金币 +20 收起 理由
sdf15937 + 20 赞一个!建议还是上一个实物图比较好

查看全部评分

发表于 2015-4-18 17:33 | 显示全部楼层
没实物图片?
 楼主| 发表于 2015-4-18 21:23 | 显示全部楼层
本帖最后由 antlu 于 2015-4-18 21:25 编辑

11159526_647789135364787_6975847602090610492_n.jpg

就這個可以嗎?

11148432_646303628846671_9129464839256352686_n.jpg

還是這個!!

发表于 2015-4-18 22:11 | 显示全部楼层

实际看起来比图片亮?因为看图片好像不明显。
发表于 2015-4-18 22:24 | 显示全部楼层
好奇异的数码管啊,可不可以上个数码管的背面图,网上找不到,想整两只回来试一试
发表于 2015-4-18 23:42 | 显示全部楼层
紫色的LED及数码管前年去台湾见过,大陆好像还真没见过有卖的。。。
发表于 2015-4-19 06:35 | 显示全部楼层
奇怪数码管怎么几根线 就可以驱动
发表于 2015-4-19 10:50 | 显示全部楼层
DIY 发表于 2015-4-19 06:35
奇怪数码管怎么几根线 就可以驱动

这种数码管带驱动芯片的,三根串行信号线(STB、CLK、DIO)就可以了如TM1638。
 楼主| 发表于 2015-4-19 13:50 | 显示全部楼层
384065902 发表于 2015-4-18 22:24
好奇异的数码管啊,可不可以上个数码管的背面图,网上找不到,想整两只回来试一试

http://goods.ruten.com.tw/item/show?21447809044452#auc
我的賣場有賣  裡面內建 PT6961 IC 可以調整亮度!!
发表于 2015-4-19 17:32 | 显示全部楼层
台湾…………

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-10 13:27 , Processed in 0.072751 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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