我有个DS1302的显示时间的程序,可是在数码管上不显示东西,不知道哪里有错误,希望朋友们能帮忙看一下。
我有个DS1302的显示时间的程序,可是在数码管上不显示东西,不知道哪里有错误,希望朋友们能帮忙看一下。程序如下:#include<reg51.h>#include<in...
我有个DS1302的显示时间的程序,可是在数码管上不显示东西,不知道哪里有错误,希望朋友们能帮忙看一下。 程序如下:
#include<reg51.h>
#include<intrins.h>
#define write_miao 0x80
#define write_fen 0x82
#define write_shi 0x84
#define write_wp 0x8E
#define uchar unsigned char
#define uint unsigned int
//uchar code set_rtc_code[7]={0x00,0x30,0x18,0x04,0x16,0x06,0x05};
uchar code write_rtc_address[3]={0x80,0x82,0x84}; //秒分时
uchar code read_rtc_address[3]={0x81,0x83,0x85};
uchar code table[]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar read_rtc_code[3];
sbit ACC_7=ACC^7;
sbit ACC_0=ACC^0;
sbit scl=P2^1;
sbit sda=P2^3;
sbit rst=P2^4;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x++)
for(y=110;y>0;y++);
}
void write_1302(uchar add,uchar dat)
{
uchar temp,i;
rst=0;
scl=0;
rst=1;
for(i=8;i>0;i--)
{
scl=0;
temp=add;
sda=(bit)(temp&0x01);
add>>=1;
scl=1;
}
for(i=8;i>0;i--)
{
scl=0;
temp=dat;
sda=(bit)(temp&0x01);
dat>>=1;
scl=1;
}
rst=0;
}
uchar read_1302(uchar add)
{
uchar temp,i,dat1,dat2;
rst=0;
scl=0;
rst=1;
//add>>=1;
for(i=8;i>0;i--)
{
scl=0;
temp=add;
sda=(bit)(temp&0x01);
add>>=1;
scl=1;
}
for(i=8;i>0;i--)
{
ACC_7=sda;
scl=1;
ACC>>=1;
scl=0;
}
rst=0;
dat1=ACC;
dat2=dat1/16;
dat1=dat1%16;
dat1=dat1+dat2*10;
return (dat1);
}
void init()
{
write_1302(write_wp,0x00);
write_1302(write_miao,0x56);
write_1302(write_fen,0x34);
write_1302(write_shi,0x12);
write_1302(write_wp,0x80);
}
void display(uchar a,uchar b,uchar c)
{
P1=0xef;
P0=table[a%10];
delay(1);
P1=0xdf;
P0=table[a/10];
delay(1);
P1=0xfb;
P0=table[b%10];
delay(1);
P1=0xf7;
P0=table[b/10];
delay(1);
P1=0xfe;
P0=table[c%10];
delay(1);
P1=0xfd;
P0=table[c/10];
delay(1);
}
void read_rtc(void)
{
uchar i,*p;
p=read_rtc_address;
for(i=0;i<4;i++)
{
read_rtc_code[i]=read_1302(*p);
p++;
}
}
void main()
{
init();
while(1)
{
read_rtc();
display(read_rtc_code[0],read_rtc_code[1],read_rtc_code[2]);
delay(100);
}
}
我只想显示时分秒,不知道为什么数码管不显示。希望朋友们能帮忙看下,不胜感激!!! 展开
#include<reg51.h>
#include<intrins.h>
#define write_miao 0x80
#define write_fen 0x82
#define write_shi 0x84
#define write_wp 0x8E
#define uchar unsigned char
#define uint unsigned int
//uchar code set_rtc_code[7]={0x00,0x30,0x18,0x04,0x16,0x06,0x05};
uchar code write_rtc_address[3]={0x80,0x82,0x84}; //秒分时
uchar code read_rtc_address[3]={0x81,0x83,0x85};
uchar code table[]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar read_rtc_code[3];
sbit ACC_7=ACC^7;
sbit ACC_0=ACC^0;
sbit scl=P2^1;
sbit sda=P2^3;
sbit rst=P2^4;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x++)
for(y=110;y>0;y++);
}
void write_1302(uchar add,uchar dat)
{
uchar temp,i;
rst=0;
scl=0;
rst=1;
for(i=8;i>0;i--)
{
scl=0;
temp=add;
sda=(bit)(temp&0x01);
add>>=1;
scl=1;
}
for(i=8;i>0;i--)
{
scl=0;
temp=dat;
sda=(bit)(temp&0x01);
dat>>=1;
scl=1;
}
rst=0;
}
uchar read_1302(uchar add)
{
uchar temp,i,dat1,dat2;
rst=0;
scl=0;
rst=1;
//add>>=1;
for(i=8;i>0;i--)
{
scl=0;
temp=add;
sda=(bit)(temp&0x01);
add>>=1;
scl=1;
}
for(i=8;i>0;i--)
{
ACC_7=sda;
scl=1;
ACC>>=1;
scl=0;
}
rst=0;
dat1=ACC;
dat2=dat1/16;
dat1=dat1%16;
dat1=dat1+dat2*10;
return (dat1);
}
void init()
{
write_1302(write_wp,0x00);
write_1302(write_miao,0x56);
write_1302(write_fen,0x34);
write_1302(write_shi,0x12);
write_1302(write_wp,0x80);
}
void display(uchar a,uchar b,uchar c)
{
P1=0xef;
P0=table[a%10];
delay(1);
P1=0xdf;
P0=table[a/10];
delay(1);
P1=0xfb;
P0=table[b%10];
delay(1);
P1=0xf7;
P0=table[b/10];
delay(1);
P1=0xfe;
P0=table[c%10];
delay(1);
P1=0xfd;
P0=table[c/10];
delay(1);
}
void read_rtc(void)
{
uchar i,*p;
p=read_rtc_address;
for(i=0;i<4;i++)
{
read_rtc_code[i]=read_1302(*p);
p++;
}
}
void main()
{
init();
while(1)
{
read_rtc();
display(read_rtc_code[0],read_rtc_code[1],read_rtc_code[2]);
delay(100);
}
}
我只想显示时分秒,不知道为什么数码管不显示。希望朋友们能帮忙看下,不胜感激!!! 展开
2个回答
展开全部
要分清数码管是共阴管还是共阳管。
追问
我的是共阳极
追答
void write_1302(uchar add,uchar dat)
{
uchar temp,i;
rst=0; //置低
scl=0; //时钟线清零
rst=1; //允许对DS1302操作
for(i=8;i>0;i--) //发送8位地址
{
scl=0;
temp=add;
sda=(bit)(temp&0x01); //每次传输低位
add>>=1;
scl=0; //这儿加句
scl=1; //上升沿
}
for(i=8;i>0;i--) // 发送8位数据
{
scl=0;
temp=dat;
sda=(bit)(temp&0x01);
dat>>=1;
scl=1;
}
rst=0; //完成此次传送
}
uchar read_1302(uchar add)
{
uchar temp,i,dat1,dat2;
rst=0; //置低
scl=0; //时钟线清零
rst=1; //允许对DS1302操作
//add>>=1;
for(i=8;i>0;i--) //发送8位地址
{
scl=0;
temp=add;
sda=(bit)(temp&0x01);//每次传输低位
add>>=1;
scl=1; //上升沿
}
//这儿的读法有些问题吧!参考AVR的
/*
DDRB.1=0; //将PORB.1口设置为输入
for(i=0;i>=1;
CLK=0; //下降沿读入
*/
for(i=8;i>0;i--) // 读取8位数据
{
ACC_7=sda;
scl=1;
ACC>>=1;
scl=0; //下降沿读入
}
rst=0; //完成此次传送
dat1=ACC;
//return dat1/16*10+dat1%16;
dat2=dat1/16;
dat1=dat1%16;
dat1=dat1+dat2*10;
return (dat1);
}
void init()
{
write_1302(write_wp,0x00); //禁止写保护
write_1302(write_miao,0x56); //秒初始化,设定时间
write_1302(write_fen,0x34); //分初始化
write_1302(write_shi,0x12); //小时初始化
write_1302(write_wp,0x80); //允许写保护
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询