单片机汇编语言实现实时时钟,不知道我的哪里出错了,请大家帮忙看看

单片机汇编语言实现实时时钟,不知道我的哪里出错了,请大家帮忙看看,第1张

形式的程序,不便于看,以及修改。

程序太长,也可以放在你的百度空间,大家去看。

---------

程序,重新写了,放在:

>

仿真运行截图:

顶层文件 万年历C

#include<reg51h>

#include "LCD1602h"

#include "DS1302h"

#define uchar unsigned char

#define uint unsigned int

sbit speaker=P2^4;

bit key_flag1=0,key_flag2=0;

SYSTEMTIME adjusted;

uchar sec_add=0,min_add=0,hou_add=0,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 naoling(void)

{

uchar i=0,l=0,j;

init1602();

while(key_flag2&&i<12)

if(key_scan()){j=key_value();write_data(j);if(i%2==0)data_alarm[l]=(j-'0')10;else {data_alarm[l]+=(j-'0');l++;}i++;delay(600);}

write_com(0x01);

}

uchar according(void)

{ uchar k;

if(data_alarm[0]==adjustedYear&&data_alarm[1]==adjustedMonth&&data_alarm[2]==adjustedDay&&data_alarm[3]==adjustedHour&&data_alarm[4]==adjustedMinute&&data_alarm[5]==adjustedSecond)

k=1;

else k=0;

return k;

}

void speak(void)

{uint i=50;

while(i)

{speaker=0;

delay(1);

speaker=1;

delay(1);

i--;

}

}

void alarm(void)

{uint i=10;

while(i)

{

speak();

delay(10);

i--;

}

}

/修改时间 *** 作/

void reset(void)

{

sec_add=0;

min_add=0;

hou_add=0;

day_add=0;

mon_add=0;

yea_add=0 ;

}

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;

case 'b':reset();break;

default: break;

}

adjustedSecond+=sec_add;

adjustedMinute+=min_add;

adjustedHour+=hou_add;

adjustedDay+=day_add;

adjustedMonth+=mon_add;

adjustedYear+=yea_add;

if(adjustedSecond>59) adjustedSecond=adjustedSecond%60;

if(adjustedMinute>59) adjustedMinute=adjustedMinute%60;

if(adjustedHour>23) adjustedHour=adjustedHour%24;

if(adjustedDay>31) adjustedDay=adjustedDay%31;

if(adjustedMonth>12) adjustedMonth=adjustedMonth%12;

if(adjustedYear>100) adjustedYear=adjustedYear%100;

}

/中断处理函数/

void changing(void) interrupt 0 using 0 //需要修改时间和日期,或者停止修改

{

if(key_flag1)key_flag1=0;

else key_flag1=1;

}

void alarming(void) interrupt 3 using 0 //需要设置闹铃或者停止设置

{

if(key_flag2)key_flag2=0;

else key_flag2=1;

}

/主函数/

main()

{uint i;

uchar l;

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) ;

adjustedSecond=TSecond;

adjustedMinute=TMinute;

adjustedHour=THour;

adjustedWeek=TWeek;

adjustedDay=TDay;

adjustedMonth=TMonth;

adjustedYear=TYear;

for(i=0;i<9;i++)

{

adjustedDateString[i]=TDateString[i];

adjustedTimeString[i]=TTimeString[i];

}

adjust();

if(key_flag2)naoling();

if(according())alarm();

DateToStr(&adjusted);

TimeToStr(&adjusted);

write_com(0x82);

write_string(adjustedDateString,8);

write_com(0xc2);

write_string(adjustedTimeString,8);

delay(10);

}

(二)头文件1 显示模块 LCD1602H

#ifndef LCD_CHAR_1602_2009_5_9

#define LCD_CHAR_1602_2009_5_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) // 延时

{

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() // 初始化设定

{

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)

{

int i;

for(i=0;i<n;i++)

write_data(pp[i]);

}

#endif

(三)头文件2 时钟模块 DS1302H

#ifndef _REAL_TIMER_DS1302_2009_5_20_

#define _REAL_TIMER_DS1302_2003_5_20_

sbit DS1302_CLK = P2^6; //实时时钟时钟线引脚

sbit DS1302_IO = P2^7; //实时时钟数据线引脚

sbit DS1302_RST = P2^5; //实时时钟复位线引脚

sbit ACC0 = ACC^0;

sbit ACC7 = ACC^7;

typedef struct SYSTEM_TIME

{

unsigned char Second;

unsigned char Minute;

unsigned char Hour;

unsigned char Week;

unsigned char Day;

unsigned char Month;

unsigned char Year;

unsigned char DateString[9]; //用这两个字符串来放置读取的时间

unsigned char TimeString[9];

}SYSTEMTIME; //定义的时间类型

#define AM(X) X

#define PM(X) (X+12) // 转成24小时制

#define DS1302_SECOND 0x80

#define DS1302_MINUTE 0x82

#define DS1302_HOUR 0x84

#define DS1302_WEEK 0x8A

#define DS1302_DAY 0x86

#define DS1302_MONTH 0x88

#define DS1302_YEAR 0x8C

#define DS1302_RAM(X) (0xC0+(X)2) //用于计算 DS1302_RAM 地址的宏

/内部指令/

void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)

{

unsigned char i;

ACC = d;

for(i=8; i>0; i--)

{

DS1302_IO = ACC0;

DS1302_CLK = 1;

DS1302_CLK = 0;

ACC = ACC >> 1; //因为在前面已经定义了ACC0 = ACC^0;以便再次利用DS1302_IO = ACC0;

}

}

unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)

{

unsigned char i;

for(i=8; i>0; i--)

{

ACC = ACC >>1;

ACC7 = DS1302_IO;

DS1302_CLK = 1;

DS1302_CLK = 0;

}

return(ACC);

}

//

void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据

{

DS1302_RST = 0;

DS1302_CLK = 0;

DS1302_RST = 1;

DS1302InputByte(ucAddr); // 地址,命令

DS1302InputByte(ucDa); // 写1Byte数据

DS1302_CLK = 1;

DS1302_RST = 0;

}

unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据

{

unsigned char ucData;

DS1302_RST = 0;

DS1302_CLK = 0;

DS1302_RST = 1;

DS1302InputByte(ucAddr|0x01); // 地址,命令

ucData = DS1302OutputByte(); // 读1Byte数据

DS1302_CLK = 1;

DS1302_RST = 0;

return(ucData);

}

void DS1302_SetProtect(bit flag) //是否写保护

{

if(flag)

Write1302(0x8E,0x10);

else

Write1302(0x8E,0x00);

}

void DS1302_SetTime(unsigned char Address, unsigned char Value) // 设置时间函数

{

DS1302_SetProtect(0);

Write1302(Address, ((Value/10)<<4 | (Value%10))); //将十进制数转换为BCD码

} //在DS1302中的与日历、时钟相关的寄存器存放的数据必须为BCD码形式

void DS1302_GetTime(SYSTEMTIME Time)

{

unsigned char ReadValue;

ReadValue = Read1302(DS1302_SECOND);

Time->Second = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F); //将BCD码转换为十进制数

ReadValue = Read1302(DS1302_MINUTE);

Time->Minute = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_HOUR);

Time->Hour = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_DAY);

Time->Day = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_WEEK);

Time->Week = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_MONTH);

Time->Month = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_YEAR);

Time->Year = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);

}

unsigned char DataToBCD(SYSTEMTIME Time)

{

unsigned char D[8];

D[0]=Time->Second/10<<4+Time->Second%10;

D[1]=Time->Minute/10<<4+Time->Minute%10;

D[2]=Time->Hour/10<<4+Time->Hour%10;

D[3]=Time->Day/10<<4+Time->Day%10;

D[4]=Time->Month/10<<4+Time->Month%10;

D[5]=Time->Week/10<<4+Time->Week%10;

D[6]=Time->Year/10<<4+Time->Year%10;

return D;

}

void DateToStr(SYSTEMTIME Time)

{

//将十进制数转换为液晶显示的ASCII值

Time->DateString[0] = Time->Year/10 + '0';

Time->DateString[1] = Time->Year%10 + '0';

Time->DateString[2] = '-';

Time->DateString[3] = Time->Month/10 + '0';

Time->DateString[4] = Time->Month%10 + '0';

Time->DateString[5] = '-';

Time->DateString[6] = Time->Day/10 + '0';

Time->DateString[7] = Time->Day%10 + '0';

Time->DateString[8] = '\0';

}

void TimeToStr(SYSTEMTIME Time)

{

//将十进制数转换为液晶显示的ASCII值

Time->TimeString[0] = Time->Hour/10 + '0';

Time->TimeString[1] = Time->Hour%10 + '0';

Time->TimeString[2] = ':';

Time->TimeString[3] = Time->Minute/10 + '0';

Time->TimeString[4] = Time->Minute%10 + '0';

Time->TimeString[5] = ':';

Time->TimeString[6] = Time->Second/10 + '0';

Time->TimeString[7] = Time->Second%10 + '0';

Time->DateString[8] = '\0';

}

void Initial_DS1302(void)

{

unsigned char Second;

Second=Read1302(DS1302_SECOND);

if(Second&0x80) //初始化时间

DS1302_SetTime(DS1302_SECOND,0);

}

void DS1302_TimeStop(bit flag) // 是否将时钟停止

{

unsigned char Data;

Data=Read1302(DS1302_SECOND);

DS1302_SetProtect(0);

if(flag)

Write1302(DS1302_SECOND, Data|0x80);

else

Write1302(DS1302_SECOND, Data&0x7F);

}

#endif

实时的话肯定要用DS1302了,给你发个吧,用STC89c52写的:

#include<reg52h>

#include<intrinsh>

#define uchar unsigned char

//引脚定义

sbit TIMERCLK=P3^2; //DS1302同步串行时钟引脚

sbit TIMERIO=P3^3; //DS1302数据输入输出引脚

sbit TIMERRST=P3^4; //DS1302RST引脚

sbit P2_0=P2^0;

sbit P2_1=P2^1;

sbit P2_2=P2^2;

sbit P2_3=P2^3;

sbit P2_4=P2^4;

sbit P2_5=P2^5;

sbit P2_6=P2^6;

sbit P2_7=P2^7;

sbit P3_5=P3^5;

sbit P3_6=P3^6;

sbit P3_7=P3^7;

//sbit SEC_7=SEC^7;

//sbit WDT=P1^3; //看门狗"喂狗"引脚

uchar code TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//#define DIGPORT

//全局变量声明

uchar bdata DS1302dat; //DS1302读写过程中的命令或数据

sbit ds1302datHbit=DS1302dat^7; //位定义,用于数据写入

sbit ds1302datBit=DS1302dat^0; //位定义,用于数据读出

uchar bdata DS1302adr; //DS1302读写过程中所访问的单元地址

sbit ds1302adrBit=DS1302adr^0; //

uchar idata SEC;

uchar MIN;

uchar HR;

uchar DATE;

uchar MONTH;

uchar DAY;

uchar YEAR;

uchar disp1;

uchar disp2;

uchar disp3;

uchar disp4;

uchar disp5;

uchar disp6;

uchar disp7;

uchar disp8;

uchar tiao;

uchar tt;

uchar flag;

// sbit SEC_7=SEC^7;

void delay(uchar time)

{

uchar i,j;

for(i=0;i<time;i++)

{

for(j=0;j<time;j++)

{

// WDT=~WDT;

}

}

}

void writeDS1302(uchar dsRamAdr,uchar ds1302data)

{

uchar i;

TIMERCLK=0;

delay(2);

TIMERRST=1;

delay(2);

DS1302adr=dsRamAdr;

DS1302dat=ds1302data;

for(i=0;i<8;i++)

{

CY=0;

TIMERCLK=0;

CY=ds1302adrBit;

TIMERIO=CY;

delay(2);

TIMERCLK=1;

DS1302adr=DS1302adr>>1;

}

for(i=0;i<8;i++)

{

CY=0;

TIMERCLK=0;

CY=ds1302datBit;

TIMERIO=CY;

delay(2);

TIMERCLK=1;

DS1302dat=DS1302dat>>1;

}

TIMERRST=0;

delay(2);

TIMERRST=0;

}

uchar readDS1302(uchar DS1302Adr)

{

uchar i;

TIMERCLK=0;

delay(2);

TIMERRST=1;

delay(2);

DS1302adr=DS1302Adr;

for(i=0;i<8;i++)

{

TIMERCLK=0;

TIMERIO=ds1302adrBit;

delay(2);

TIMERCLK=1;

DS1302adr=DS1302adr>>1;

}

TIMERIO=1;

for(i=0;i<7;i++)

{

TIMERCLK=0;

ds1302datHbit=TIMERIO;

delay(2);

TIMERCLK=1;

DS1302dat=DS1302dat>>1;

TIMERCLK=0;

ds1302datHbit=TIMERIO;

}

TIMERRST=0;

delay(2);

TIMERCLK=0;

return DS1302dat;

}

void DS1302Inital(void)

{

uchar ds1302st;

TIMERCLK=0;

TIMERRST=0;

ds1302st=readDS1302(0x0c1);

if(ds1302st!=0x55)

{

writeDS1302(0x8e,0x00);

//writeDS1302(0x80,0x00);

writeDS1302(0x82,0x00);

writeDS1302(0x84,0x16);

writeDS1302(0x86,0x19);

writeDS1302(0x88,0x09);

writeDS1302(0x8a,0x02);

writeDS1302(0x8c,0x00);

writeDS1302(0x90,0xa6);

writeDS1302(0x0c0,0x55);

writeDS1302(0x80,0x00);

}

}

void readRTC(void)

{

MONTH=readDS1302(0x89);

DATE=readDS1302(0x87);

HR=readDS1302(0x85);

MIN=readDS1302(0x83);

SEC=readDS1302(0x81);

}

void disp(void)

{

if(MIN==10)writeDS1302(0x82,0x10);

if(MIN==26)writeDS1302(0x82,0x20);

if(MIN==42)writeDS1302(0x82,0x30);

if(MIN==58)writeDS1302(0x82,0x40);

if(MIN==74)writeDS1302(0x82,0x50);

if(MIN==90)writeDS1302(0x82,0x00);

if(HR==10)writeDS1302(0x84,0x10);

if(HR==26)writeDS1302(0x84,0x20);

if(HR==36)writeDS1302(0x84,0x00);

//if(HR==58)writeDS1302(0x82,0x40);

//if(HR==74)writeDS1302(0x82,0x50);

//if(HR==90)writeDS1302(0x82,0x00);

if(DATE==10)writeDS1302(0x86,0x10);

if(DATE==26)writeDS1302(0x86,0x20);

if(DATE==42)writeDS1302(0x86,0x30);

if(DATE==50)writeDS1302(0x86,0x01);

//if(DATE==74)writeDS1302(0x82,0x50);

//if(DATE==90)writeDS1302(0x82,0x00);

disp2=SEC/16;

disp1=SEC%16;

//if(flag1==0)

//if(MIN==10||MIN==26||MIN==42||MIN==58||MIN==74){MIN=MIN+6;}

disp4=MIN/16;

disp3=MIN%16;//flag1=0;

disp6=HR/16;

disp5=HR%16;

disp8=DATE/16;

disp7=DATE%16;

P2_0=0;

P0=TABLE[disp1];

delay(12);

P2_0=1;

P2_1=0;

P0=TABLE[disp2];

delay(12);

P2_1=1;

P2_2=0;

P0=TABLE[disp3];

delay(12);

P2_2=1;

P2_3=0;

P0=TABLE[disp4];

delay(12);

P2_3=1;

P2_4=0;

P0=TABLE[disp5];

delay(12);

P2_4=1;

P2_5=0;

P0=TABLE[disp6];

delay(12);

P2_5=1;

P2_6=0;

P0=TABLE[disp7];

delay(12);

P2_6=1;

P2_7=0;

P0=TABLE[disp8];

delay(12);

P2_7=1;

}

void dispA(void)

{

if(SEC==10||SEC==26||SEC==42||SEC==58||SEC==74){SEC=SEC+6;}

//if(SEC==74||SEC==58||SEC==42||SEC==26||SEC==10){SEC=SEC+6;}

disp2=SEC/16;

disp1=SEC%16;

//disp4=MIN/16;

//disp3=MIN%16;

//disp6=HR/16;

//disp5=HR%16;

//disp8=DATE/16;

//disp7=DATE%16;

if(SEC==90)SEC=0;

P2_0=0;

P0=TABLE[disp1];

delay(12);

P2_0=1;

P2_1=0;

P0=TABLE[disp2];

delay(12);

P2_1=1;

P2_2=0;

P0=TABLE[disp3];

delay(5);

P2_2=1;

P2_3=0;

P0=TABLE[disp4];

delay(5);

P2_3=1;

P2_4=0;

P0=TABLE[disp5];

delay(5);

P2_4=1;

P2_5=0;

P0=TABLE[disp6];

delay(5);

P2_5=1;

P2_6=0;

P0=TABLE[disp7];

delay(5);

P2_6=1;

P2_7=0;

P0=TABLE[disp8];

delay(5);

P2_7=1;

}

void dispB(void)

{

if(MIN==10||MIN==26||MIN==42||MIN==58||MIN==74){MIN=MIN+6;}

//if(MIN==74||MIN==58||MIN==42||MIN==26||MIN==10){MIN=MIN+6;}

//disp2=SEC/16;

//disp1=SEC%16;

disp4=MIN/16;

disp3=MIN%16;

//disp6=HR/16;

//disp5=HR%16;

//disp8=DATE/16;

//disp7=DATE%16;

if(MIN==90)MIN=0;

P2_0=0;

P0=TABLE[disp1];

delay(5);

P2_0=1;

P2_1=0;

P0=TABLE[disp2];

delay(5);

P2_1=1;

P2_2=0;

P0=TABLE[disp3];

delay(12);

P2_2=1;

P2_3=0;

P0=TABLE[disp4];

delay(12);

P2_3=1;

P2_4=0;

P0=TABLE[disp5];

delay(5);

P2_4=1;

P2_5=0;

P0=TABLE[disp6];

delay(5);

P2_5=1;

P2_6=0;

P0=TABLE[disp7];

delay(5);

P2_6=1;

P2_7=0;

P0=TABLE[disp8];

delay(5);

P2_7=1;

}

void dispC(void)

{

if(HR==10||HR==26||HR==42||HR==58||HR==74){HR=HR+6;}

//if(HR==74||HR==58||HR==42||HR==26||HR==10){HR=HR+6;}

//disp2=SEC/16;

//disp1=SEC%16;

//disp4=MIN/16;

//disp3=MIN%16;

disp6=HR/16;

disp5=HR%16;

if(HR==36)HR=0;

//disp8=DATE/16;

//disp7=DATE%16;

P2_0=0;

P0=TABLE[disp1];

delay(5);

P2_0=1;

P2_1=0;

P0=TABLE[disp2];

delay(5);

P2_1=1;

P2_2=0;

P0=TABLE[disp3];

delay(5);

P2_2=1;

P2_3=0;

P0=TABLE[disp4];

delay(5);

P2_3=1;

P2_4=0;

P0=TABLE[disp5];

delay(12);

P2_4=1;

P2_5=0;

P0=TABLE[disp6];

delay(12);

P2_5=1;

P2_6=0;

P0=TABLE[disp7];

delay(5);

P2_6=1;

P2_7=0;

P0=TABLE[disp8];

delay(5);

P2_7=1;

}

void dispD(void)

{

if(DATE==10||DATE==26||DATE==42||DATE==58||DATE==74){DATE=DATE+6;}

//if(DATE==74||DATE==58||DATE==42||DATE==26||DATE==10){DATE=DATE+6;}

//disp2=SEC/16;

//disp1=SEC%16;

//disp4=MIN/16;

//disp3=MIN%16;

//disp6=HR/16;

//disp5=HR%16;

disp8=DATE/16;

disp7=DATE%16;

if(DATE==50)DATE=1;

P2_0=0;

P0=TABLE[disp1];

delay(5);

P2_0=1;

P2_1=0;

P0=TABLE[disp2];

delay(5);

P2_1=1;

P2_2=0;

P0=TABLE[disp3];

delay(5);

P2_2=1;

P2_3=0;

P0=TABLE[disp4];

delay(5);

P2_3=1;

P2_4=0;

P0=TABLE[disp5];

delay(5);

P2_4=1;

P2_5=0;

P0=TABLE[disp6];

delay(5);

P2_5=1;

P2_6=0;

P0=TABLE[disp7];

delay(12);

P2_6=1;

P2_7=0;

P0=TABLE[disp8];

delay(12);

P2_7=1;

}

void main(void)

{

DS1302Inital();

while(1)

{

readRTC();

disp();

tt=0;

flag=0;

tiao=0;

while(P3_7==0||tt==1)

{

tt=1;

if(flag==0)

{

tiao++;

flag=1;

}

if(tiao==1)

{

while(P3_7==0);

dispA();

if(P3_6==0)

{

while(P3_6==0);

writeDS1302(0x80,++SEC);

}

if(P3_5==0)

{

while(P3_5==0);

writeDS1302(0x80,--SEC);

}

if(P3_7==0)

flag=0;

}

if(tiao==2)

{

while(P3_7==0);

dispB();

if(P3_6==0)

{

while(P3_6==0);

writeDS1302(0x82,++MIN);

}

if(P3_5==0)

{

while(P3_5==0);

writeDS1302(0x82,--MIN);

}

if(P3_7==0)

flag=0;

}

if(tiao==3)

{

while(P3_7==0);

dispC();

if(P3_6==0)

{

while(P3_6==0);

writeDS1302(0x84,++HR);

}

if(P3_5==0)

{

while(P3_5==0);

writeDS1302(0x84,--HR);

}

if(P3_7==0)

flag=0;

}

if(tiao==4)

{

while(P3_7==0);

dispD();

if(P3_6==0)

{

while(P3_6==0);

writeDS1302(0x86,++DATE);

}

if(P3_5==0)

{

while(P3_5==0);

writeDS1302(0x86,--DATE);

}

if(P3_7==0)

flag=0;

}

if(tiao==5)

tt=0;

}

}

}

你自己用keil软件调就行了!

无论是对DS1302写还是读 *** 作, *** 作时RST必须置"1";CLK和DAT的时序非常类似于I2C总线 *** 作,CLK是串行通讯的时钟信号,由单片机提供,DAT为双向数据信号,具体时序需参考DS1302编写。

以上就是关于单片机汇编语言实现实时时钟,不知道我的哪里出错了,请大家帮忙看看全部的内容,包括:单片机汇编语言实现实时时钟,不知道我的哪里出错了,请大家帮忙看看、跪求 51单片机+12864液晶+1302时钟制成的万年历c程序、求单片机 实时时钟 电路 图和配套代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zz/9351376.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存