用89C51单片机设计一个系统,编写程序,使系统运行后后自动显示时、分、秒 ,通过按键能修改时间(+键或-键)

邮箱86895292@qq.com... 邮箱86895292@qq.com 展开
 我来答
jinme306
2012-05-22 · TA获得超过143个赞
知道答主
回答量:109
采纳率:0%
帮助的人:62.2万
展开全部
//单片机是STC89C51
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define burst_write 0xBE
#define burst_read 0xBF
#define protect_write 0x8E
#define protect_read 0x8F
#define second_write 0x80
#define ch_on 0
#define ch_off 1
#define wp_on 0
#define wp_off 1

sbit ge=P2^0;
sbit shi=P2^1;
sbit bai=P2^2;
sbit qian=P2^3;
sbit htsclk=P3^0;
sbit htrst=P3^5;
sbit htio=P3^1;
uchar httime[]={0x00,0x35,0x11,0x15,0x04,0x01,0x10,0x00};
//数组定义时间00:00:00 12日4月星期一10年
code uchar time11[]={0x0c0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//七段共阳数显数据
uchar *htp,number1,ge_data,shi_data,bai_data,qian_data;
uchar xian_s;
unsigned int data1111;
uchar shi1,fen,ri,yue;
void
ht_burst_transfer( uchar command, uchar* htp );

/**********************************
延时程序
**********************************/
void yanshi(uchar ms)
{
uchar a,b;
for(;ms>0;ms--)
{
for(a=50;a>0;a--)
for(b=50;b>0;b--);
}
}

/************************************
定时器初始化程序0.5ms初始值
************************************/
void inittimer0()
{
TMOD = 0x01;
TH0 = 0x15;
TL0 = 0x0A0;
EA = 1;
ET0 = 1;
TR0 = 1;
}

/*************************************
写HT1380或1381 8位
*************************************/
void writeht(uchar htdata)
{
uchar i1;
htrst=1;
for ( i1 = 8; i1 != 0; i1-- )
{
if (htdata & 0x01 )
{
htio=1;
}
else
{
htio=0;
}
_nop_();
htsclk=1; //0-->1 write
_nop_();
htsclk=0;
htdata >>= 1;
}
htrst=0;
}

void
ht_ch_onoff( bit ch_onoff )//Clock Halt Ctronl
{
writeht(second_write); //写秒造成上电时间走慢问题,但首次写入必须写秒
if ( ch_onoff ) //clock off
{
writeht( httime[0] | 0x80 );
}
else //clock on
{
writeht( httime[0] & 0x7F );
}
}

void
ht_wp_onoff( bit wp_onoff )//Write Protect Ctronl
{
writeht( protect_write );
if ( wp_onoff ) //register data can not be writed
{
writeht( 0x80 );
}
else //register data can be writed
{
writeht( 0x00 );
}
}

/**************************************
Ht1380或1381初始化程序
**************************************/
void initht(void)
{
htio=0;
htrst=0;
htsclk=0;
yanshi(50);
ht_ch_onoff( 0 );
_nop_();_nop_();
ht_wp_onoff( 0 );

ht_burst_transfer( burst_write, httime );

}

/***************************************
向HT1380或1381读1个8位数据
****************************************/
readht(void)
{
uchar i1,htdata;
htrst=1;
htdata=0x00;
for(i1=8;i1>0;i1--)
{
htdata>>=1;
htsclk=1;
if(htio==1)
{
htdata=htdata|0x80;
}
else
{
htdata=htdata&0x7f;
}
_nop_();
htsclk=0;
}
htrst=0;
return(htdata);
}

void
ht_burst_transfer( uchar command, uchar* htp )
{
uchar i;

writeht( command );
if ( command & 0x01 ) //burst read
{
for ( i = 8; i != 0; i-- )
{
*htp = readht();
htp++;
}
}
else //burst write
{
for ( i = 8; i != 0; i-- )
{
writeht( *htp++ );
}
}
}
/********************************************
数码管显示程序
********************************************/
void xianshi(uchar fen,shi1,ri,yue)

{

if(xian_s>4)
{
ge_data=ri & 0x0f;
shi_data=(ri & 0xf0)>>4;
bai_data=yue & 0x0f;
qian_data=(yue & 0xf0)>>4;
}
else
{
ge_data=fen & 0x0f;
shi_data=(fen & 0xf0)>>4;
bai_data=shi1 & 0x0f;
qian_data=(shi1 & 0xf0)>>4;
}
if(number1>12&&xian_s<5)
{
P1=time11[ge_data]-0x80;
}
else
{
P1=time11[ge_data];
}
ge=0;
yanshi(5);
ge=1;

if(number1>12&&xian_s<5)
{
P1=time11[shi_data]-0x80;
}
else
{
P1=time11[shi_data];
}
shi=0;
yanshi(5);
shi=1;

P1=time11[bai_data];
bai=0;
yanshi(5);
bai=1;

P1=time11[qian_data];
if(qian_data==0)
{qian=1;}
else
{qian=0;}
yanshi(5);
qian=1;

}

/*******************************************
主程序
*******************************************/
main()
{
xian_s=0;
number1=0;
initht();
inittimer0();
while(1)
{
if(number1==12)
{
ht_burst_transfer( burst_read, httime ) ;
shi1 = httime[2];
fen = httime[1];
ri=httime[3];
yue=httime[4];
}
if(number1>24)
{
number1=0;
xian_s++;
if(xian_s>5)
xian_s=0;
}

xianshi(fen,shi1,ri,yue);
}
}

/*********************************************
0.5ms定时中断程序
*********************************************/
void time0(void) interrupt 1
{
TH0=0x15;
TL0=0x0A0;
number1++;

}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友9588577
2012-05-22 · 超过52用户采纳过TA的回答
知道答主
回答量:323
采纳率:100%
帮助的人:135万
展开全部
000
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gurong60
2012-05-22 · TA获得超过300个赞
知道小有建树答主
回答量:229
采纳率:0%
帮助的人:235万
展开全部
这么简单的程序,怎么不自己做?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式