找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3676|回复: 2
收起左侧

DS1302程序在Proteus中模拟没有反应,被它打败了,求大侠救我!

[复制链接]
ID:62867 发表于 2014-11-5 13:33 | 显示全部楼层 |阅读模式
本帖最后由 wzc022777 于 2014-11-5 16:13 编辑

搞了两天了,本以为坚持就会成功的,真是不好意思现在脑袋有点胀胀的晕,只好求助救苦救难的大侠们,
谁来点拨一下我!谢了先!
第一次写这个芯片的程序,有点天马行空的样子,莫吐槽。
下面是不才大作,求批!
#include<reg51.h>
#include<intrins.h> //包含外部中断功能;
#define uchar unsigned char
#define uint unsigned int
#define p2 P2
#define p0 P0
sbit K1=P3^2; //K1按键(模式),外部中断0
sbit K2=P1^2; //K2按键(++);
sbit K3=P1^3; //K3按键(--);
sbit K4=P1^4; //K4按键(退出);
sbit RST=P1^5; //ds1302复位/使能;
sbit SCLK=P1^6; //ds1302时钟脉冲;
sbit DSIO=P1^7; //ds1302数据端;
unsigned char moshi=0;//声明:变量模式(0-1-2);
unsigned char xianshi_wei=0; //声明:变量显示位(0~5);
unsigned char xianshi_wei_zhi;//声明:位的值;
unsigned char miao_dat;//秒数据;
unsigned char fen_dat; //分数据;
unsigned char shi_dat; //时数据;
unsigned char wei_0_zhi;//第0位的显示值(秒个位);
unsigned char wei_1_zhi;//第1位的显示值(秒10位);
unsigned char wei_2_zhi;//第2位的显示值(分个位);
unsigned char wei_3_zhi;//第3位的显示值(分10位);
unsigned char wei_4_zhi;//第4位的显示值(时个位);
unsigned char wei_5_zhi;//第5位的显示值(时10位);

unsigned char code WEI_MAX[6]={0x10,0x09,0x05,0x09,0x05,0x09};//声明:每个位的最大值;
unsigned char code MA_BIAO[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//码表;
void config_int0(); //声明:外部中断int0设置函数;v
unsigned char read_time(); //声明:读取ds1302数据函数;v
void read_zhengli(); //声明:读取数据整理函数;v
void read_xianshi(); //声明:读取时间数据显示函数;v
void wei_xianshi(unsigned char wei); //声明:位显示函数;v
void wei_xieru(); //声明:位写入函数;////////////////////////////////
void delay10ms(unsigned char t); //声明:10ms延时函数;v
/***************************************************************************
主函数: 主函数:
***************************************************************************/
void main()
{
p0=0xff;
config_int0(); //启动外部中断0的设置函数;
while(1)
{
read_time(); //读取时间数据;
read_zhengli(); //对读取的数据进行整理;
read_xianshi(); //将读取并整理后的数据进行显示;
}
}

/***************************************************************************
位写入函数: 位写入函数:
***************************************************************************/
void wei_xieru()
{
//变量声明
unsigned char xie_zhiling; //写指令
unsigned char xie_dat; //写数据
unsigned r;//for变量
//判断
switch(p2)
{ //根据P2的值,选择向DS1302输入哪一位的数据;
case 0x01:xie_zhiling=0x81,xianshi_wei=0,xie_dat=miao_dat+0x01;
case 0x02:xie_zhiling=0x81,xianshi_wei=1;xie_dat=miao_dat+0x10;
case 0x04:xie_zhiling=0x83,xianshi_wei=2;xie_dat=fen_dat+0x01;
case 0x08:xie_zhiling=0x83,xianshi_wei=3;xie_dat=fen_dat+0x10;
case 0x10:xie_zhiling=0x85,xianshi_wei=4;xie_dat=shi_dat+0x01;
case 0x20:xie_zhiling=0x85,xianshi_wei=5;xie_dat=shi_dat+0x10;
}
//xie_dat=原来的值+0x01或者0x10;(个位加0x01,十位加0x10)

//写操作
SCLK=0; //准备写入
_nop_();
RST=1;
_nop_();
for(r=0;r<8;r++)//写入指令
{
DSIO=xie_zhiling&0x01;
xie_zhiling>>=1;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
_nop_();
for(r=0;r<8;r++) //写入数据
{
DSIO=xie_dat&0x01;
xie_dat>>=1;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
RST=0;
_nop_();
}
/***************************************************************************
读取时间数据显示函数: 读取时间数据显示函数:
***************************************************************************/
void read_xianshi()
{
//unsigned char m;
for(xianshi_wei=0;xianshi_wei<6;xianshi_wei++) //6位依次显示
{
wei_xianshi(xianshi_wei);
}
}
/***************************************************************************
位显示函数: 位显示函数:
根据wei的值进行判断,
将整理好的十进制某个位的值赋予xianshi_wei_zhi,
对应的位选择端口上电;
查询码表,为相应的数码管位输出信号;
***************************************************************************/
void wei_xianshi(unsigned char wei)
{
switch(wei)
{
case 0:xianshi_wei_zhi=wei_0_zhi,p2=0x01;
case 1:xianshi_wei_zhi=wei_1_zhi,p2=0x02;
case 2:xianshi_wei_zhi=wei_2_zhi,p2=0x04;
case 3:xianshi_wei_zhi=wei_3_zhi,p2=0x08;
case 4:xianshi_wei_zhi=wei_4_zhi,p2=0x10;
case 5:xianshi_wei_zhi=wei_5_zhi,p2=0x20;
//default;
}
P1=MA_BIAO[xianshi_wei_zhi]; //根据显示位的值从码表中对七段管赋值
delay10ms(5);
}
/***************************************************************************
读取数据整理函数: 读取数据整理函数
将读取的数值分配到各个显示位变量寄存器
***************************************************************************/
void read_zhengli()
{
wei_0_zhi=miao_dat&1; //取个位
wei_1_zhi=(_crol_(miao_dat,1))&1;//取十位
wei_2_zhi=fen_dat&1;
wei_3_zhi=(_crol_(fen_dat,1))&1;
wei_4_zhi=shi_dat&1;
wei_5_zhi=(_crol_(shi_dat,1))&1;
}
/***************************************************************************
读取ds1302数据函数: 读取ds1302数据函数:
unsigned char miao_dat;//秒数据(十进制);
unsigned char fen_dat; //分数据(十进制);
unsigned char shi_dat; //时数据(十进制);
***************************************************************************/
unsigned char read__time()
{
unsigned char du_miao_zhiling=0x81;//读秒指令:10000001;
unsigned char du_fen_zhiling=0x83;//读分指令:10000011;
unsigned char du_shi_zhiling=0x85;//读时指令:10000101;
unsigned char n;
//////////////秒读取///////////////
SCLK=0;
_nop_();
RST=1;
_nop_();
for(n=0;n<8;n++)
{
DSIO=du_miao_zhiling&0x01;
du_miao_zhiling>>=1;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
_nop_();
for(n=0;n<8;n++)
{
miao_dat|=_crol_((uchar)DSIO,n);// 将unsigned char类型的IO数据左移n位,并赋值给miao_dat;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
RST=0;
_nop_();
SCLK=1;
_nop_();
DSIO=0;
_nop_();
DSIO=1;
_nop_();
return (miao_dat/16)*10+miao_dat%16; //将BCD码转换为10进制;
//////////////分读取///////////////
SCLK=0;
_nop_();
RST=1;
_nop_();
for(n=0;n<8;n++)
{
DSIO=du_fen_zhiling&0x01;
du_fen_zhiling>>=1;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
_nop_();
for(n=0;n<8;n++)
{
fen_dat|=_crol_((uchar)DSIO,n);// 将unsigned char类型的IO数据左移n位,并赋值给miao_dat;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
RST=0;
_nop_();
SCLK=1;
_nop_();
DSIO=0;
_nop_();
DSIO=1;
_nop_();
return (fen_dat/16)*10+fen_dat%16; //将BCD码转换为10进制;
//////////////时读取///////////////
SCLK=0;
_nop_();
RST=1;
_nop_();
for(n=0;n<8;n++)
{
DSIO=du_shi_zhiling&0x01;
du_shi_zhiling>>=1;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
_nop_();
for(n=0;n<8;n++)
{
shi_dat|=_crol_((uchar)DSIO,n);// 将unsigned char类型的IO数据左移n位,并赋值给miao_dat;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
RST=0;
_nop_();
SCLK=1;
_nop_();
DSIO=0;
_nop_();
DSIO=1;
_nop_();
return (shi_dat/16)*10+shi_dat%16; //将BCD码转换为10进制;
}
/***************************************************************************
设置外部中断函数int0: 设置外部中断函数int0:
***************************************************************************/
void config_int0()
{
IT0=1;//跳变沿触发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1; //打开总中断
}

/***************************************************************************
外部中断函数:(校时模式) 外部中断函数:(校时模式)
由K1=P3.2脚INT0下降沿触发
***************************************************************************/
void int0() interrupt 0
{
unsigned char anjianshichang=0;//声明一个变量:按键时长;
moshi++; //模式++;
xianshi_wei=0; //显示位初始值=0;
while(moshi>0) //循环条件:模式>0;
{
if(moshi>2) //如果模式大于2,那么:模式=2;
moshi=2;
read_time(); //读取时间数据///////////////////////////////////////////;
read_zhengli(); //对读取的数据进行整理///////////////////////////////////;
read_xianshi(); //将读取并整理后的数据进行显示///////////////////////////;
while(moshi==1) //循环条件:模式为1(模式选项页);
{
if((K2==0)|(K3==0)|(K4==0)) //如果有按键按下;
{
delay10ms(1); //延时消抖;
if(K2==0) //如果K2按下,显示位++;
xianshi_wei++;
if(xianshi_wei>5) //如果显示位超过5,重置为0;
xianshi_wei=0;
if(K3==0) //如果K3按下,显示位-- ;
xianshi_wei--;
if(xianshi_wei==0) //如果显示位小于1,重置为5;
xianshi_wei=5;
if(K4==0) //如果退出键K4按下,模式归0,退出中断服务程序;
moshi=0;
wei_xianshi(xianshi_wei); //位显示;
while((anjianshichang<50)&(K2==0)&(K3==0)&(K4==0)) //按键松手检测;
{
delay10ms(1);
anjianshichang++; //按键时长;
}
}
}
while(moshi>1) //循环条件:模式=2(位值修改模式)
{
if((K2==0)|(K3==0)|(K4==0)) //如果有按键按下;
{
delay10ms(1); //延时消抖;
if(K2==0) //如果K2按下,位的值++;
xianshi_wei_zhi++;
if(xianshi_wei_zhi>WEI_MAX[xianshi_wei]) //如果位的值超过wei_max[xianshi_wei],重置为0;
xianshi_wei_zhi=0;
if(K3==0) //如果K3按下,位的值-- ;
xianshi_wei_zhi--;
if(xianshi_wei_zhi<0) //如果位的值小于0,重置为wei_max[xianshi_wei];
xianshi_wei_zhi=WEI_MAX[xianshi_wei];
if(K4==0) //如果退出键K4按下,模式归1;
moshi=1;
wei_xieru(); //位写入;
wei_xianshi(xianshi_wei); //位显示;
while((anjianshichang<50)&(K2==0)&(K3==0)&(K4==0)) //按键松手检测;
{
delay10ms(1);
anjianshichang++;
}
}
}
}
}
/***************************************************************************
10ms延时函数 函数:10ms延时函数
***************************************************************************/
void delay10ms(unsigned char t)
{
unsigned char tt,ttt;
for(;t>0;t--)
for(tt=38;tt>0;tt--)
for(ttt=130;ttt>0;ttt--);
}

回复

使用道具 举报

ID:262 发表于 2014-11-5 14:25 | 显示全部楼层
上传一下 仿真文件
回复

使用道具 举报

ID:62867 发表于 2014-11-5 16:14 | 显示全部楼层
这是仿真文件

基于DS1302的时钟电路.zip

60.25 KB, 下载次数: 22

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表