|
這是要仿真的程序,報錯在定義體那里,不知道怎么修改。
#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
|
|