找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8049|回復: 6
打印 上一主題 下一主題
收起左側

stc12c5a60s2+DH11+數碼管顯示程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:90461 發(fā)表于 2015-9-18 16:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/************************************************
項  目:溫、濕度測量程序
單片機:STC12C5A60S2
傳感器:DHT11
日  期:2015.04.09
************************************************/

#include <stc12c5a60s2.h>

#define uint unsigned int
#define uchar unsigned char

sbit io = P2^0;                        //定義數據端口

uchar data_byte;                //定義全局變量
uchar RH,RL,TH,TL;                //定義全局變量

unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};        // 顯示段碼值0~9
uchar  TempData[5];                         //存儲顯示值的全局變量
/*------------------------------------------------
uS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下 T=tx2+5 uS
------------------------------------------------*/

void delayus(unsigned char t)
{   
        while(--t);
}

/*------------------------------------------------
mS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/

void delayms(unsigned char t)
{     
        while(t--)
        {
                //大致延時1mS
                delayus(245);
                delayus(245);
        }
}
/******************** DHT11測試模塊**********************/
void start()                        //開始信號
{
        io=1;
        delayus(10);
        io=0;
        delayms(30);                //10~60之間
        io=1;
        delayus(100);                //關鍵時間:35-250之間
}

/**********************接收一個字節(jié)**********************/
uchar receive_byte()                       
{
        uchar i,temp,count;
        for(i=0;i<8;i++)
        {
                count=2;
                while((!io)&&count++)               
                temp=0;
                delayus(150);                                //關鍵時間:10~23之間
                if(io==1)temp=1;
                count=2;
                while((io)&&count++);
                if(count==1)break;
                data_byte<<=1;
                data_byte|=temp;
        }
        return data_byte;
}

/************************接收數據************************/

void receive()                                       
{
        uchar T_H,T_L,R_H,R_L,check,num_check;
        uchar count;

        start();                                        //開始信號               
        io=1;       
        if(!io)                                                //讀取DHT11響應信號
        {
                count=2;
                while((!io)&&count++);        //DHT11高電平80us是否結束
                count=2;
                while((io)&&count++);               
                R_H=receive_byte();
                R_L=receive_byte();
                T_H=receive_byte();
                T_L=receive_byte();       
                check=receive_byte();
               
                io=0;                                       
                   delayms(1);                                //拉低延時               
                io=1;               
                num_check=R_H+R_L+T_H+T_L;
                       
                if(num_check=check)
                {
                        RH=R_H;
                        RL=R_L;
                        TH=T_H;
                        TL=T_L;
                        check=num_check;               
                }               
        }
}

/**********************************************************************
                                                        顯示子函數
**********************************************************************/
void display()
{       
          P2=0xef;
        P0=TempData[0];               
        delayms(20);
        P2=0xff;
       
        P2=0xdf;
        P0=TempData[1];       
        delayms(20);
        P2=0xff;

        P2=0xbf;
        P0=TempData[2];
        delayms(20);
        P2=0xff;

        P2=0x7f;
        P0=TempData[3];       
        delayms(20);
        P2=0xff;
}

/*******************************************************************
                                               定時器初始化子函數
*******************************************************************/
void InitTimer(void)                       
{                                                                                                                                          
        TMOD |= 0x01;                          //定義定時器T0,工作方式1   

        TH0=(65536-20000)/256;
        TL0=(65536-20000)%256;                        //50ms

        ET0=1;
        TR0=1;
        EA = 1;                                //開總中斷
       
}

/***************************主函數**************************/
void main()
{
        P0M0=0xFF;                                                //定義P0口為推挽輸出 1111 1111
//        P2M0=0xF0;                                                //定義P2.4 ~ P2.7口為推挽輸出  1111 0000

        InitTimer();

        delayms(10);
       
        while(1)
        {       
               
                receive();               
               
                TempData[0]=DuanMa[RH/10];                               
                TempData[1]=DuanMa[RH%10];                                                               
               
                TempData[2]=DuanMa[TH/10];                       
                TempData[3]=DuanMa[TH%10];
               
                delayms(20);
                display();               
        }
}

/***********************************************************************
                                                定時器T1中斷子函數
***********************************************************************/
void timer0(void) interrupt 1  
{
        uchar ms;
                       
        TH0=(65536-20000)/256;
        TL0=(65536-20000)%256;
        ms++;                                                //ms++
        if(ms==50)                                         //如果等于10*500us=5ms
        {
                ms=0;                                        //ms清0                                                                                                                                               
        }
//        display();                                //調用顯示子函數               
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:90092 發(fā)表于 2015-9-18 17:01 | 只看該作者
能問下你有STC12C5A60S2芯片的封裝嗎?如果有stc庫最好了,謝謝。
回復

使用道具 舉報

板凳
ID:54731 發(fā)表于 2015-9-19 10:22 | 只看該作者
請問樓主:資料是你自己寫的嗎?還是哪里的?
回復

使用道具 舉報

地板
ID:90461 發(fā)表于 2015-9-20 19:03 | 只看該作者
芯片封裝可在protel99se或AD2004、AD6.9等電路軟件庫制作。
資料來源為參考廠家及網上的相關資料,自已改動后編寫的。
回復

使用道具 舉報

5#
ID:122016 發(fā)表于 2016-5-25 14:25 | 只看該作者
有hex文件么
回復

使用道具 舉報

6#
ID:239345 發(fā)表于 2017-10-14 12:00 | 只看該作者
我想請教一下我準備做晾衣架,問下在這里加個光敏來控制光度,然后還有按鍵來控制晾衣架自動的開關怎么弄
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表