3476|11

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

DS1302 GCC程序怎么结果又错 [复制链接]

#include
#include //寄存器宏定义
#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 unit unsigned int

#define uchar unsigned char

#define SCLKH PORTB|=(1< #define SCLKL PORTB&=~(1< #define DIOH  PORTB|=(1< #define DIOL  PORTB&=~(1< #define  CEH    PORTB|=(1< #define CEL  PORTB&=~(1< //数码管字型表,对应0,1,2,3,4,5,6,7,8,9,后十位数是带小数点的0-9//
uchar Table[22]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
            //0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0xff} ;
uchar Data[6]={1,2,3,4,5,6} ;               //显示初始值:0 0 0 0 0 0
//位寻址寄存器定义

uchar a;
int b,c,d;
//管脚定义

       
//地址、数据发送子程序
void Write1302 ( uchar  addr,uchar dat )     
{  unsigned char i;uchar temp;   
   DDRB=0XFF;
   
   PORTB &= ~(1<    PORTB |= (1<
       //发送地址
       for ( i=8; i>0; i-- ) //循环8次移位
       {     
            
              temp = addr;
                          if(temp&0x01)
                          {  PORTB|= (1<                           else
              {  PORTB&= ~(1<               PORTB|= (1<               addr >>= 1;                //右移一位
              
              PORTB&= ~(1<          
       }
      
//发送数据
       for ( i=8; i>0; i-- )
       {     
              PORTB&= ~(1<               temp = dat;
              if(temp&0x01)
                          {  PORTB|= (1<                           else
              {  PORTB&= ~(1<               dat >>= 1;                  
               PORTB|= (1<                _delay_loop_2(8*250);
       }
     PORTB&= ~(1< }

//数据读取子程序
unsigned char Read1302 ( unsigned char addr )
{
       unsigned char i,temp,dat1,dat2,dat3;
   DDRB=0XFF;
  
   PORTB&= ~(1<    PORTB|= (1<        //发送地址
       for ( i=8; i>0; i-- )                      //循环8次移位
       {     
            
         
              temp = addr;
                          if(temp&0x01)
                          {  PORTB|= (1<                           else
              {  PORTB&= ~(1<               PORTB|= (1<               addr >>= 1;                //右移一位
                PORTB&= ~(1<                
       }
       //读取数据
           DDRB=0XFD;
       for ( i=0; i<8; i++ )
       {      
                   a>>1;
                  PORTB&= ~(1<                   if(PINB&0X02)
               a|= 0x80;
                          else
                          a&=0x7F;
              PORTB|= (1<             
              
       }     
      PORTB&=~(1<           
       dat1=a;
     // dat2=dat1/16;                           //数据进制转换
     //  dat3=dat1%16;                         //十六进制转十进制
      //dat1=dat3+dat2*10;
       return (dat1);
}

//初始化DS1302
void Initial(void)   
{
     Write1302 (WRITE_PROTECT,0X00);         //禁止写保护
       Write1302 (WRITE_SECOND,0x65);          //秒位初始化
       Write1302 (WRITE_MINUTE,0x34);         //分钟初始化
      Write1302 (WRITE_HOUR,0x12);                     //小时初始化
    Write1302 (WRITE_PROTECT,0x80);                 //允许写保护
}
int main(void)
{int i;
DDRA=0XFF;
PORTA=0XFF;
DDRB=0XFF;
PORTB=0XFF;
DDRC=0XFF;
PORTC=0XFF;
void Initial(void);

while(1)
{b=Read1302(READ_HOUR );
Data[0]=b>>4;
Data[1]=b&0X0F;
c= Read1302(READ_MINUTE );
Data[2]=c>>4;
Data[3]=c&0X0F;
d= Read1302(READ_SECOND );
Data[4]=d>>4;
Data[5]=d&0X0F;
   
for(i=0;i<6;i++)
{

PORTC=~(1< PORTA=Table[Data];
_delay_loop_2(20*250);
}

}
}

最新回复

我用正确的程序实验过了可以通过为什么这个有错误  详情 回复 发表于 2010-5-30 16:18
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
说下是怎么错了啊
读不出来?写不进去?读出个错误数?
 
 

回复

95

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
读出来的是000080
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

4
 
我用下面这个一直没问题

  1. /*========================================*/
  2. /*--------DS1302 RAM------------------*/
  3. sbit ds_clk=P1^5;
  4. sbit ds_io =P1^4;
  5. sbit ds_rst=P2^7;
  6. sbit ACC_0=ACC^0;  //ACC可以换成其他什么的
  7. sbit ACC_7=ACC^7;
  8. #define second StringD[0]
  9. #define minute StringD[1]
  10. #define hour   StringD[2]
  11. #define da           StringD[3]
  12. #define month  StringD[4]
  13. #define week   StringD[5]
  14. #define year   StringD[6]
  15. //DS1302 Fuction

  16. void write_data(uchar ucsenddata)
  17. {
  18.         uchar i;
  19.         ACC=ucsenddata;
  20.         for(i=8;i>0;i--)
  21.         {
  22.                 ds_io=ACC_0;
  23.                 ds_clk=1;
  24.                 _nop_();
  25.                 _nop_();       
  26.                 ds_clk=0;
  27.                 ACC=ACC>>1;
  28.         }
  29. }
  30. uchar read_data()
  31. {
  32.         uchar i;
  33.         for(i=8;i>0;i--)
  34.         {
  35.                 ACC=ACC>>1;
  36.                 ACC_7=ds_io;
  37.                 ds_clk=1;
  38.                 _nop_();
  39.                 _nop_();
  40.                 ds_clk=0;
  41.         }
  42.         return ACC;
  43. }

  44. void write_ds1302(uchar ucaddress,uchar ucdata)
  45. {
  46.         ds_rst=0;
  47.         delay();
  48.         ds_clk=0;
  49.         delay();
  50.         ds_rst=1;
  51.         delay();
  52.         write_data(ucaddress);
  53.         delay();
  54.         delay();
  55.         write_data(ucdata);
  56.         delay();
  57.         ds_clk=0;
  58.         delay();
  59.         ds_rst=0;
  60.         delay();
  61. }

  62. uchar read_ds1302(uchar ucaddress)
  63. {
  64.         uchar p;
  65.         ds_rst=0;
  66.         delay();
  67.         ds_clk=0;
  68.         delay();
  69.         ds_rst=1;
  70.         delay();
  71.         write_data(ucaddress);
  72.         delay();
  73.         p=read_data();
  74.         delay();
  75.         ds_clk=0;
  76.         delay();
  77.         ds_rst=0;
  78.         delay();
  79.         return p;
  80. }

  81. void settime()
  82. {
  83.         write_ds1302(0x8e,0x00);
  84.         delay();
  85.         delay();
  86.         write_ds1302(0x90,0xa5);
  87.         delay();
  88.         delay();
  89.         write_ds1302(0x80,second);
  90.         delay();
  91.         delay();
  92.         write_ds1302(0x82,minute);
  93.         delay();
  94.         delay();
  95.         write_ds1302(0x84,hour);
  96.         delay();
  97.         delay();
  98.         write_ds1302(0x86,da);
  99.         delay();
  100.         delay();
  101.         write_ds1302(0x88,month);
  102.         delay();
  103.         delay();
  104.         write_ds1302(0x8a,week);
  105.         delay();
  106.         delay();
  107.         write_ds1302(0x8c,year);
  108.         delay();
  109.         delay();
  110. }

  111. void readtime()
  112. {
  113.         second=read_ds1302(0x81);
  114.         delay();
  115.         delay();
  116.         minute=read_ds1302(0x83);
  117.         delay();
  118.         delay();
  119.         hour=read_ds1302(0x85);
  120.         delay();
  121.         delay();
  122.         da=read_ds1302(0x87);
  123.         delay();
  124.         delay();
  125.         month=read_ds1302(0x89);
  126.         delay();
  127.         delay();
  128.         week=read_ds1302(0x8b);
  129.         delay();
  130.         delay();
  131.         year=read_ds1302(0x8d);
  132.         delay();
  133.         delay();
  134. }
  135. bit checktime(void)
  136. {
  137.         bit tempbit;
  138.         tempbit=0;
  139.         readtime();
  140.         if(second>0x60)tempbit=1;         //in fact if second&0x0f>9 is means time is not right

  141.         if(minute>0x60)tempbit=1;

  142.         if(hour>0x24)tempbit=1;

  143.         if(month>0x12)tempbit=1;

  144.         if(da>0x31)tempbit=1;

  145.         if(week>7)tempbit=1;

  146.         if(tempbit==1)return(1);
  147.         else return(0);
  148. }
复制代码
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

5
 
怎么没有主函数,你这个用的是ICC编的吧
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
我从工作文件里复制粘贴的,那个主函数太长了还是不贴的好
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

7
 
keil c写的
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
首先看硬件连接是否正确,确定IO配置是否正确,再看时序是否有错。。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 
初始化没有做好,将你的秒位改为0X00---0X59之间的数试试!
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

10
 
还是不行啊
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

11
 
像这种问题,先去找个正确的程序试试,如果OK那就OK,如果不行的话,那可能就是硬件有问题了,测测电压,测测通断。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

12
 
我用正确的程序实验过了可以通过为什么这个有错误
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表