久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

89c52單片機(jī)萬年歷程序

[復(fù)制鏈接]
ID:612134 發(fā)表于 2021-7-8 00:49 | 顯示全部樓層 |閱讀模式
/*******************************************************************************
注意事項(xiàng):
根據(jù)自己使用的LCD1602是否帶有轉(zhuǎn)接板,如果帶有轉(zhuǎn)接板的即為4位,需在LCD.H頭文件中
將宏#define LCD1602_4PINS打開,我們這里使用的LCD1602是8位,所以默認(rèn)將該宏注釋。

接線說明:(開發(fā)攻略每個(gè)實(shí)驗(yàn)章節(jié)內(nèi)的實(shí)驗(yàn)現(xiàn)象都有對應(yīng)的接線圖說明)
參考LCD1602液晶顯示實(shí)驗(yàn)接線圖
參考DS1302時(shí)鐘實(shí)驗(yàn)接線圖
K1-->P31
K2-->P30
K3-->P32
K4-->P33(該按鍵未做功能,大家可擴(kuò)展)

實(shí)驗(yàn)操作:
LCD1602顯示時(shí)鐘,按K3鍵進(jìn)入時(shí)鐘設(shè)置,此時(shí)秒鐘停止走動,按K1鍵選擇設(shè)置的秒、分、時(shí)、
日、月、星期、年,按K2鍵進(jìn)行加1,設(shè)置完成后,再次按下K3鍵繼續(xù)走時(shí)
*******************************************************************************/

#include <reg51.h>
#include "lcd.h"
#include "ds1302.h"

sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;         //管腳接線

void Int0Configuration();
void LcdDisplay();
unsigned char SetState,SetPlace;
void Delay10ms(void);   //誤差 0us
/*******************************************************************************
* 函數(shù)名         : main
* 函數(shù)功能                   : 主函數(shù)
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void main()
{
        unsigned char i;

        Int0Configuration();
        LcdInit();
        Ds1302Init();
        while(1)
        {        
                if(SetState==0)
                {
                        Ds1302ReadTime();
                }
                else
                {
                        if(K1==0)                //檢測按鍵K1是否按下
                        {
                                Delay10ms();        //消除抖動
                                if(K1==0)
                                {
                                        SetPlace++;
                                        if(SetPlace>=7)
                                                SetPlace=0;                                       
                                }

                                while((i<50)&&(K1==0))         //檢測按鍵是否松開
                                {
                                        Delay10ms();
                                        i++;
                                }
                                i=0;
                        }
                        if(K2==0)                //檢測按鍵K2是否按下
                        {
                                Delay10ms();        //消除抖動
                                if(K2==0)
                                {
                                        TIME[SetPlace]++;
                                        if((TIME[SetPlace]&0x0f)>9)                                         //換成BCD碼。
                                        {
                                                TIME[SetPlace]=TIME[SetPlace]+6;
                                        }
                                        if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //分秒只能到59
                                        {
                                                TIME[SetPlace]=0;
                                        }
                                        if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //小時(shí)只能到23
                                        {
                                                TIME[SetPlace]=0;
                                        }
                                        if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //日只能到31
                                        {
                                                TIME[SetPlace]=0;        
                                        }
                                        if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //月只能到12
                                        {
                                                TIME[SetPlace]=0;
                                        }        
                                        if((TIME[SetPlace]>=0x8)&&(SetPlace==5))                //周只能到7
                                        {
                                                TIME[SetPlace]=1;
                                        }               
//                                        if(SetPlace==5)                //月只能到12
//                                        {
//                                                TIME[SetPlace]=;
//                                        }        
                                }
                                
                                while((i<50)&&(K2==0))         //檢測按鍵是否松開
                                {
                                        Delay10ms();
                                        i++;
                                }
                                i=0;
                                
                        }                                                
                }
                LcdDisplay();        
        }
        
}
/*******************************************************************************
* 函數(shù)名         : LcdDisplay()
* 函數(shù)功能                   : 顯示函數(shù)
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void LcdDisplay()
{
        LcdWriteCom(0x80+0X40);
        LcdWriteData('0'+TIME[2]/16);                                //時(shí)
        LcdWriteData('0'+(TIME[2]&0x0f));                                 
        LcdWriteData('-');
        LcdWriteData('0'+TIME[1]/16);                                //分
        LcdWriteData('0'+(TIME[1]&0x0f));        
        LcdWriteData('-');
        LcdWriteData('0'+TIME[0]/16);                                //秒
        LcdWriteData('0'+(TIME[0]&0x0f));

        LcdWriteCom(0x80);
        LcdWriteData('2');
        LcdWriteData('0');
        LcdWriteData('0'+TIME[6]/16);                        //年
        LcdWriteData('0'+(TIME[6]&0x0f));
        LcdWriteData('-');
        LcdWriteData('0'+TIME[4]/16);                        //月
        LcdWriteData('0'+(TIME[4]&0x0f));
        LcdWriteData('-');
        LcdWriteData('0'+TIME[3]/16);                        //日
        LcdWriteData('0'+(TIME[3]&0x0f));
        LcdWriteCom(0x8D);
        LcdWriteData('0'+(TIME[5]&0x07));        //星期                        
}
/*******************************************************************************
* 函數(shù)名         : Int0Configuration()
* 函數(shù)功能                   : 配置外部中斷0
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void Int0Configuration()
{
        //設(shè)置INT0
        IT0=1;//跳變沿出發(fā)方式(下降沿)
        EX0=1;//打開INT0的中斷允許。
        EA=1;//打開總中斷        
}
/*******************************************************************************
* 函數(shù)名         : Int0()
* 函數(shù)功能                   : 外部中斷0 中斷函數(shù)
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void Int0() interrupt 0                 
{
        Delay10ms();
        if(K3==0)
        {
                SetState=~SetState;
                SetPlace=0;
                Ds1302Init();        
        }
}
/*******************************************************************************
* 函數(shù)名         : Delay10ms
* 函數(shù)功能                   : 延時(shí)函數(shù),延時(shí)10ms
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/
void Delay10ms(void)   //誤差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}


#include"ds1302.h"

//---DS1302寫入和讀取時(shí)分秒的地址命令---//
//---秒分時(shí)日月周年 最低位讀寫位;-------//
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

//---DS1302時(shí)鐘初始化2013年1月1日星期二12點(diǎn)00分00秒。---//
//---存儲順序是秒分時(shí)日月周年,存儲格式是用BCD碼---//
uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};

/*******************************************************************************
* 函 數(shù) 名         : Ds1302Write
* 函數(shù)功能                   : 向DS1302命令(地址+數(shù)據(jù))
* 輸    入         : addr,dat
* 輸    出         : 無
*******************************************************************************/

void Ds1302Write(uchar addr, uchar dat)
{
        uchar n;
        RST = 0;
        _nop_();

        SCLK = 0;//先將SCLK置低電平。
        _nop_();
        RST = 1; //然后將RST(CE)置高電平。
        _nop_();

        for (n=0; n<8; n++)//開始傳送八位地址命令
        {
                DSIO = addr & 0x01;//數(shù)據(jù)從低位開始傳送
                addr >>= 1;
                SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
                _nop_();
                SCLK = 0;
                _nop_();
        }
        for (n=0; n<8; n++)//寫入8位數(shù)據(jù)
        {
                DSIO = dat & 0x01;
                dat >>= 1;
                SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
                _nop_();
                SCLK = 0;
                _nop_();        
        }        
                 
        RST = 0;//傳送數(shù)據(jù)結(jié)束
        _nop_();
}

/*******************************************************************************
* 函 數(shù) 名         : Ds1302Read
* 函數(shù)功能                   : 讀取一個(gè)地址的數(shù)據(jù)
* 輸    入         : addr
* 輸    出         : dat
*******************************************************************************/

uchar Ds1302Read(uchar addr)
{
        uchar n,dat,dat1;
        RST = 0;
        _nop_();

        SCLK = 0;//先將SCLK置低電平。
        _nop_();
        RST = 1;//然后將RST(CE)置高電平。
        _nop_();

        for(n=0; n<8; n++)//開始傳送八位地址命令
        {
                DSIO = addr & 0x01;//數(shù)據(jù)從低位開始傳送
                addr >>= 1;
                SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
                _nop_();
                SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//讀取8位數(shù)據(jù)
        {
                dat1 = DSIO;//從最低位開始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
                _nop_();
        }

        RST = 0;
        _nop_();        //以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
        return dat;        
}

/*******************************************************************************
* 函 數(shù) 名         : Ds1302Init
* 函數(shù)功能                   : 初始化DS1302.
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/

void Ds1302Init()
{
        uchar n;
        Ds1302Write(0x8E,0X00);                 //禁止寫保護(hù),就是關(guān)閉寫保護(hù)功能
        for (n=0; n<7; n++)//寫入7個(gè)字節(jié)的時(shí)鐘信號:分秒時(shí)日月周年
        {
                Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);        
        }
        Ds1302Write(0x8E,0x80);                 //打開寫保護(hù)功能
}

/*******************************************************************************
* 函 數(shù) 名         : Ds1302ReadTime
* 函數(shù)功能                   : 讀取時(shí)鐘信息
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/

void Ds1302ReadTime()
{
        uchar n;
        for (n=0; n<7; n++)//讀取7個(gè)字節(jié)的時(shí)鐘信號:分秒時(shí)日月周年
        {
                TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
        }
               
}

#include"lcd.h"

/*******************************************************************************
* 函 數(shù) 名         : Lcd1602_Delay1ms
* 函數(shù)功能                   : 延時(shí)函數(shù),延時(shí)1ms
* 輸    入         : c
* 輸    出         : 無
* 說    名         : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時(shí)。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //誤差 0us
{
    uchar a,b;
        for (; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }
            
}

/*******************************************************************************
* 函 數(shù) 名         : LcdWriteCom
* 函數(shù)功能                   : 向LCD寫入一個(gè)字節(jié)的命令
* 輸    入         : com
* 輸    出         : 無
*******************************************************************************/
#ifndef         LCD1602_4PINS         //當(dāng)沒有定義這個(gè)LCD1602_4PINS時(shí)
void LcdWriteCom(uchar com)          //寫入命令
{
        LCD1602_E = 0;     //使能
        LCD1602_RS = 0;           //選擇發(fā)送命令
        LCD1602_RW = 0;           //選擇寫入
        
        LCD1602_DATAPINS = com;     //放入命令
        Lcd1602_Delay1ms(1);                //等待數(shù)據(jù)穩(wěn)定

        LCD1602_E = 1;                  //寫入時(shí)序
        Lcd1602_Delay1ms(5);          //保持時(shí)間
        LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com)          //寫入命令
{
        LCD1602_E = 0;         //使能清零
        LCD1602_RS = 0;         //選擇寫入命令
        LCD1602_RW = 0;         //選擇寫入

        LCD1602_DATAPINS = com;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;         //寫入時(shí)序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

//        Lcd1602_Delay1ms(1);
        LCD1602_DATAPINS = com << 4; //發(fā)送低四位
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;         //寫入時(shí)序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 數(shù) 名         : LcdWriteData
* 函數(shù)功能                   : 向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)
* 輸    入         : dat
* 輸    出         : 無
*******************************************************************************/                  
#ifndef         LCD1602_4PINS                  
void LcdWriteData(uchar dat)                        //寫入數(shù)據(jù)
{
        LCD1602_E = 0;        //使能清零
        LCD1602_RS = 1;        //選擇輸入數(shù)據(jù)
        LCD1602_RW = 0;        //選擇寫入

        LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;   //寫入時(shí)序
        Lcd1602_Delay1ms(5);   //保持時(shí)間
        LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)                        //寫入數(shù)據(jù)
{
        LCD1602_E = 0;          //使能清零
        LCD1602_RS = 1;          //選擇寫入數(shù)據(jù)
        LCD1602_RW = 0;          //選擇寫入

        LCD1602_DATAPINS = dat;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;          //寫入時(shí)序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

        LCD1602_DATAPINS = dat << 4; //寫入低四位
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;          //寫入時(shí)序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 數(shù) 名       : LcdInit()
* 函數(shù)功能                 : 初始化LCD屏
* 輸    入       : 無
* 輸    出       : 無
*******************************************************************************/                  
#ifndef                LCD1602_4PINS
void LcdInit()                                                  //LCD初始化子程序
{
         LcdWriteCom(0x38);  //開顯示
        LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
        LcdWriteCom(0x06);  //寫一個(gè)指針加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點(diǎn)
}
#else
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x32);         //將8位總線轉(zhuǎn)為4位總線
        LcdWriteCom(0x28);         //在四位線下的初始化
        LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
        LcdWriteCom(0x06);  //寫一個(gè)指針加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點(diǎn)
}
#endif


回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线一级片| 狠狠做深爱婷婷久久综合一区 | 在线播放亚洲 | 一区二区视频在线播放 | 亚洲黄色在线 | 日韩av手机在线观看 | 精品视频一区二区三区四区 | 日韩欧美影院 | 成人免费毛片男人用品 | 成人免费动漫 | 亚洲a在线观看 | 热久久免费视频 | av网站免费看 | 日本一级淫片色费放 | 成年人免费在线视频 | 欧美一区二 | 日韩中文字幕在线观看 | 999在线视频 | 欧美理伦 | 黄色小说视频 | 精品伊人 | 久久久久亚洲精品 | 操bbbbb | 日本美女一级片 | 亚洲黄色小视频 | 91精品在线播放 | 黄色片视频免费 | 国产成人在线视频 | 国产在线小视频 | 久久精品一区二区国产 | 成人av播放 | 在线黄网| 人人草人人| 日韩在线播放视频 | 国产免费高清 | 日韩综合久久 | 色一情一乱一乱一区91av | 国产精品国产精品国产专区不卡 | 中文字幕在线观看网址 | 欧美黄色一区 | 久久综合影院 |