打印

新手的疑惑

[复制链接]
3369|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoziwoye|  楼主 | 2011-8-1 19:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TE, AD, RS, ck, WRITE
请问uchar disp[8]为什么 把8去掉(即就是uchar disp[]) 程序就会错误,时钟停止住,显示11 11 11。      
程序如下:

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sck=P3^6;
sbit io=P3^4;
sbit rst=P3^5;
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//DS1302的设置读地址
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//DS1302的设置写地址
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
//数码管1-9,第10个是'-'
uchar settime[]={11,8,1,1,15,50,50};//年月日周时分秒
uchar disp[8];
/******************************************************************/
/*                   声明区                                       */
/******************************************************************/
void ds1302_write_byte(uchar add);
void ds1302_write(uchar adress,uchar date);
void read(void);
uchar read_ds1302(uchar adress);
void set_ds1302(void);
void process_ds1302(void);
void dispaly(void);
void delay(uchar a)//延时函数1ms
{
        uchar i,j;
        for(i=a;i>0;i--)
        for(j=120;j>0;j--);
}
/******************************************************************/
/*                   写一个字节                                   */
/******************************************************************/
void ds1302_write_byte(uchar add)
{
       uchar i;
       for(i=0;i<8;i++)
      {
            sck=0;
            io=add&0x01;
            add=add>>1;
            sck=1;
      }
}
/******************************************************************/
/*                  写入DS1302                                    */
/******************************************************************/
void ds1302_write(uchar adress,uchar date)
{
       rst=0;
       _nop_();
       sck=0;
       _nop_();
       rst=1;
       _nop_();
       ds1302_write_byte(adress);
       ds1302_write_byte(date);
       rst=0;
       io=1;
       sck=1;
}
/******************************************************************/
/*                   读出DS1302数据                               */
/******************************************************************/
uchar read_ds1302(uchar adress)
{
       uchar i,temp;
       rst=0;
       _nop_();
       sck=0;
       _nop_();
       rst=1;
       ds1302_write_byte(adress);
       for(i=0;i<8;i++)
       {
  
              if(io)
              temp=temp|0x80;
              sck=0;
              _nop_();
              temp>>=1;
              sck=1;
              _nop_();
}
       rst=0;
       _nop_();
       sck=0;;
       _nop_();
       sck=1;
       io=1;
       return temp;
}
/******************************************************************/
/*                   设置初始值                                   */
/******************************************************************/
void set_ds1302()
{
       uchar i,temp;
       for(i=0;i<7;i++) //BCD码处理
       {
              temp=settime[i]/10;
              settime[i]=settime[i]%10;
              settime[i]=settime[i]+temp*16;
       }
       ds1302_write(0x8e,0x00);  //¹Øµôд±£»¤
       for(i=0;i<7;i++)
       {
              ds1302_write(write_add[i],settime[i]);
       }
       ds1302_write(0x8e,0x80);   //¹Øµôд±£»¤
}
/******************************************************************/
/*                   读时钟数据                                   */
/******************************************************************/
void read()
{
        uchar i;
        for(i=0;i<7;i++)
        {
                settime[i]=read_ds1302(read_add[i]);
         }
}
void process_ds1302(void)
{
       disp[0]=settime[6]%16;
       disp[1]=settime[6]/16;
       disp[2]=10;
       disp[3]=settime[5]%16;
       disp[4]=settime[5]/16;
       disp[5]=10;
       disp[6]=settime[4]%16;
       disp[7]=settime[4]/16;
}
/******************************************************************/
/*             显示函数(通过数码管)                              */
/******************************************************************/
void display()
{
         P0=table[disp[0]];
         P1=0X7F;
         delay(10);
         P0=table[disp[1]];
         P1=0xbf;
         delay(10);
         P0=table[10];
         P1=0xdf;
         delay(10);
         P0=table[disp[3]];
         P1=0Xef;
         delay(10);
         P0=table[disp[4]];
         P1=0xf7;
         delay(10);
         P0=table[10];
         P1=0xfb;
         delay(10);
  
         P0=table[disp[6]];
         P1=0Xfd;
         delay(10);
         P0=table[disp[7]];
         P1=0xfe;
         delay(10);
}
/******************************************************************/
/*                   主函数                                       */
/******************************************************************/
void main()
{
       set_ds1302();
       while(1)
       {
              read();
              process_ds1302();
              display();
       }
}



麻烦大家了,在这里我先谢谢了。

相关帖子

沙发
NE5532| | 2011-8-1 19:47 | 只看该作者
会打断点不?

使用特权

评论回复
板凳
xiaoziwoye|  楼主 | 2011-8-1 19:48 | 只看该作者
刚学单片机20多天,还不太会调试

使用特权

评论回复
地板
xiaoziwoye|  楼主 | 2011-8-1 19:52 | 只看该作者
坐等解答   :hug:

使用特权

评论回复
5
NE5532| | 2011-8-1 19:58 | 只看该作者
不太会调你一股脑写这么多行然后来发现不对?以一个老鸟来看,说句不好听的——你活该。程序该咋调?

使用特权

评论回复
6
NE5532| | 2011-8-1 20:13 | 只看该作者
我们先来讨论一个非技术问题,你小时候不会走路的时候是怎么做的?

使用特权

评论回复
7
xiaoziwoye|  楼主 | 2011-8-1 20:59 | 只看该作者
明白了 我自己试着搞定吧

使用特权

评论回复
8
highgear| | 2011-8-1 21:04 | 只看该作者
俺顶 NE5532

使用特权

评论回复
9
liang7143| | 2011-8-1 21:12 | 只看该作者
uchar disp[8],这里应该是定义一个数组吧
把8去掉,定义数组不给长度??

使用特权

评论回复
10
NE5532| | 2011-8-1 21:54 | 只看该作者
呵呵,不提示了,让楼主自己找把,过了这关他程序就入门了。

使用特权

评论回复
11
mcu5i51| | 2011-8-2 08:02 | 只看该作者
呵呵,不提示了,让楼主自己找把,过了这关他程序就入门了。
NE5532 发表于 2011-8-1 21:54

看样子LZ的路还要........................................................

使用特权

评论回复
12
mbutterfly| | 2011-8-2 08:31 | 只看该作者
LS

使用特权

评论回复
13
jack_shine| | 2011-8-2 08:53 | 只看该作者
ls惊现一对鸳鸯蝴蝶,有木有:lol

使用特权

评论回复
14
jack_shine| | 2011-8-2 08:56 | 只看该作者
在开始声明的时候要指定大小,不然CPU怎么知道要预留分配多少空间? 我猜的

使用特权

评论回复
15
joyme| | 2011-8-2 09:10 | 只看该作者
要么像settime一样赋初值,要么就定义定长数组
不要用自己都不确定是否正确的代码

使用特权

评论回复
16
2009chinalj| | 2011-8-2 09:22 | 只看该作者
8个数码管,我们先1、2、3、、、、分别给各个管子编号。调用一次显示子程序楼主应该先是从第一个管开始点亮一直点到第八个数码管然后再继续执行别的程序,直到再次调用显示子程序,再从第一个管子开始依次点亮第一到第八个、、、然而在调用别的程序时一直是点亮第8个管子亮。至于解决的办法很多,楼主可以在程序的里设第九个管、、、解决了记得回个帖

使用特权

评论回复
17
xiaoziwoye|  楼主 | 2011-8-2 09:50 | 只看该作者
对,就是定义数组既不给长度又不给初始值会出错

使用特权

评论回复
18
mytempid| | 2011-8-2 15:07 | 只看该作者
数组定义不给长度,编译器没有警告?(LZ不至于还在用DOS下的命令行编译器吧?)

先把所有的警告排除

使用特权

评论回复
19
yangaiping| | 2011-8-2 19:48 | 只看该作者
定义数组长度,分配存储空间

使用特权

评论回复
20
sysdriver| | 2011-8-2 20:02 | 只看该作者
ls惊现一对鸳鸯蝴蝶,有木有:lol
jack_shine 发表于 2011-8-2 08:53


这也能行,服了,mcu5i51应该是传说中的把妹高手

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

75

帖子

1

粉丝