DS1302時鐘芯片顯示時間C51程序
/*
程序效果:通過DS1302芯片顯示時間,本程序主要是要理解
DS1302芯片的協(xié)議,這樣便于編寫程序。
當(dāng)然時間顯示也可以用單片機(jī)的定時器來控制,比起延時
子函數(shù)來說較精準(zhǔn)。
*/
#includereg52.h> //頭文件
#includeintrins.h>
#define uchar unsigned char //宏定義
sbit scl2=P1^3; //位聲明
sbit sda2=P1^4;
sbit rst2=P1^5;
uchar tmpdata[8]={0x00,0x3b, //顯示的時間值
0x17,0x1f,0x0c,0x08,0x09,0x00};
uchar tmpdisplay[8];
code uchar write_rtc_address[7]={ //寫入時間的地址
0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
code uchar read_rtc_address[7]={ //讀取時間的地址
0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
code unsigned char table[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f, //共陰數(shù)碼管 0-9
0x40,0x00}; // '-' '熄滅‘表
void delay();
void display(uchar *lp,uchar lc); //顯示子函數(shù)
void write_ds1302(uchar address,uchar dat); //寫子函數(shù)
uchar read_ds1302(uchar address);//讀子函數(shù)
void read_rtc();
void set_rtc();
void main()
{
rst2=0;
set_rtc();
while(1)
{
read_rtc();
switch(tmpdata[0]/5) // 設(shè)計(jì)每隔5秒交替顯示年月日 時分秒
{
case 0: //顯示時分秒
case 2:
case 4:
case 6:
case 8:
case 10:
tmpdisplay[0]=tmpdata[2]/16;
tmpdisplay[1]=tmpdata[2]0x0f;
tmpdisplay[2]=10; //在時與分之間加一個“-”
tmpdisplay[3]=tmpdata[1]/16;
tmpdisplay[4]=tmpdata[1]0x0f;
tmpdisplay[5]=10;
tmpdisplay[6]=tmpdata[0]/16;
tmpdisplay[7]=tmpdata[0]0x0f;
break;
case 1: //顯示年月日
case 3:
case 5:
case 7:
case 9:
case 11:
tmpdisplay[0]=tmpdata[6]/16;
tmpdisplay[1]=tmpdata[6]0x0f;
tmpdisplay[2]=10;
tmpdisplay[3]=tmpdata[4]/16;
tmpdisplay[4]=tmpdata[4]0x0f;
tmpdisplay[5]=10;
tmpdisplay[6]=tmpdata[3]/16;
tmpdisplay[7]=tmpdata[3]0x0f;
break;
default :
break;
}
display(tmpdisplay,8);
}
}
void display(uchar *lp,uchar lc) //lp為數(shù)組的首地址,lc為顯示的個數(shù)
{
uchar i; //定義局部變量
P2=0; //清零端口,準(zhǔn)備顯示
P1=P10xf8; //不影響P1口的高5位,低三位用于控制哪個數(shù)碼管亮
for(i=0;ilc;i++) //循環(huán)顯示
{
P2=table[lp[i]];//查表獲得相應(yīng)的數(shù)值
delay(); //延時,使數(shù)碼管更加亮
P2=0; //清零端口,準(zhǔn)備顯示下一位
P1++; //點(diǎn)亮下一個數(shù)碼管
}
}
void delay() //延時子函數(shù)
{
uchar i; //i的值的大小可以決定數(shù)碼管的亮暗的程度
for(i=20;i>0;i--); //但i的值要適中,并不是越大越好
}
void write_ds1302_byte(uchar temp) //寫子函數(shù)
{
uchar i;
for(i=0;i8;i++) //循環(huán)8次,寫入數(shù)據(jù)
{
scl2=0;
sda2=temp0x01; //每次傳輸?shù)妥止?jié)
temp>>=1; //右移一位
scl2=1;
}
}
void write_ds1302(uchar address,uchar dat) //根據(jù)ds1302協(xié)議編寫的程序
{
rst2=0;
_nop_();
scl2=0;
_nop_();
rst2=1;
_nop_(); //從此后開始發(fā)送數(shù)據(jù)
write_ds1302_byte(address);//發(fā)送地址
write_ds1302_byte(dat); //發(fā)送數(shù)據(jù)
rst2=0; //停止發(fā)送數(shù)據(jù)
}
uchar read_ds1302(uchar address) //根據(jù)ds1302編寫的程序
{
uchar i,temp=0;
rst2=0;
_nop_();
scl2=0;
_nop_();
rst2=1;
_nop_();
write_ds1302_byte(address);
for(i=0;i8;i++) //循環(huán)8次,讀取數(shù)據(jù)
{
scl2=1;
_nop_();
if(sda2)
temp|=0x80;//每次傳輸?shù)妥止?jié)
scl2=0;
temp>>=1; // 右移一位
}
rst2=0;
_nop_();
scl2=1;
sda2=0;
return temp; //返回 temp值
}
void read_rtc() //讀取日歷
{
uchar i,*p;
p=read_rtc_address; //傳遞地址
for(i=0;i7;i++) //分七次讀取年月日 時分秒 星期
{
tmpdata[i]=read_ds1302(*p);
p++;
}
}
void set_rtc() //設(shè)定日歷
{
uchar i,*p,tmp;
for(i=0;i7;i++)
{
tmp=tmpdata[i]/10;
tmpdata[i]=tmpdata[i]%10;
tmpdata[i]=tmpdata[i]+tmp*16;
}
write_ds1302(0x8e,0x00);
p=write_rtc_address; //傳遞地址
for(i=0;i7;i++) //分七次寫入年月日 時分秒星期
{
write_ds1302(*p,tmpdata[i]);
p++;
}
write_ds1302(0x8e,0x80);
}
萬能遙控器相關(guān)文章:萬能遙控器代碼
評論