C51的一个问题,请各位帮助解答下。 用的是CT107D单片机实训平台。 是编CD1302时钟芯片的程序。
/*DS1302时钟芯片显示设置功能:显示时间日期引脚说明:DS1302三引脚CLK=P1^7;PIO=P2^3;RST=P1^3;*/#include<reg51.h>...
/*DS1302时钟芯片显示设置
功能:显示 时间 日期
引脚说明:DS1302三引脚 CLK = P1^7; PIO=P2^3; RST=P1^3;
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管表
uchar data ddz[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //位寻址
uchar data TimeOut[8] = {0xc0,0xc0,0xbf,0xc0,0xc0,0xbf,0xc0,0xc0}; //时间段寻址
uchar data D0ut[8] = {0xc0,0xc0,0xbf,0xc0,0xc0,0xbf,0xc0,0xc0}; //日期段寻址
void delay(uint i) // 用uint 过程会明显点
{
while(--i);
}
void DS1302GetTime()
{
uchar ReadValue;
ReadValue = 0x44; //读秒个位 (用来调试的)
TimeOut[0] = table[ReadValue&0x0f];
TimeOut[1] = table[(ReadValue>>4)&0x0f];
ReadValue = 0x33; //读秒十位
TimeOut[3] = table[ReadValue&0x0f];
TimeOut[4] = table[(ReadValue>>4)&0x0f];
ReadValue = 0x22;
TimeOut[6] = table[ReadValue&0x0f];
TimeOut[7] = table[(ReadValue>>4)&0x0f];
}
void TimeDis()
{
uchar m;
for(m=7;m>=0;m--)
{
P2=0xc0; //开锁存(P2口的567三条线译码控制多个锁存器)
P0=ddz[m]; //位选通
P2=0x00;
P2=0xe0; //开锁存
P0=TimeOut[m]; //段选通
P2=0x00;
delay(0);
}
}
void main(void)
{
EX1=1;
EA=1;
while(1)
{
DS1302GetTime();
TimeDis();
}
}
//程序是调试的独立部分。出现的问题是:第一次显示是正确的,第二次后面开始就完全错了。主函数的循环可能有错,可我找不出来。分可能不错,还是希望各位能帮忙下。谢谢 展开
功能:显示 时间 日期
引脚说明:DS1302三引脚 CLK = P1^7; PIO=P2^3; RST=P1^3;
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管表
uchar data ddz[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //位寻址
uchar data TimeOut[8] = {0xc0,0xc0,0xbf,0xc0,0xc0,0xbf,0xc0,0xc0}; //时间段寻址
uchar data D0ut[8] = {0xc0,0xc0,0xbf,0xc0,0xc0,0xbf,0xc0,0xc0}; //日期段寻址
void delay(uint i) // 用uint 过程会明显点
{
while(--i);
}
void DS1302GetTime()
{
uchar ReadValue;
ReadValue = 0x44; //读秒个位 (用来调试的)
TimeOut[0] = table[ReadValue&0x0f];
TimeOut[1] = table[(ReadValue>>4)&0x0f];
ReadValue = 0x33; //读秒十位
TimeOut[3] = table[ReadValue&0x0f];
TimeOut[4] = table[(ReadValue>>4)&0x0f];
ReadValue = 0x22;
TimeOut[6] = table[ReadValue&0x0f];
TimeOut[7] = table[(ReadValue>>4)&0x0f];
}
void TimeDis()
{
uchar m;
for(m=7;m>=0;m--)
{
P2=0xc0; //开锁存(P2口的567三条线译码控制多个锁存器)
P0=ddz[m]; //位选通
P2=0x00;
P2=0xe0; //开锁存
P0=TimeOut[m]; //段选通
P2=0x00;
delay(0);
}
}
void main(void)
{
EX1=1;
EA=1;
while(1)
{
DS1302GetTime();
TimeDis();
}
}
//程序是调试的独立部分。出现的问题是:第一次显示是正确的,第二次后面开始就完全错了。主函数的循环可能有错,可我找不出来。分可能不错,还是希望各位能帮忙下。谢谢 展开
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
STM32是一种由意法半导体(STMicroelectronics)公司设计和生产的单片机系列,广泛用于嵌入式系统、物联网(IoT)设备、汽车电子、工业自动化等领域。STM32具有以下优点:1. 低功耗:STM32单片机通常具有较低的功耗,...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询