赞助论坛
  • 7277阅读
  • 0回复

谁帮我编译一下AT89C2051电子钟C代码编成HEX [复制链接]

楼层直达
华锋  
发帖
69
精华
0
金币
156
威望
2
贡献
0
好评
1
注册
2008-11-19
楼主    华锋 发表于: 2010-11-23 18:54:35 
下面是代码:
/***************************************/
//clock.c
//单片机电子钟C语言程序 XSCLK V1.0
//MCU:AT89C2051 晶振频率:12MHZ
/***************************************/
#include <at89x51.h>       //头文件包含
           
#define uchar unsigned char     //宏定义
#define uint unsigned int

#define ON 0         //定义0为打开
#define OFF 1         //定义1为关闭
#define LEDBus P1         //定义p1口为数码管段码口

sbit MIAO =P1^2;         //秒点
sbit HOU_S=P3^0;         //时十位位选
sbit HOU_G=P3^1;         //时个位位选
sbit MIN_S=P3^2;         //分十位位选
sbit MIN_G=P3^3;         //分个位位选
sbit H_KEY=P3^4;         //时调整键
sbit M_KEY=P3^5;         //分调整键
bit SHAN;           //闪烁标志位

uchar second,minute,hour;     //定义秒、分、时寄存器

uchar code LEDTab[]={0x14,0xd7,0x4c, //数码管段码表0--9
0x45,0x87,0x25,0x24,0x57,0x04,0x05};

void delay(uchar t);       //延时函数
void init();         //初始化函数
void display();         //显示函数
void min_tiao();         //分调整函数
void hou_tiao();         //时调整函数
/***************************************
函 数 名:main
功   能:主函数
说   明:
入口参数:无
返 回 值:无
****************************************/
void main()
{
init();           //调用初始化函数
while(1)           //主程序循环
{
if(!H_KEY) hou_tiao();     //如果时调整键按下(为0),调用时调整函数
if(!M_KEY) min_tiao();     //如果分调整键按下(为0),调用分调整函数
display();         //调用显示函数
}
}
/***************************************
函 数 名:init
功   能:初始化函数
说   明:初始化定时器及中断
入口参数:无
返 回 值:无
***************************************/
void init()
{
TMOD=1;TH0=0X3C;TL0=0XB0;     //定时器0模式1,50毫秒
ET0=1;TR0=1;EA=1;       //开定时器0中断、启动定时器0、开总中断
}
/***************************************
函 数 名:display
功   能:显示函数
说   明:
入口参数:无
返 回 值:无
***************************************/
void display()
{
LEDBus=LEDTab[minute%10];     //分个位送数码管显示
MIAO=SHAN;         //秒点闪烁
MIN_G=ON;           //打开分个位位选
delay(1);           //显示1毫秒
MIN_G=OFF;         //关闭分个位位选
LEDBus=LEDTab[minute/10];     //分十位送数码管显示
MIAO=SHAN;         //秒点闪烁
MIN_S=ON;           //打开分十位位选
delay(1);           //显示1毫秒
MIN_S=OFF;         //关闭分十位位选
LEDBus=LEDTab[hour%10];     //时个位送数码管显示
HOU_G=ON;           //打开时个位位选
delay(1);           //显示1毫秒
HOU_G=OFF;         //关闭时个位位选
if(hour/10)         //如果时十位为0,不显示十位数字
{
LEDBus=LEDTab[hour/10];     //时十位送数码管显示
HOU_S=ON;         //打开时十位位选
delay(1);         //显示1毫秒
HOU_S=OFF;         //关闭时十位位选
}
}
/***************************************
函 数 名:min_tiao
功   能:分调整
说   明:
入口参数:无
返 回 值:无
***************************************/
void min_tiao()
{
while(!M_KEY) display();     //等待分调整键松开
second=0;minute++;       //秒清零、分加1
if(minute==60) minute=0;     //如果分等于60,分变0
}
/***************************************
函 数 名:hou_tiao
功   能:时调整
说   明:
入口参数:无
返 回 值:无
***************************************/
void hou_tiao()
{
while(!H_KEY) display();     //等待时调整键松开
second=0;hour++;       //秒清零,时加1
if(hour==24) hour=0;       //如果时等于24,时变0
}
/***************************************
函 数 名:delay
功   能:延时函数
说   明:
入口参数:t:延时时间长短
返 回 值:无
***************************************/
void delay(uchar t)
{
uchar i;           //定义变量

for(;t>0;t--)         //如果t大于0,t减1(外层循环)
for(i=124;i>0;i--);       //i等于124,如果i大于0,i减1
}

/***************************************
函 数 名:timer0
功   能:定时器0中断函数
说   明:
入口参数:无
返 回 值:无
***************************************/
void timer0() interrupt 1     //定时器0(中断1)
{
uchar tim1,tim2;       //定义临时变量

TL0=TL0+0XB0;TH0=0X3C;     //重装定时器初值
tim1++;           //每中断一次tim1加1
if(tim1==10)         //中断10(0.5秒)
{            
SHAN=!SHAN;         //闪烁标志取反
tim1=0;tim2++;       //tim1清零,tim2加1
if(tim2==2)         //到了1秒
{
  tim2=0;second++;       //tim2清零,秒加1
  if(second==60)       //如果秒到60
  {          
  second=0;minute++;     //秒变0,分加1
  if(minute==60)       //如果分到60
  {
  minute=0;hour++;     //分变0,时加1
  if(hour==24) hour=0;   //如果时到24,时变0
  }
  }
}
}
}
/***************************************
program end           程序结束
***************************************/

谢谢各位大侠了