main.c

来自「串口扩展LED时钟子程序」· C语言 代码 · 共 108 行

C
108
字号
#include <reg52.h>
#include <stdio.h>
sbit test=P0^0;
//----------------------------------------------------------------
//十六进制到十进制调整程序
//designed by Kong Rui
//version 1.0
//功能描述:实现十六进制数到十进制数的变换
//入口参数:hex_val,十六进制数
//出口参数:dec_val,十进制数
//-----------------------------------------------------------------
unsigned char hex_to_dec(unsigned char hex_val)		
{
 unsigned char dec_val;
 dec_val=((hex_val/10<<4)|(hex_val%10));
 return dec_val; 
}

//----------------------------------------------------------------
//时间显示程序
//designed by Kong Rui
//version 1.0
//功能描述:将十六进制的时分秒在数码管上显示出来,数码管采用的是串口扩展的,用74HC164驱动的共阴型,因而程序叫简单
//入口参数:十六进制数时间
//出口参数:无
//-----------------------------------------------------------------
void display(unsigned char second,minute,hour)
{
 unsigned char timer_buf[6];
 unsigned char i,n;
 unsigned char CLED_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};		//共阴段码
 						    //"0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"
/* unsigned char ALED_code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};		//共阳段码
 						    //"0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"		*/
 SCON=0;		//串口同步方式,实现段码发送 
 second=hex_to_dec(second);		//进制转换
 minute=hex_to_dec(minute);
 hour=hex_to_dec(hour);
 timer_buf[0]=second&0x0f;
 timer_buf[1]=(second>>4)&0x0f;
 timer_buf[2]=minute&0x0f;
 timer_buf[3]=(minute>>4)&0x0f;
 timer_buf[4]=hour&0x0f;
 timer_buf[5]=(hour>>4)&0x0f;
 for(i=0;i<6;i++)		//显示
 {
  n=timer_buf[i];
  SBUF=CLED_code[n];
  while(!TI);
  TI=0;
 }
 /*for(i=4;i<6;i++)		//最高两位采用的是共阳数码管,所以两种段码
 {
  n=timer_buf[i];
  SBUF=ALED_code[n];
  while(!TI);
  TI=0;
 }*/
}
/*void delay1s(){
 unsigned char i;
 TMOD=0x01;
 TH0=0xdc;
 TL0=0;
 TR0=1; 
 for(i=0;i<100;i++){while(!TF0);continue;}
//-----------------------------------------------------------------
//主程序
//designed by Kong Rui
//version 1.0
//功能描述:P0.0作为采样实现外部定时器定时时间的测定,P0.0为高电平时开始计时,低电平是停止计时,显示最终计时时间
//入口参数:无
//出口参数:无
//-----------------------------------------------------------------
}*/
void main()
{
 unsigned char second,minute,hour;		//上电复位会从0开始计时,若是其他原因引起的复位会继续原来的时间计时,具有抗干扰性
 unsigned char n=0;		//定时器2溢出计数
 RCAP2H=0x3c;	 //12MHz晶振定时器2 50ms定时初值						
 RCAP2L=0xb0;
 TH2=0x3c;
 TL2=0xb0;

 while(!test);
 TR2=1;
 display(second,minute,hour);		//复位显示时间
 //delay1s();
 //while(!test);
 while(test)
 {
  if(TF2)
  {
   TF2=0;
   n=n+1;
   if(n<20) continue;
   else {n=0;second=second+1;}		//1秒时间到,秒加1
   if(second==60){second=0;minute=minute+1;}		//60s到,则秒清零,分加1
   if(minute==60){minute=0; hour=hour+1;}		//60分到,则分清零,时加1
   if(hour==13) hour=1;		//12小时制,最大显示12点59分59秒,然后显示1点0分0秒
   display(second,minute,hour);		//显示当前时间
  }
  else continue;
 }
 if(!test)		//低电平计时结束
 for(;;){}		//无限循环
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?