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 + -
显示快捷键?