专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

串口应用--时钟

作者:佚名   来源:本站原创   点击数:  更新时间:2011年03月04日   【字体:
/*
晶振24MHz
单片机内部定时产生时钟(这里只有时分秒),每隔一秒输出当前时间
下载程序后,单片机要重新上电,串口数据才能正常显示
*/

#include<reg51.h>

#define uchar unsigned char
#define uint unsigned int

uint second_counter=0;
uchar i,time_display[9]={0x00,0x00,':',0x00,0x00,':',0x00,0x00,0x20}; /*一维数组用于存储要显示的时间,空格的ASCII码是0x20*/
bit flag=0;

//定义类型为date的结构体
struct date{
 uchar second,minute,hour;
};

struct date clock={0,0,0}; //定义类型为date的变量clock,并为其内部元素赋初值

void clockk(void);
void system_init(void);


//系统初始化
void system_init(void)
{
 TMOD=0x22;  //定时器0工作方式2,定时器1工作方式2
 TH0=0x38;   //定时器0中断用来产生1秒时钟定时,定时一次100us
 TL0=0x38;
 TH1=0xf3;   //定时器1用于串行中断,波特率
 TL1=0xf3;
 SCON=0x50;PCON=0x80;
 EA=1;      //总中断允许
 ET0=1;     //定时器0中断允许
// ES=1;
 TR0=1;     //启动定时器0
 TR1=1;
}

 


//时钟
void clockk(void)
{
 if(clock.second==60)
 {
  
  clock.second=0;
  if(++clock.minute==60)
  {
   clock.minute=0;
   if(++clock.hour==24) {clock.hour=0;}
  }
 }
}


//定时器0中断服务程序,用于产生1秒定时。方式2不用重新赋初值,定时较精确。
void timer0(void) interrupt 1 using 1
{
 if(++second_counter==10000)   
 {
   flag=1;
   second_counter=0;
   ++clock.second; 
 }
 
}

 

main()
{
 system_init();
 while(1)
 {
  clockk();
  if(flag==1)
  {
   flag=0;
   time_display[0]=clock.hour/10+0x30;   //小时的十位。字符0的ASCII码为0x30
   time_display[1]=clock.hour%10+0x30;  //小时的各位
   time_display[3]=clock.minute/10+0x30;  //分的十位
   time_display[4]=clock.minute%10+0x30;  //分的个位
   time_display[6]=clock.second/10+0x30;  //秒的十位
   time_display[7]=clock.second%10+0x30;  //秒的个位
   for(i=0;i<9;i++)
   {
    SBUF=time_display[i];   //SBUF一次只能存放一个字符
 while(TI==0){}
 TI=0;
   }
  }

 }
}
关闭窗口

相关文章