找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3626|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

[求助]求大俠幫忙分析分析此段程序錯(cuò)在哪?謝謝了

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:43135 發(fā)表于 2012-7-22 09:44 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

想用ds1302和1602液晶做做時(shí)鐘的程序,在proteus仿真,但怎么也達(dá)不到要求。編譯無(wú)錯(cuò),運(yùn)行結(jié)果出乎意料,只顯示0,而且時(shí)鐘沒(méi)工作。

各位大俠幫忙著分析分析,謝謝了。

 

/*************程序ds1302.c*****************/

#include <reg52.h>
#include "ds1302.h"
#include "lcd1602.h"

//uchar th[]="i am a teacher !";
void main()
{
 uchar i;
 struct _time time;
// struct _time *t=time;
 lcd_init();
 ds1302_init();
 set_time(ds1302_sec,5);
 set_time(ds1302_min,15);
 set_time(ds1302_hr,12);
 set_time(ds1302_date,21);
 set_time(ds1302_mon,12);
 set_time(ds1302_day,6);
 set_time(ds1302_year,12);
 while(1)
 {
  get_time(&time);
  date_to_format(&time);
  time_to_format(&time);
  lcd_write_cmd(0x80+0);
  for(i=0;i<9;i++)
  {
   lcd_write_dat(time.DateFormat);
   //lcd_write_dat(th); 
  }
  lcd_write_cmd(0x80+0x40);
  for(i=0;i<9;i++)
  {
   lcd_write_dat(time.TimeFormat);
   //lcd_write_dat(th); 
  }
  //delay_ms(100);  
 }
}

 

/*********************程序ds1302.h************************/

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

#define ds1302_sec 0x80
#define ds1302_min 0x82
#define ds1302_hr 0x84
#define ds1302_date 0x86
#define ds1302_mon 0x88
#define ds1302_day 0x8a
#define ds1302_year 0x8c


sbit ds1302_rst=P1^5;
sbit ds1302_sclk=P1^6;
sbit ds1302_io=P1^7;
sbit ACC7=ACC^7;
sbit ACC0=ACC^0;

struct _time
{
 unsigned char sec;
 unsigned char min;
 unsigned char hr;
 unsigned char date;
 unsigned char mon;
 unsigned char day;
 unsigned char year;
 unsigned char DateFormat[9];
 unsigned char TimeFormat[9];
};                                //定義的時(shí)間類型

 


void ds1302_write(uchar cmd,uchar dat)   //往指定地址寫入數(shù)據(jù)
{
 uchar i;
 ds1302_sclk=0;
 ds1302_rst=1;
 ACC=cmd;
 for(i=0;i<8;i++)
 {
  ds1302_io=ACC0;
  ds1302_sclk=1;
  ds1302_sclk=0;
  ACC=ACC>>1; 
 }
 ACC=dat;
 for(i=0;i<8;i++)
 {
  ds1302_io=ACC0;
  ds1302_sclk=1;
  ds1302_sclk=0;
  ACC=ACC>>1; 
 } 
 ds1302_sclk=1;
 ds1302_rst=0;
}

uchar ds1302_read(uchar cmd)    //讀出指定地址的數(shù)據(jù)
{
 uchar i;
 ds1302_sclk=0;
 ds1302_rst=1;
 ACC=cmd;
 for(i=0;i<8;i++)
 {
  ds1302_sclk=0;
  ds1302_io=ACC0;
  ds1302_sclk=1;
//  ds1302_sclk=0;
  ACC=ACC>>1; 
 }
 for(i=0;i<8;i++)
 {
//  ACC7=ds1302_io;
  ACC=ACC>>1;
  ds1302_sclk=1;
  ds1302_sclk=0;
  ACC7=ds1302_io;
 }
 ds1302_sclk=1;
 ds1302_rst=0;
 return ACC;
}

void ds1302_SetProtect(bit flag)        //設(shè)置寫保護(hù)
{
 if(flag)
  ds1302_write(0x8E,0x80);
 else
  ds1302_write(0x8E,0x00);
}

void set_time(uchar add,uchar var)  //設(shè)置時(shí)間
{
 ds1302_SetProtect(0);
 ds1302_write(add,((var/10)<<4|(var%10))); //轉(zhuǎn)成BCD碼
}

void get_time(struct _time *t)        //讀取時(shí)鐘寄存器放入time結(jié)構(gòu)體
{
 uchar var;
 var=ds1302_read(ds1302_sec);
 t->sec=(var&0x70>>4)*10+(var&0x0f);
 var=ds1302_read(ds1302_min);
 t->min=(var&0x70>>4)*10+(var&0x0f);
 var=ds1302_read(ds1302_hr);
 t->hr=(var&0x70>>4)*10+(var&0x0f);
 var=ds1302_read(ds1302_date);
 t->date=(var&0x70>>4)*10+(var&0x0f);
 var=ds1302_read(ds1302_mon);
 t->mon=(var&0x70>>4)*10+(var&0x0f);
 var=ds1302_read(ds1302_day);
 t->day=(var&0x70>>4)*10+(var&0x0f);
 var=ds1302_read(ds1302_year);
 t->year=(var&0x70>>4)*10+(var&0x0f);
}

void date_to_format(struct _time *t)               //將日期數(shù)據(jù)轉(zhuǎn)化為日期格式并將數(shù)字轉(zhuǎn)為字符
{
 t->DateFormat[0] = t->year/10+'0';
 t->DateFormat[1] = t->year%10+'0';
 t->DateFormat[2] ='-';
 t->DateFormat[3] = t->mon/10+'0';
 t->DateFormat[4] = t->mon%10+'0';
 t->DateFormat[5] = '-';
 t->DateFormat[6] = t->date/10+'0';
 t->DateFormat[7] = t->date%10+'0';
 t->DateFormat[8] = '\0'; 
}

void time_to_format(struct _time *t)               //將時(shí)間數(shù)據(jù)轉(zhuǎn)化為時(shí)間格式并將數(shù)字轉(zhuǎn)為字符
{
 t->TimeFormat[0] = t->hr/10+'0';
 t->TimeFormat[1] = t->hr%10+'0';
 t->TimeFormat[2] =':';
 t->TimeFormat[3] = t->min/10+'0';
 t->TimeFormat[4] = t->min%10+'0';
 t->TimeFormat[5] = ':';
 t->TimeFormat[6] = t->sec/10+'0';
 t->TimeFormat[7] = t->sec%10+'0';
 t->TimeFormat[8] = '\0'; 
}
              //初始化啟動(dòng)時(shí)鐘
void ds1302_init()
{
 uchar second=ds1302_read(ds1302_sec);
 if(second&0x80)   
  set_time(ds1302_sec,0);
}

 

 

/****************程序lcd1602.h*************************/

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit lcd_rs=P2^0;
sbit lcd_rw=P2^1;
sbit lcd_e=P2^2;

sfr lcd_d=0x80;

void delay_ms(uint ms)
{
 uint x,y;
 for(x=ms;x>0;x--)
  for(y=120;y>0;y--);
}

void lcd_write_cmd(uchar cmd)
{
 lcd_rs=0;
 lcd_rw=0;
 lcd_e=0;
 lcd_d=cmd;
 lcd_e=1;
 delay_ms(1);
 lcd_e=0;
}

void lcd_write_dat(uchar dat)
{
 lcd_rs=1;
 lcd_rw=0;
 lcd_e=0;
 lcd_d=dat;
 lcd_e=1;
 delay_ms(1);
 lcd_e=0;
}

void lcd_init()
{
 lcd_write_cmd(0x38);
 delay_ms(1);
 lcd_write_cmd(0x01);
 delay_ms(1);
 lcd_write_cmd(0x0c);
 delay_ms(1);
 lcd_write_cmd(0x06);
 delay_ms(1);
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表