找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1839|回复: 1
打印 上一主题 下一主题
收起左侧

关于ds1302可调时钟仿真错误

[复制链接]
跳转到指定楼层
楼主
这是要仿真的程序,报错在定义体那里,不知道怎么修改。
#include<reg51.h>
#include "LCD1602.h"            //液晶显示器LCD1602头文件
#include "DS1302.h"                  //时钟/日历芯片DS1302头文件
#define uchar unsigned char
#define uint unsigned int
bit key_flag1=0,key_flag2=0;
SYSTEMTIME adjusted;                   // 此处为结构体定义
uchar sec_add=0,min_add=0,hou_add=0;
uchar day_add=0,mon_add=0,yea_add=0;
uchar data_alarm[7]={0};
int key_scan()                  // 函数功能:键盘扫描,判是否有键按下
{       
        int i=0;
          uint temp;
          P1=0xf0;
          temp=P1;
          if(temp!=0xf0)
          {i=1;}
          else
          {i=0;}
        return i;
}
uchar key_value()        //函数功能:获取按下的按键值
{
          uint m=0,n=0,temp;
          uchar value;
         uchar v[4][3]={'2','1','0','5','4','3','8','7','6','b','a','9'};
         P1=0xfe;temp=P1; if(temp!=0xfe)m=0;
        //采用分行、分列扫描的形式获取按键键值
P1=0xfd;temp=P1; if(temp!=0xfd)m=1;
  P1=0xfb;temp=P1; if(temp!=0xfb)m=2;
  P1=0xf7;temp=P1; if(temp!=0xf7)m=3;
  P1=0xef;temp=P1; if(temp!=0xef)n=0;
  P1=0xdf;temp=P1; if(temp!=0xdf)n=1;
  P1=0xbf;temp=P1; if(temp!=0xbf)n=2;
  value=v[m][n];
  return value;
}
void adjust(void)                        //函数功能:修改各参量
{
        if(key_scan()&&key_flag1)
          switch(key_value())
          {
            case '0':sec_add++;break;
            case '1':min_add++;break;
            case '2':hou_add++;break;
            case '3':day_add++;break;
        case '4':mon_add++;break;
            case '5':yea_add++;break;
        default: break;
}
adjusted.Second+=sec_add;
adjusted.Minute+=min_add;
adjusted.Hour+=hou_add;
adjusted.Day+=day_add;
adjusted.Month+=mon_add;
adjusted.Year+=yea_add;
if(adjusted.Second>59)       
{
                adjusted.Second=adjusted.Second%60;
                  adjusted.Minute++;
        }
        if(adjusted.Minute>59)       
        {
                  adjusted.Minute=adjusted.Minute%60;
                  adjusted.Hour++;
        }
        if(adjusted.Hour>23)               
        {
                  adjusted.Hour=adjusted.Hour%24;
                  adjusted.Day++;
        }
        if(adjusted.Day>31)               
                  adjusted.Day=adjusted.Day%31;
        if(adjusted.Month>12)               
                  adjusted.Month=adjusted.Month%12;
        if(adjusted.Year>100)               
                  adjusted.Year=adjusted.Year%100;
}
void changing(void) interrupt 0 using 0
//中断处理函数,修改参量,或修改确认
{
        if(key_flag1)
            key_flag1=0;       
          else
            key_flag1=1;
}
main()                //主函数
{
        uint i;
          uchar         p1[]="D:",p2[]="T:";
          SYSTEMTIME T;
        EA=1;
          EX0=1;
IT0=1;
        EA=1;
        EX1=1;
          IT1=1;
          init1602();
          Initial_DS1302() ;
while(1){       
                    write_com(0x80);
                    write_string(p1,2);
                    write_com(0xc0);
                    write_string(p2,2);
                    DS1302_GetTime(&T) ;
                    adjusted.Second=T.Second;
                    adjusted.Minute=T.Minute;
                adjusted.Hour=T.Hour;
                adjusted.Week=T.Week;
                adjusted.Day=T.Day;
        adjusted.Month=T.Month;
        adjusted.Year=T.Year;
        for(i=0;i<9;i++)
              {
                  adjusted.DateString[i]=T.DateString[i];
                  adjusted.TimeString[i]=T.TimeString[i];
            }
adjust();
                DateToStr(&adjusted);
                TimeToStr(&adjusted);
                write_com(0x82);
                    write_string(adjusted.DateString,8);
                    write_com(0xc2);
                    write_string(adjusted.TimeString,8);
                delay(10);
        }         
}

ds1302.h
#ifndef __DS1302_h__
#define __DS1302_h__

#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
//写指令宏定义地址
#define WRITE_SECOND 0x80//秒钟
#define WRITE_MINUTE 0x82//分钟
#define WRITE_HOUR 0x84//小时
#define WRITE_DATE 0x86//日
#define WRITE_MONTH 0x88//月
#define WRITE_WEEK 0x8a//星期
#define WRITE_YEAR 0x8c//年
//读指令宏定义地址
#define READ_SECOND 0x81//秒钟
#define READ_MINUTE 0x83//分钟
#define READ_HOUR 0x85//小时
#define READ_DATE 0x87//日
#define READ_MONTH 0x89//月
#define READ_WEEK 0x8b//星期
#define READ_YEAR 0x8d//年
//读写保护宏定义地址
#define WRITE_PROTECT 0x8E//写保护

uchar data tab[]={"0123456789"};
char *p;//定义一个指针处理星期字符串

//位寻址寄存器定义
sbit ACC_7 = ACC^7;
//管脚定义
sbit SCLK = P2^0; // DS1302时钟信号7脚
sbit DIO= P2^1; // DS1302数据信号6脚
sbit CE = P2^2; // DS1302片选5脚

uchar second,minute,hour;//时分秒
uint second_1,second_0,minute_1,miunte_0,hour_1,hour_0;
uchar week;//星期
uchar date,month,year;//年月日
uint date_1,date_0,month_1,month_0,year_1,year_0;

/**************************地址、数据发送子程序*************************/
void Write1302 ( unsigned char addr,dat )//写子程序
{
unsigned char i,temp;
CE=0; //CE引脚为低,数据传送中止
SCLK=0; //清零时钟总线
CE = 1; //CE引脚为高,逻辑控制有效
//发送地址
for ( i=8; i>0; i-- ) //循环8次移位
  {
  SCLK = 0;
  temp = addr;
  DIO = (bit)(temp&0x01); //每次传输低字节
  addr >>= 1; //右移一位
  SCLK = 1;
  }
//发送数据
for ( i=8; i>0; i-- )
  {
  SCLK = 0;
  temp = dat;
  DIO = (bit)(temp&0x01);
  dat >>= 1;
  SCLK = 1;
  }
CE = 0;
}

/****************************数据读取子程序********************************/
unsigned char Read1302 ( unsigned char addr )//读子程序
{
unsigned char i,temp,dat1,dat2;
CE=0;
SCLK=0;
CE = 1;
//发送地址
for ( i=8; i>0; i-- ) //循环8次移位
  {
  SCLK = 0;
  temp = addr;
  DIO = (bit)(temp&0x01); //每次传输低字节
  addr >>= 1; //右移一位
  SCLK = 1;
  }
//读取数据
for ( i=8; i>0; i-- )
  {
  ACC_7=DIO;
  SCLK = 1;
  ACC>>=1;
  SCLK = 0;
  }
CE=0;
dat1=ACC;
dat2=dat1/16; //数据进制转换
dat1=dat1%16; //十六进制转十进制
dat1=dat1+dat2*10;
return (dat1);
}

/*******************************初始化DS1302***********************************/
void Initial(void)//上电初始化化模块2010年12月26号22点10分00秒星期日
{
Write1302 (WRITE_PROTECT,0X00); //禁止写保护
Write1302 (WRITE_SECOND,0x30); //秒位初始化
Write1302 (WRITE_MINUTE,0x59); //分钟初始化
Write1302 (WRITE_HOUR,0x23); //小时初始化,默认24小时制
Write1302 (WRITE_DATE,0x26); //日期初始化
Write1302 (WRITE_MONTH,0x12); //月初始化
Write1302 (WRITE_WEEK,0x07); //星期初始化,01-07
Write1302 (WRITE_YEAR,0x10); //年初始化00-99
Write1302 (WRITE_PROTECT,0x80); //允许写保护
}

/*******************************校时初始化*************************************/
/*void correct()//校时模块
{
Write1302 (WRITE_PROTECT,0X00); //禁止写保护
Write1302 (WRITE_SECOND,0x00); //秒位初始化
Write1302 (WRITE_MINUTE,0x30); //分钟初始化
Write1302 (WRITE_HOUR,0x21); //小时初始化,默认24小时制
Write1302 (WRITE_DATE,0x26); //日期初始化
Write1302 (WRITE_MONTH,0x12); //月初始化
Write1302 (WRITE_WEEK,0x07); //星期初始化,01-07
Write1302 (WRITE_YEAR,0x10); //年初始化00-99
Write1302 (WRITE_PROTECT,0x80); //允许写保护
}
/*******************************星期转化程序***********************************/
void week_c()//星期转化
{
char *pp;//定义一个局部指针
switch(week)
{
  case 1:pp="Mon 1";break;
  case 2:pp="Tue 2";break;
  case 3:pp="Wed 3";break;
  case 4:pp="Tur 4";break;
  case 5:pp="Fri 5";break;
  case 6:pp="Sat 6";break;
  case 7:pp="Sun 7";break;
  default:pp="error";break;
}
p=pp;//函数地址赋值
}
/*******************************数据刷新DS1302*********************************/
void freshtime()//读取时间
{
second=Read1302 (READ_SECOND);//读取十进制数
minute=Read1302 (READ_MINUTE);
hour=Read1302 (READ_HOUR);
date=Read1302 (READ_DATE);
month=Read1302 (READ_MONTH);
week=Read1302 (READ_WEEK);
year=Read1302 (READ_YEAR);

second_1=second/10;//高位赋值
second_0=second-second_1*10;//低位赋值
minute_1=minute/10;
miunte_0=minute-minute_1*10;
hour_1=hour/10;
hour_0=hour-hour_1*10;
date_1=date/10;
date_0=date-date_1*10;
month_1=month/10;
month_0=month-month_1*10;
year_1=year/10;
year_0=year-year_1*10;
}

#endif

lcd1602.h
#ifndef LCD_CHAR_1602_2005_4_9
#define LCD_CHAR_1602_2005_4_9
#define uchar unsigned char
#define uint unsigned int

sbit lcdrs = P2^0;
sbit lcdrw = P2^1;
sbit lcden = P2^2;
void delay (uint z)             //延时函数,11.0592MHZ
{
   uint x,y;
   for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}

void write_com(uchar com)       //写入命令数据到LCD
{
  lcdrw =0;
  lcdrs =0;
  P0=com;
  delay(5);
  lcden=1;
  delay(5);
  lcden=0;
}

void write_data(uchar date)      //写入字符显示数据到LCD
{
  lcdrw =0;
  lcdrs =1;
  P0=date;
  delay(5);
  lcden=1;
  delay(5);
  lcden=0;
}

void init1602()               //LCD1602初始化设定
{
  lcdrw=0;
  lcden=0;
  write_com(0x3c);
  write_com(0x0c);
  write_com(0x06);
  write_com(0x01);
  write_com(0x80);
}

void write_string(uchar *pp,uint n)     //采用指针的方法输入字符,n为字符数目
{
          int i;
          for(i=0;i<n;i++)
          write_data(pp[i]);
}

void write_sfm(uchar add, uchar date)     //向指定地址写入数据
{
    uchar shi, ge;
    shi = date / 10;
    ge = date % 10;
    write_com(0x80 + add);
    write_data(0x30 + shi);
    write_data(0x30 + ge);
}
#endif


H}]~AJ0%V%PSE2`[DJ7VW%3.png (203.48 KB, 下载次数: 26)

H}]~AJ0%V%PSE2`[DJ7VW%3.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:694965 发表于 2020-5-27 23:13 | 只看该作者
compiling zuoy.c...
zuoy.c(7): error C129: missing ';' before 'adjusted'
目标未创建
报错问题式这个
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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