89C51+DS1302+4位共阳数码管 的电子时钟 P0口控制段选,P2口控制位选,(加了三极管放大)

2024-12-04 13:43:36
推荐回答(3个)
回答1:

最好加上。不知你的单片机是老的还是新的,现在的新版本单片机一般不用加上拉电阻(有的例外)。老的8051单片机P0都是开漏输出,它的输出状态是不定的,必须加上拉,这样你的输出状态才能确定!
还有一点小经验,你的三极管最好选用9012,因为单片机的灌电流比拉电流强得多,而9012是低电平选通,此时电流是灌入单片机的!

参考程序:
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define READ_SECOND 0x81
#define READ_MINUTE 0x83
#define READ_HOUR 0x85
#define WRITE_PROTECT 0x8E
#define WRITE_DAY 0x86
#define WRITE_MONTH 0x88
#define WRITE_YEAR 0x8c
#define WRITE_WEEK 0X8a
#define READ_DAY 0x87
#define READ_MONTH 0x89
#define READ_YEAR 0x8d
#define READ_WEEK 0x8b

bit uart_flag3=0; // 此标志位,串口中用到
sbit ACC_7 = ACC^7;
sbit ACC_0 = ACC^0;
sbit SCK = P1^2;
sbit IO= P1^4;
sbit RST = P1^3;

//地址、数据发送子程序
void Write1302 ( unsigned char addr,unsigned char dat )
{
unsigned char i;
RST=0;
SCK=0;
RST=1;
ACC=addr;
//发送地址
for ( i=8; i>0; i-- )
{

IO=ACC_0;
SCK = 1;
SCK = 0;
ACC>>= 1;
}

ACC=dat ;
//发送数据
for ( i=8; i>0; i-- )
{

IO=ACC_0;
ACC>>= 1;
SCK = 1;
SCK = 0;
}
SCK = 1;
RST = 0;
}

//数据读取子程序
unsigned char Read1302 ( unsigned char addr )
{
unsigned char i,dat1;
RST=0;
SCK=0;
RST = 1;
ACC=addr ;
//发送地址
for ( i=8; i>0; i-- )
{

IO=ACC_0 ;
ACC>>= 1;
SCK = 1;
SCK = 0;
}
//读取数据
for ( i=8; i>0; i-- )
{ACC>>=1;
ACC_7=IO;
SCK = 1;
SCK = 0;

}
dat1=ACC;
SCK = 1;
RST = 0;

return (dat1);
}

//初始化DS1302
void DS1302_Initial(void)
{
Write1302(0x8e,0x00); //控制写入
Write1302(0x90,0xa8);
Write1302(0x80,0x00); //秒
Write1302(0x82,0x09); //分
Write1302(0x84,0x20); //时
Write1302(0x86,0x18); //日
Write1302(0x88,0x07); //月
Write1302(0x8a,0x06); //星期
Write1302(0x8c,0x09); //年
Write1302(0x8e,0x80); //写保护
}

回答2:

不用接电阻拉 开发板上面的都没接

回答3:

给我发邮件 我做出来了 353612348的QQ邮箱