OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4432|回复: 5

用共阴极数码管显示ds1302不好用

[复制链接]

5

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-3-23
在线时间
4 小时
发表于 2015-5-20 20:29:45 | 显示全部楼层 |阅读模式
5金钱
#include<reg51.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit sck=P3^0;
sbit io=P3^1;
sbit rst=P3^2;

sbit smgen=P3^3;

unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsigned char code smg_we[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

uchar time_data[7]={10,6,4,17,11,58,30};
uchar time_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchar disp[8];

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 delay_50ms(uint t)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}

void write_ds1302_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
sck=0;
io=dat&0x01;
dat=dat>>1;
sck=1;
}
}

void write_ds1302(uchar add,uchar dat)
{
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
write_ds1302_byte(dat);
rst=0;
_nop_();
io=1;
sck=1;
}

uchar read_ds1302(uchar add)
{
uchar i;                
uchar value;
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
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;
}

void set_rtc(void)
{
  uchar i,j;
  for(i=0;i<7;i++)
  {
   j=time_data/10;
   time_data=time_data%10;
   time_data=time_data+j*16;
  }

  write_ds1302(0x8e,0x00);

  for(i=0;i<7;i++)
  {
write_ds1302(time_add,time_data);
  }
   write_ds1302(0x8e,0x80);
}

void read_rtc(void)
{
uchar i;
for(i=0;i<7;i++)
{
time_data=read_ds1302(read_add);
}
}

void time_pros(void)
{
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)
{
  uchar i;
  for(i=0;i<8;i++)
{
P2=smg_we;
smgen=1;
P1=smg_du[disp];
smgen=0;
delay_50ms(20);
}
}

void main(void)
{
set_rtc();
while(1)
{
read_rtc();
time_pros();
display();
}

}

这是我参考网上自己改的,但是用proteus仿真就是不好用我也不知道出错在哪

数码管.DSN

176.91 KB, 下载次数: 210

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2015-5-20 21:41:08 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

5

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-3-23
在线时间
4 小时
 楼主| 发表于 2015-5-21 07:33:10 | 显示全部楼层
回复【2楼】xouou_53320:
--------------------------------那你能帮我看看么,到底是什么地方出错了,proteus 我也上传了
回复

使用道具 举报

0

主题

16

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-2-12
在线时间
0 小时
发表于 2015-5-21 08:14:21 | 显示全部楼层
这个问题我遇到过。不一定是程序的问题,主要是因为proteus的屏幕刷新速率过慢,导致数码管的显示不正常。但是我也不知道在哪里调。我觉得可能最初用硬件跑更好一些。就像楼上说的,玩到一定程度,再用软件仿真才好。
不做浮躁的嵌入式攻城狮。。。。
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12691
金钱
12691
注册时间
2012-11-26
在线时间
3710 小时
发表于 2015-5-21 08:20:38 | 显示全部楼层
proteus仿真并不能代表在板子上运行的情况
学无止境
回复

使用道具 举报

1

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-5-23
在线时间
3 小时
发表于 2015-5-23 10:12:22 | 显示全部楼层
没听说过啊!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 09:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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