電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 1885|回復(fù): 1
收起左側(cè)

單片機C語言實例-197-紅外解碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-2-18 10:00:19 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機C語言實例-197-紅外解碼

/********************************************************************
* 文件名  : 時鐘DS1302.c
* 描述    :  該文件實現(xiàn)用DS1302來實現(xiàn)日歷和時鐘功能,數(shù)碼管上顯示出來。
* 創(chuàng)建人  : 東流,2009年4月10日
* 版本號  : 2.0
***********************************************************************/
#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit P3_2 = P3^2;
sbit P3_5 = P3^4;

sbit T_CLK = P1^6; /*實時時鐘時鐘線引腳 */
sbit T_IO = P3^5; /*實時時鐘數(shù)據(jù)線引腳 */
sbit T_RST = P1^7; /*實時時鐘復(fù)位線引腳 */

/********************************************************************
* 名稱 : delay()
* 功能 : 延時,延時時間大概為140US。
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void delay()
{
        int i,j;
        for(i=0; i<=10; i++)
        for(j=0; j<=2; j++)
;
}

/********************************************************************
* 名稱 : Delay_1ms()
* 功能 : 延時子程序,延時時間為 1ms * x
* 輸入 : x (延時一毫秒的個數(shù))
* 輸出 : 無
***********************************************************************/
void Delay_1ms(uint i)//1ms延時
{
        uchar x,j;
        for(j=0;j<i;j++)
        for(x=0;x<=148;x++);        
}

/********************************************************************
* 名稱 :  v_RTInputByte()
* 功能 :  往DS1302寫入1Byte數(shù)據(jù)
* 輸入 :  ucDa 寫入的數(shù)據(jù)
* 輸出 :  無
***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
        uchar i;
        ACC = ucDa;
        T_RST = 1;
        for(i=8; i>0; i--)
        {
                T_IO = ACC0;
                T_CLK = 1;
                T_CLK = 0;
                ACC = ACC >> 1;
        }
}

/********************************************************************
* 名稱  :   uc_RTOutputByte()
* 功能  :   從DS1302讀取1Byte數(shù)據(jù)
* 輸入  :        無
* 返回值:   ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
        uchar i;
        T_RST = 1;
        for(i=8; i>0; i--)
        {
                ACC = ACC >>1;
                T_IO=1;
                ACC7 = T_IO;
                T_CLK = 1;
                T_CLK = 0;
        }
        return(ACC);
}

/********************************************************************
* 名稱   :   v_W1302(uchar ucAddr, uchar ucDa)
* 功能   :   往DS1302寫入數(shù)據(jù)
* 輸入   :   ucAddr: DS1302地址, ucDa: 要寫的數(shù)據(jù)
* 返回值 :   無
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
        T_RST = 0;
        T_CLK = 0;
        T_RST = 1;
        v_RTInputByte(ucAddr);   // 寫地址
        _nop_();
        _nop_();
        v_RTInputByte(ucDa);     // 寫1Byte數(shù)據(jù)
        T_CLK = 1;
        T_RST = 0;
}

/********************************************************************
* 名稱   :  uc_R1302(uchar ucAddr)
* 功能   :  讀取DS1302某地址的數(shù)據(jù)
* 輸入   :  ucAddr: DS1302地址
* 返回值 :  ucDa :讀取的數(shù)據(jù)
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
        uchar ucDa;
        T_RST = 0;
        T_CLK = 0;
        T_RST = 1;
        v_RTInputByte(ucAddr);    //寫地址,命令
        _nop_();
        _nop_();
        ucDa = uc_RTOutputByte(); //讀1Byte數(shù)據(jù)
        T_CLK = 1;
        T_RST = 0;
        return(ucDa);
}

/********************************************************************
* 名稱   :  v_BurstW1302T
* 功能   :  往DS1302寫入時鐘數(shù)據(jù)(多字節(jié)方式)
* 輸入   :  pSecDa: 時鐘數(shù)據(jù)地址 格式為: 秒 分 時 日 月 星期 年 控制
*                                                    8Byte (BCD碼) 1B 1B 1B 1B 1B 1B  1B  1B
* 返回值 :  無
***********************************************************************/
void v_BurstW1302T(uchar *pSecDa)
{
        uchar i;
        v_W1302(0x8e, 0x00);          //控制命令,WP=0,寫操作
        T_RST = 0;
        T_CLK = 0;
        T_RST = 1;
        v_RTInputByte(0xbe);          //0xbe:時鐘多字節(jié)寫命令
        for(i=8; i>0; i--)            //8Byte = 7Byte 時鐘數(shù)據(jù) + 1Byte 控制
        {
                v_RTInputByte(*pSecDa);   //寫1Byte數(shù)據(jù)
                pSecDa++;
        }
        T_CLK = 1;
        T_RST = 0;
}

/********************************************************************
* 名稱   :  v_BurstR1302T(uchar *pSecDa)
* 功能   :  讀取DS1302時鐘數(shù)據(jù)
* 輸入   :  pSecDa: 時鐘數(shù)據(jù)地址 格式為: 秒 分 時 日 月 星期 年
*                                                7Byte (BCD碼) 1B 1B 1B 1B 1B 1B   1B
* 返回值 :  ucDa :讀取的數(shù)據(jù)
***********************************************************************/
void v_BurstR1302T(uchar *pSecDa)
{
        uchar i;
        T_RST = 0;
        T_CLK = 0;
        T_RST = 1;
        v_RTInputByte(0xbf);               //0xbf:時鐘多字節(jié)讀命令
        for(i=8; i>0; i--)
        {
                *pSecDa = uc_RTOutputByte();   //讀1Byte數(shù)據(jù)
                pSecDa++;
        }
        T_CLK = 1;
        T_RST = 0;
}

/********************************************************************
* 名稱   :  v_BurstW1302R(uchar *pReDa)
* 功能   :  往DS1302寄存器數(shù)寫入數(shù)據(jù)(多字節(jié)方式)
* 輸入   :  pReDa: 寄存器數(shù)據(jù)地址
* 返回值 :  無
***********************************************************************/
void v_BurstW1302R(uchar *pReDa)
{
        uchar i;
        v_W1302(0x8e,0x00);         //控制命令,WP=0,寫操作
        T_RST = 0;
        T_CLK = 0;
        T_RST = 1;
        v_RTInputByte(0xfe);       //0xbe:時鐘多字節(jié)寫命令
        for(i=31; i>0; i--)        //31Byte 寄存器數(shù)據(jù)
        {
                v_RTInputByte(*pReDa); //寫1Byte數(shù)據(jù)
                pReDa++;
        }
        T_CLK = 1;
        T_RST = 0;
}

/********************************************************************
* 名稱   :  v_BurstR1302R(uchar *pReDa)
* 功能   :  讀取DS1302寄存器數(shù)據(jù)
* 輸入   :  pReDa: 寄存器數(shù)據(jù)地址
* 返回值 :  無
***********************************************************************/
void v_BurstR1302R(uchar *pReDa)
{
        uchar i;
        T_RST = 0;
        T_CLK = 0;
        T_RST = 1;
        v_RTInputByte(0xff);            //0xbf:時鐘多字節(jié)讀命令
        for(i=31; i>0; i--)             //31Byte 寄存器數(shù)據(jù)
        {
                *pReDa = uc_RTOutputByte(); //讀1Byte數(shù)據(jù)
                pReDa++;
        }
        T_CLK = 1;
        T_RST = 0;
}

/********************************************************************
* 名稱  :  v_Set1302(uchar *pSecDa)
* 功能  :  設(shè)置初始時間
* 輸入  :  pSecDa: 初始時間地址。初始時間格式為: 秒 分 時 日 月 星期 年
*                                                                    7Byte (BCD碼) 1B 1B 1B 1B 1B 1B  1B
* 返回值: 無
***********************************************************************/
void v_Set1302(uchar *pSecDa)
{
        uchar i;
        uchar ucAddr = 0x80;
        v_W1302(0x8e, 0x00);            //控制命令,WP=0,寫操作
        for(i=7; i>0; i--)
        {
                v_W1302(ucAddr, *pSecDa);   // 秒 分 時 日 月 星期 年
                pSecDa++;
                ucAddr += 2;
        }
        v_W1302(0x8e, 0x80);            //控制命令,WP=1,寫保護
}

/********************************************************************
* 名稱   : v_Get1302(uchar ucCurtime[])
* 功能   : 讀取DS1302當前時間
* 輸入   : ucCurtime: 保存當前時間地址。當前時間格式為: 秒 分 時 日 月 星期 年
*                                         7Byte (BCD碼) 1B 1B 1B 1B 1B  1B  1B
* 返回值 : 無
***********************************************************************/
void v_Get1302(uchar ucCurtime[])
{
        uchar i;
        uchar ucAddr = 0x81;
        for(i=0; i<7; i++)
        {
                ucCurtime = uc_R1302(ucAddr);    //格式為: 秒 分 時 日 月 星期 年
                ucAddr += 2;
        }
}

/********************************************************************
* 名稱 : dectobcd(uchar dec)
* 功能 : DEC碼轉(zhuǎn)換為BCD碼
* 輸入 : dec碼
* 輸出 : bcd碼
***********************************************************************/
uchar dectobcd(uchar dec)
{
        uchar bcd;
        bcd = 0;
        while(dec >= 10)
        {              
                dec -= 10;                        
                bcd++;
        }
        bcd <<= 4;
        bcd |= dec;
        return bcd;
}

/********************************************************************
* 名稱 : bcdtodec(uchar bcd)
* 功能 : BCD碼轉(zhuǎn)換為DEC碼
* 輸入 : bcd碼
* 輸出 : dec碼
***********************************************************************/
uchar bcdtodec(uchar bcd)
{
        uchar data1;
        data1 = bcd & 0x0f;     //取BCD低4位
        bcd = bcd & 0x70;       //剔除BCD的最高位和低4位。
        data1 += bcd >> 1;
        data1 += bcd >> 3;      //用位移代替乘法運算
        return data1;
}

/********************************************************************
* 名稱 : Write_DS1302Init()
* 功能 : 往DS1302中寫入數(shù)據(jù)。最開始顯示的數(shù)據(jù)就是在這里設(shè)置的。
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Write_DS1302Init(void)
{
        v_W1302(0x8e,0);
        v_W1302(0x80,0x50);        //寫入秒
        v_W1302(0x8e,0);
        v_W1302(0x82,0x59);        //寫入分
        v_W1302(0x8e,0);
        v_W1302(0x84,0x07);        //寫入小時
        v_W1302(0x8e,0);
        v_W1302(0x86,0x08);        //寫入日
        v_W1302(0x8e,0);
        v_W1302(0x88,0x08);        //寫入月
        v_W1302(0x8e,0);
        v_W1302(0x8a,0x05);        //寫入星期
        v_W1302(0x8e,0);
        v_W1302(0x8c,0x08);        //寫入年        
}

/********************************************************************
* 名稱 : Run_DS1302(void)
* 功能 : 讀出DS1302中的數(shù)據(jù),并在液晶1602上進行顯示
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Run_DS1302(void)
{
        uchar sec, min, hour, day, month, year;
        while(1)
        {
                v_W1302(0x8f, 0);
                sec = bcdtodec(uc_R1302(0x81));           //讀出DS1302中的秒
                v_W1302(0x8f, 0);
                min = bcdtodec(uc_R1302(0x83));           //讀出DS1302中的分
                v_W1302(0x8f, 0);
                hour = bcdtodec(uc_R1302(0x85));   //讀出DS1302中的小時
                v_W1302(0x8f, 0);
                day = bcdtodec(uc_R1302(0x87));           //讀出DS1302中的日
                v_W1302(0x8f, 0);
                month = bcdtodec(uc_R1302(0x89));  //讀出DS1302中的月
                v_W1302(0x8f, 0);
                year = bcdtodec(uc_R1302(0x8d));   //讀出DS1302中的年

                P0 = table[hour / 10 % 10];
                P2 = 0;
                Delay_1ms(2);
                P0 = table[hour % 10];
                P2 = 1;
                Delay_1ms(2);
                P0 = 0x80;
                P2 = 2;
                Delay_1ms(2);
                P0 = table[min / 10 % 10];
                P2 = 3;
                Delay_1ms(2);
                P0 = table[min % 10];
                P2 = 4;
                Delay_1ms(2);
                P0 = 0x80;
                P2 = 5;
                Delay_1ms(2);
                P0 = table[sec / 10 % 10];
                P2 = 6;
                Delay_1ms(2);
                P0 = table[sec % 10];
                P2 = 7;
                Delay_1ms(2);
        }
}

/********************************************************************
* 名稱 : Main(void)
* 功能 : 主函數(shù)
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Main(void)
{
        Write_DS1302Init();
        Run_DS1302();
}


更多詳情參考附件文檔


游客,如果您要查看本帖隱藏內(nèi)容請回復(fù)

回復(fù)

使用道具 舉報

0

主題

3

帖子

13

積分

一級會員

Rank: 1

積分
13
沙發(fā)
發(fā)表于 2022-2-21 09:36:53 | 只看該作者
挺好的,感覺挺有用的
回復(fù) 支持 反對

使用道具 舉報

發(fā)表回復(fù)

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

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表