在網(wǎng)上看了51單片機(jī)的教程,下面是程序,對(duì)照我的實(shí)驗(yàn)板,把段碼和位選都改正確了,sck,io,rst等位置也改了,但是數(shù)碼管一直顯示99-99-99,
求大神找原因,萬分感謝,我看了一天都沒找到問題
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sck=P3^6;
sbit io=P3^4;
sbit rst=P3^5;
sbit smgen=P1^0;
unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段選
unsigned char code smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位選
uchar time_data[7]={1,1,1,1,1,18,1}; //年周月日時(shí)分秒
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //寄存器地址 寫
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; //寄存器地址 讀
uchar disp[8];
/**********************函數(shù)聲明************************/
void write_ds1302_byte(uchar dat);
void write_ds1302(uchar add,uchar dat);
uchar read_ds1302(uchar add);
void set_rtc(void);
void read_rtc(void);
void time_pros(void);
void display(void);
//************************************************
//延時(shí)函數(shù),在12MHz的晶振頻率下
//大約50us的延時(shí)
//************************************************
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=110;j>0;j--);
}
/*****************DS1302底層驅(qū)動(dòng)函數(shù)**********************/
void write_ds1302_byte(uchar dat) //寫單個(gè)字節(jié)地址/數(shù)據(jù)
{
uchar i;
for(i=0;i<8;i++) //經(jīng)八次循環(huán)后數(shù)據(jù)/地址寫入
{
sck=0;
io=dat&0x01; //把要寫入數(shù)據(jù)/地址最低位賦給io,其他位置0
dat=dat>>1; //數(shù)據(jù)右移一位
sck=1; //將數(shù)據(jù)寫入
}
}
void write_ds1302(uchar add,uchar dat) //寫多個(gè)字節(jié)地址/數(shù)據(jù)
{
rst=0;
_nop_();
sck=0;_nop_();
rst=1;
_nop_();
write_ds1302_byte(add); //寫入地址
write_ds1302_byte(dat); //寫入數(shù)據(jù)
rst=0;
_nop_();
io=1;
sck=1;
}
uchar read_ds1302(uchar add) //讀多個(gè)字節(jié)數(shù)據(jù)
{
uchar i,value;
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add); //讀數(shù)據(jù)前要先寫入數(shù)據(jù)的地址
for(i=0;i<8;i++)
{
value=value>>1;
sck=0;
if(io)
value=value|0x80;
sck=1;
}
rst=0;
_nop_();
sck=0;
_nop_();
sck=1;
io=1;
return value;
}
/**************************底層驅(qū)動(dòng)函數(shù)**************************/
void set_rtc(void)
{
uchar i,j;
for(i=0;i<7;i++) //轉(zhuǎn)換成BCD碼
{
j=time_data[i]/10;
time_data[i]=time_data[i]%10;
time_data[i]=time_data[i]+j*16;
}
write_ds1302(0x8e,0x00); //去除寫保護(hù)
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_data[i]);
}
write_ds1302(0x8e,0x80); //加寫保護(hù)
}
void read_rtc(void)
{
uchar i;
for(i=0;i<7;i++)
{
time_data[i]=read_ds1302(read_add[i]);
}
}
void time_pros(void) //處理函數(shù),將BCD碼轉(zhuǎn)換成十進(jìn)制
{
disp[0]=time_data[6]%16;
disp[1]=time_data[6]/16;
disp[2]=10;
disp[3]=time_data[5]%16;
disp[4]=time_data[5]/16;
disp[5]=10;
disp[6]=time_data[4]%16;
disp[7]=time_data[4]/16;
}
void display(void) //掃描函數(shù)
{
uchar i;
for(i=0;i<8;i++)
{
P0=smg_du[disp[i]];
P2=smg_we[i];
delay_50us(7);
}
}
void main(void) //主函數(shù)
{
set_rtc(); //時(shí)間初始值
while(1)
{
smgen=0; //段碼鎖存端
read_rtc(); //讀入時(shí)間值
smgen=1;
time_pros(); //處理函數(shù),將BCD碼轉(zhuǎn)換成十進(jìn)制
display(); //掃描函數(shù)
}
}
|