导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→请教!

* 33538: 请教!

   苹果啃牙 
苹果啃牙发表的帖子 

 请教!
不知道我这个程序出错出在哪里,请各位大侠帮帮小妹我!
谢谢··!!

#include   <reg52.h>  
#include   <intrins.h>  
//#define uint unsigned int

//下面是引脚连接关系

sbit scl_ds1302 =p3^2;
sbit io_ds1302  =p3^3;
sbit rst_ds1302 =p3^4;
sbit wr = p3^6;
sbit b0=p1^0;
sbit button1=p1^4;
sbit button2=p1^5;
sbit button3=p1^6;
sbit button4=p1^7;


unsigned int data display_buffer1[8],display_buffer2[8];
unsigned char bdata data_ds1302;
sbit bit_data0=data_ds1302^0;
sbit bit_data7=data_ds1302^7;
unsigned char bdata x;
sbit x0   =x^0;
sbit x7   =x^7;

void open_write_bit();
void initial_ds1302();
unsigned char read_ds1302(char command);
void open_write_bit();
void close_write_bit();
void read_time();
void set_time();
unsigned int zhuanhuan( unsigned int b);
void display1();
void display2();
void button();
 
void main( void)

 initial_ds1302();  //上电启用,否则不走时
 read_time();   //读取当前的年月日时分秒在数组
 b0=0;
 display_buffer2[5]=0x00;
 display_buffer2[4]=0x03;
 display_buffer2[3]=0x00;
 display_buffer2[2]=0x06;
 display_buffer2[1]=0x01;
 display_buffer2[0]=0x04;
 display_buffer1[5]=0x00;
 display_buffer1[4]=0x08;
 display_buffer1[3]=0x01;
 display_buffer1[2]=0x00;
 display_buffer1[1]=0x05;
 display_buffer1[0]=0x08; //将03年6月14日08时10分58秒设置为当前时间
 set_time();    //将数组中的时间置入ds1302
 while(1)
 {
  button();
     read_time();
 }
}

void display1()
{
   unsigned int *p;
 unsigned int i, j, k; 
 p = display_buffer1;
 j = 0xa0;
 for(i=0;i  <8;i++)
 {
 k = *p;
 k = zhuanhuan( k);
 p2 = j;
 wr = 0;
//  while(1);
 _nop_( ); _nop_( ); _nop_( ); _nop_( );
 p0 = k;
 _nop_( ); _nop_( );
 wr = 1;
 p = p + 1;
 j = j + 4;
 }
}

void display2()
{
   unsigned int *p;
 unsigned int i, j, k; 
 p = display_buffer2;
 j = 0xa0;
 for(i=0;i  <8;i++)
 {
 k = *p;
 k = zhuanhuan( k);
 p2 = j;
 wr = 0;
//  while(1);
 _nop_( ); _nop_( ); _nop_( ); _nop_( );
 p0 = k;
 _nop_( ); _nop_( );
 wr = 1;
 p = p + 1;
 j = j + 4;
 }
}

unsigned int zhuanhuan( unsigned int b)
{
 switch( b)
 {
 case 0: b = 0xc0; break;
 case 1: b = 0xf9; break;
 case 2: b = 0xa4; break;
 case 3: b = 0xb0; break;
 case 4: b = 0x99; break;
 case 5: b = 0x92; break;
 case 6: b = 0x82; break;
 case 7: b = 0xf8; break;
 case 8: b = 0x80; break;
 case 9: b = 0x98; break;
 default: break;
 }
 return b;
}

void close_write_bit()
{
 char i;
 scl_ds1302=0;
 _nop_();
 rst_ds1302=1;
 _nop_();_nop_();
 data_ds1302=0x8e;   //write control redister
 for (i=1;i  <=8;i++) {
       scl_ds1302=0;io_ds1302=bit_data0;
       _nop_();scl_ds1302=1;
       data_ds1302=data_ds1302>  >  1; 
      }
 data_ds1302=0x80;   //close write protect bit
 io_ds1302=0;
 for (i=1;i  <=8;i++) {
       scl_ds1302=0;io_ds1302=bit_data0;
       _nop_();scl_ds1302=1;
       data_ds1302=data_ds1302>  >  1; 
         }
}


void open_write_bit()
{
 char i;
 scl_ds1302=0;
 _nop_();
 rst_ds1302=1;
 _nop_();_nop_();
 data_ds1302=0x8e;   //write control redister
 for (i=1;i  <=8;i++) {
       scl_ds1302=0;io_ds1302=bit_data0;
       _nop_();scl_ds1302=1;
       data_ds1302=data_ds1302>  >  1; 
         }
 data_ds1302=0x00;   //open write protect bit
 io_ds1302=0;
 for (i=1;i  <=8;i++) {
       scl_ds1302=0;io_ds1302=bit_data0;
       _nop_();scl_ds1302=1;
       data_ds1302=data_ds1302>  >  1; 
         }
}

void initial_ds1302()
{
unsigned char i;
 scl_ds1302=0;
 _nop_();
 rst_ds1302=1;
 _nop_();_nop_();
 data_ds1302=0x8e;   //write control redister
 for (i=1;i  <=8;i++) {
       scl_ds1302=0;io_ds1302=bit_data0;
       _nop_();scl_ds1302=1;
       data_ds1302=data_ds1302>  >  1; 
      }
 data_ds1302=0x80;   //close write protect bit
 io_ds1302=0;
 for (i=1;i  <=8;i++) {
       scl_ds1302=0;io_ds1302=bit_data0;_nop_();
       scl_ds1302=1;data_ds1302=data_ds1302>  >  1; 
      }
 rst_ds1302=0;
 _nop_();
 scl_ds1302=0;
 scl_ds1302=0;
 _nop_();
 rst_ds1302=1;
 _nop_();_nop_();
 data_ds1302=0x90;   //recharge register 
 for (i=1;i  <=8;i++) {
       scl_ds1302=0;io_ds1302=bit_data0;_nop_();
       scl_ds1302=1;data_ds1302=data_ds1302>  >  1; 
      }
 data_ds1302=0xa4;   //no rechaarge for battery
 for (i=1;i  <=8;i++) {
       scl_ds1302=0;io_ds1302=bit_data0;
       _nop_();scl_ds1302=1;
       data_ds1302=data_ds1302>  >  1; 
      }
 rst_ds1302=0;
 _nop_();
 scl_ds1302=0;
 scl_ds1302=0;
 _nop_();
 rst_ds1302=1;
 _nop_();_nop_();
 data_ds1302=0x80;
 for (i=1;i  <=8;i++) {
       scl_ds1302=0;io_ds1302=bit_data0;
       _nop_();scl_ds1302=1;
       data_ds1302=data_ds1302>  >  1; 
     }
 data_ds1302=0x80;
 for (i=1;i  <=8;i++) {
       scl_ds1302=0;io_ds1302=bit_data0;
       _nop_();scl_ds1302=1;
       data_ds1302=data_ds1302>  >  1; 
      }
 rst_ds1302=0;
 _nop_();
 scl_ds1302=0;
}

unsigned char read_ds1302(char command)
{
char i;
 data_ds1302=(command  <  <1)|0x81;
 scl_ds1302=0;
 _nop_();
 rst_ds1302=1;
 for (i=1;i  <=8;i++) {
       scl_ds1302=0;io_ds1302=bit_data0;
       _nop_();scl_ds1302=1;
       data_ds1302=data_ds1302>  >  1; 
      }
 scl_ds1302=1;
 for (i=1;i  <=8;i++) {
       data_ds1302=data_ds1302>  >  1;
       scl_ds1302=0;_nop_();
       bit_data7=io_ds1302;scl_ds1302=1;
      }
 rst_ds1302=0;
 _nop_();
 scl_ds1302=0;
 return(data_ds1302);
}


void write_ds1302(unsigned char address,unsigned char numb) //写入时间
{
 char i;
 rst_ds1302=0;
 scl_ds1302=0;
 rst_ds1302=0;
 rst_ds1302=1;
 data_ds1302=0x80|(address  <  <1);
 for (i=1;i  <=8;i++) {
       scl_ds1302=0;io_ds1302=bit_data0;
       _nop_();scl_ds1302=1;
       data_ds1302=data_ds1302>  >  1; 
      }
 data_ds1302=numb;
 for (i=1;i  <=8;i++) {
       scl_ds1302=0;io_ds1302=bit_data0;
       _nop_();scl_ds1302=1;
       data_ds1302=data_ds1302>  >  1; 
      }
 rst_ds1302=0;
 scl_ds1302=1;
}
void read_time()       //读取时间
{
 unsigned char second,minute,hour,date,month,year,d;
 second=0;        //read second address
 d=read_ds1302(second);
 display_buffer1[0]=d&0x0f;
 display_buffer1[1]=d>  >  4;
 minute=1;        //read minute address
 d=read_ds1302(minute);
 display_buffer1[2]=d&0x0f;
 display_buffer1[3]=(d>  >  4);
 hour=2;         //read hour address
 d=read_ds1302(hour);
 display_buffer1[4]=d&0x0f;
 display_buffer1[5]=(d>  >  4);
    date=3;
 d=read_ds1302(date);
    display_buffer2[0]=d&0x0f;
 display_buffer2[1]=(d>  >  4);               //read data address
    month=4;
 d=read_ds1302(month);
 display_buffer2[2]=d&0x0f;
 display_buffer2[3]=(d>  >  4);               //read month address
 year=6;
 d=read_ds1302(year);
 display_buffer2[4]=d&0x0f;
 display_buffer2[5]=(d>  >  4);               //read year address
}

void set_time()
{
unsigned char data temp;
unsigned char data hour_address,minute_address,second_address,year_address,month_address,date_address;
    year_address=6;
 month_address=4;
 date_address=3;
    hour_address = 2;
 minute_address = 1;
 open_write_bit();
    temp=(display_buffer2[5]  <  <4)|display_buffer2[4];
 write_ds1302(year_address,temp);
 temp=(display_buffer2[3]  <  <4)|display_buffer2[2];
 write_ds1302(month_address,temp);
 temp=(display_buffer2[1]  <  <4)|display_buffer2[0];
 write_ds1302(date_address,temp);
 temp=(display_buffer1[5]  <  <4)|display_buffer1[4];
 write_ds1302(hour_address,temp);
 temp=(display_buffer1[3]  <  <4)|display_buffer1[2];
 write_ds1302(minute_address,temp);
 temp=(display_buffer1[1]  <  <4)|display_buffer1[0];
 write_ds1302(second_address,temp);
 close_write_bit();
}

void button()
{
unsigned char data button1,button2,button3,button4;
char i;
    if(button1=0)
 {  
    for(i=0;i  <8;i++)
    {
      display_buffer1[i]=0;
         display2();
  }
 }
 else if(button2=0)
  {  display_buffer1[5]=display_buffer1[5]+1; }
    else if(button3=0)
  {  display_buffer1[3]=display_buffer1[3]+1; }
 else if(button4=0)
  {  display_buffer2[1]=display_buffer2[1]+1; }
    else{ display1(); }     
}


发表时间:2003年6月6日19:26:10

  
回复该帖

本主题共有 8 帖,分页:>>>>>该主题的所有内容[8]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  33539.[详细]我以前也用过1302,不过是用汇编语言的,c语言不是很懂,不过我看了你的程序后看到你犯了和我当初一..
摘要:我以前也用过1302,不过是用汇编语言的,c语言不是很懂,不过我看了你的程序后看到你犯了和我当初一样的错误,你在初始化之后已经禁止写入了,而随后又有读程序,读程序是要先写入控制命令的,你既然已经禁止写了,又怎么能写入控制命令呢,也即写不进去......(309字)
- [我是一条鱼][1451次] 2003年6月6日

  33588.[详细]你好: 我看你的初始化程序真的有问题,你在初始化的开始就给8eh中送80h,这就已经禁止..
摘要:你好:  我看你的初始化程序真的有问题,你在初始化的开始就给8eh中送80h,这就已经禁止数据写入1302了,而接下来你又设置充电程序,这个根本就不行了,而初始化之后的读程序也不行了,因为读数据之前必须先写入地址,你在之......(692字)
- [我是一条鱼][998次] 2003年6月7日

  33605.[详细]你能不能把你的汇编程序给我看看?
摘要:......(无内容)
- [苹果啃牙][1139次] 2003年6月7日

[上一篇帖子]:我以前也用过1302,不过是用汇编语言的,c语言不是很懂,不过我看了你的程序后看到你犯了和我当初一样
[下一篇帖子]:怎么不招女生呢?怎么不招女生呢?[em00]