新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機·實時時鐘DS1302

        單片機·實時時鐘DS1302

        作者: 時間:2016-11-24 來源:網絡 收藏

        實驗二:將實驗一的時鐘程序,在LCD1602上顯示
        程序:
        main.h
        # ifndef _MAIN_H_
        # define _MAIN_H_
        # include
        # include
        sbit SCK = P3^5 ;
        sbit SDA = P3^4 ;
        sbit RST = P1^7 ;
        sbit RS = P1^0 ;
        sbit RW = P1^1 ;
        sbit EN = P1^5 ;
        sbit BUSY = P0^7 ;
        typedef unsigned char uint8 ;
        typedef unsigned int uint16 ;
        uint8 time[7]={50,59,23,15,8,7,10} ;
        # define ds1302_w_addr 0x80
        # define ds1302_r_addr 0x81
        # endif
        main.c
        # include "main.h"
        void write_ds1302_byte(uint8 dat)
        {
        uint8 i ;
        for(i=0; i<8; i++)
        {
        SDA = dat&0x01 ;
        dat>>=1 ;
        SCK = 1 ;
        SCK = 0 ;
        }
        }
        uint8 read_ds1302_byte(void)
        {
        uint8 i, dat = 0 ;
        for(i=0; i<8; i++)
        {
        dat>>=1 ;
        if(SDA)
        dat |= 0x80 ;
        SCK = 1 ;
        SCK = 0 ;
        }
        return dat ;
        }
        void reset_ds1302(void)
        {
        RST = 0 ;
        SDA = 0 ;
        RST = 1 ;
        }
        void clear_ds1302_wp(void)
        {
        reset_ds1302() ;
        RST = 1 ;
        write_ds1302_byte(0x8E) ;
        write_ds1302_byte(0) ;
        SDA = 0 ;
        RST = 0 ;
        }
        void set_ds1302_wp(void)
        {
        reset_ds1302() ;
        RST = 1 ;
        write_ds1302_byte(0x8E) ;
        write_ds1302_byte(0x80) ;
        SDA = 0 ;
        RST = 0 ;
        }
        void write_ds1302(uint8 addr,uint8 dat)
        {
        reset_ds1302() ;
        RST = 1 ;
        write_ds1302_byte(addr) ;
        write_ds1302_byte(dat) ;
        SDA = 0 ;
        RST = 0 ;
        }
        uint8 read_ds1302(uint8 addr)
        {
        uint8 temp = 0 ;
        reset_ds1302() ;
        RST = 1 ;
        write_ds1302_byte(addr) ;
        temp =read_ds1302_byte() ;
        SDA = 0 ;
        RST = 0 ;
        return temp ;
        }
        void set_time(uint8 *timedata)
        {
        uint8 i, tmp ;
        for(i=0; i<7; i++)
        {
        tmp = timedata[i]/10 ;
        timedata[i] = timedata[i] ;
        timedata[i] = tmp*16 + timedata[i] ;
        }
        tmp = ds1302_w_addr ;
        clear_ds1302_wp() ;
        for(i=0; i<7; i++)
        {
        write_ds1302(tmp,timedata[i]) ;
        tmp+=2 ;
        }
        set_ds1302_wp() ;
        }
        void read_time(uint8 *timedata)
        {
        uint8 temp, i ;
        temp = ds1302_r_addr ;
        for(i=0; i<7; i++)
        {
        timedata[i] = read_ds1302(temp) ;
        temp+= 2 ;
        }
        }
        void wait(void)
        {
        P0 = 0xFF ;
        while(BUSY)
        {
        RS = 0 ;
        RW = 1 ;
        EN = 0 ;
        EN = 1 ;
        }
        EN = 0 ;
        }
        void w_dat(uint8 dat)
        {
        wait() ;
        EN = 0 ;
        P0 = dat ;
        RS = 1 ;
        RW = 0 ;
        EN = 1 ;
        EN = 0 ;
        }
        void w_cmd(uint8 cmd)
        {
        wait() ;
        EN = 0 ;
        P0 = cmd ;
        RS = 0 ;
        RW = 0 ;
        EN = 1 ;
        EN = 0 ;
        }
        void w_hexnum(uint8 dat)
        {
        w_dat(dat/16 + 0) ; //這里注意/16,輸出為8421BCD碼,需要轉換
        w_dat(dat + 0) ;
        }
        void Init_LCD1602(void)
        {
        w_cmd(0x38) ;
        w_cmd(0x0c) ;
        w_cmd(0x06) ;
        w_cmd(0x01) ;
        }
        void main(void)
        {
        Init_LCD1602() ;
        set_time(&time) ;
        while(1)
        {
        read_time(&time) ; //指針的概念
        w_cmd(0x80) ;
        w_hexnum(time[6]) ;
        w_dat(-) ;
        w_hexnum(time[4]) ;
        w_dat(-) ;
        w_hexnum(time[3]) ;
        w_cmd(0xC0) ;
        w_hexnum(time[2]) ;
        w_dat(:) ;
        w_hexnum(time[1]) ;
        w_dat(:) ;
        w_hexnum(time[0]) ;
        }
        }

        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 肃南| 合江县| 永昌县| 自贡市| 汶上县| 松桃| 宿州市| 色达县| 安康市| 商洛市| 石楼县| 保德县| 白山市| 鹤岗市| 香河县| 马公市| 札达县| 梓潼县| 临海市| 公主岭市| 陈巴尔虎旗| 织金县| 分宜县| 定襄县| 海南省| 苏尼特右旗| 涞水县| 彭山县| 铁岭县| 荔浦县| 和田县| 青州市| 盈江县| 博野县| 闸北区| 聊城市| 获嘉县| 达州市| 澄江县| 安顺市| 石渠县|