标题: 简单的单片机电子钟资料 [打印本页]

作者: gzyanbo    时间: 2022-8-19 16:00
标题: 简单的单片机电子钟资料
最简单的电子钟全套资料,我就制作了一套,走时精准。
/***************************************/
//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                                                                程序结束
***************************************/

原理图.jpg (100.52 KB, 下载次数: 63)

原理图.jpg

1660895825730.jpg (149.38 KB, 下载次数: 65)

1660895825730.jpg

最简单的电子钟全套资料.rar

769.15 KB, 下载次数: 17, 下载积分: 黑币 -5






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1