新聞中心

PIC16F877A例程---DS1302程序

作者: 時(shí)間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
#include //調(diào)用頭文件

//#include

本文引用地址:http://m.butianyuan.cn/article/201611/321021.htm

__CONFIG(0x3F32); //芯片配置字

//__CONFIG(HS&UNPROTECT&PWRTEN&BORDIS&WDTDIS);//芯片配置字

//__CONFIG(0x3FFD&0x3FFF&0x3FF7&0x3FBF&0x3FFB);//芯片配置字

#define uchar unsigned char

#define uint unsigned int

//聯(lián)接DS1302的端口定義

#define ds1302_rst RC2 //定義1302的RST接在PC4

#define ds1302_io RC1 //定義1302的IO接在PC3

#define ds1302_sclk RC0 //定義1302的時(shí)鐘接在PC2

#define set_ds1302_rst_ddr() TRISC2=0 //復(fù)位端置為輸出

#define set_ds1302_rst() ds1302_rst=1 //復(fù)位端置1

#define clr_ds1302_rst() ds1302_rst=0 //復(fù)位端清0

#define set_ds1302_io_ddr() TRISC1=0 //數(shù)據(jù)端置為輸出

#define set_ds1302_io() ds1302_io=1 //數(shù)據(jù)端置1

#define clr_ds1302_io() ds1302_io=0 //數(shù)據(jù)端清0

#define clr_ds1302_io_ddr() TRISC1=1 //數(shù)據(jù)端置為輸入

#define in_ds1302_io() PORTC&0X02 //數(shù)據(jù)端輸入數(shù)據(jù)

#define set_ds1302_sclk_ddr() TRISC0=0 //時(shí)鐘端置為輸出

#define set_ds1302_sclk() ds1302_sclk=1 //時(shí)鐘端置1

#define clr_ds1302_sclk() ds1302_sclk=0 //時(shí)鐘端清0

#define ds1302_sec_add 0x80 //秒數(shù)據(jù)地址

#define ds1302_min_add 0x82 //分?jǐn)?shù)據(jù)地址

#define ds1302_hr_add 0x84 //時(shí)數(shù)據(jù)地址

#define ds1302_date_add 0x86 //日數(shù)據(jù)地址

#define ds1302_month_add 0x88 //月數(shù)據(jù)地址

#define ds1302_day_add 0x8a //星期數(shù)據(jù)地址

#define ds1302_year_add 0x8c //年數(shù)據(jù)地址

#define ds1302_control_add 0x8e //控制數(shù)據(jù)地址

#define ds1302_charger_add 0x90

#define ds1302_clkburst_add 0xbe

uchar timer[8]; //時(shí)鐘數(shù)據(jù)

//共陰數(shù)碼管0-F顯示代碼

uchar Table[]={0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90,0xff};

//轉(zhuǎn)換后的顯示數(shù)據(jù)

uchar s[4];

//定義掃描計(jì)數(shù)器

uchar sel=0;

uchar temp_pa=0xFF;

//寫入1302數(shù)據(jù)函數(shù):

//入口:add為寫入地址碼,data為寫入數(shù)據(jù)

//返回:無

void ds1302_write(uchar add,uchar data)

{

uchar i=0;

set_ds1302_io_ddr(); //配置IO為輸出

NOP();NOP();

clr_ds1302_rst(); //清復(fù)位,停止所有操作

NOP();NOP();

clr_ds1302_sclk(); //清時(shí)鐘,準(zhǔn)備操作

NOP();NOP();

set_ds1302_rst(); //置復(fù)位,開始操作

NOP();NOP();

for(i=8;i>0;i--) //此循環(huán)寫入控制碼

{

if(add&0x01)

set_ds1302_io(); //當(dāng)前位為1,置數(shù)據(jù)位

else

clr_ds1302_io(); //當(dāng)前位為0,清數(shù)據(jù)位

NOP();NOP();

set_ds1302_sclk(); //產(chǎn)生時(shí)鐘脈沖,寫入數(shù)據(jù)

NOP();NOP();

clr_ds1302_sclk();

NOP();NOP();

add>>=1; //移位,準(zhǔn)備寫入下1位

}

for(i=8;i>0;i--) //此循環(huán)寫入數(shù)據(jù)碼

{

if(data&0x01)

set_ds1302_io();

else

clr_ds1302_io();

NOP();NOP();

set_ds1302_sclk();

NOP();NOP();

clr_ds1302_sclk();

NOP();NOP();

data>>=1;

}

clr_ds1302_rst();

NOP();NOP();

clr_ds1302_io_ddr(); //清輸出狀態(tài)

NOP();NOP();

}

//從1302中讀出數(shù)據(jù):

//入口:add為讀數(shù)據(jù)所在地址

//返回:讀出的數(shù)據(jù)data

uchar ds1302_read(uchar add)

{

uchar data=0;

uchar i=0;

add+=1; //讀標(biāo)志

set_ds1302_io_ddr(); //端口輸出

NOP();NOP();

clr_ds1302_rst(); //清復(fù)位

NOP();NOP();

clr_ds1302_sclk(); //清時(shí)鐘

NOP();NOP();

set_ds1302_rst(); //置復(fù)位

NOP();NOP();

for(i=8;i>0;i--) //此循環(huán)寫入地址碼

{

if(add&0x01)

{set_ds1302_io();}

else

{clr_ds1302_io();}

NOP();NOP();

set_ds1302_sclk();

NOP();NOP();

clr_ds1302_sclk();

NOP();NOP();

add>>=1;

}

clr_ds1302_io_ddr(); //端口輸入

NOP();NOP();

for(i=8;i>0;i--) //此循環(huán)讀出1302的數(shù)據(jù)

{

data>>=1;

if(in_ds1302_io())

{data|=0x80;}

NOP();NOP();

set_ds1302_sclk();

NOP();NOP();

clr_ds1302_sclk();

NOP();NOP();

}

clr_ds1302_rst();

NOP();NOP();

return(data);

}


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: PIC16F877ADS130

評(píng)論


技術(shù)專區(qū)

關(guān)閉