找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2483|回复: 2
收起左侧

学渣求大神解救:利用单片机、串行口和3位数码管,构建电脑设置时分秒实时时钟。

[复制链接]
ID:69521 发表于 2014-11-27 10:32 | 显示全部楼层 |阅读模式
利用单片机、串行口和3位数码管,构建电脑设置时分秒实时时钟。要求:(1)数码管为动态显示,共阴共阳不限;(2)具有时钟设置功能,从电脑键盘输入起点时刻;(3)单片机接收到电脑设定的起点时刻后,从此时刻开始,实现时分秒时钟。
回复

使用道具 举报

ID:66840 发表于 2014-11-28 11:06 | 显示全部楼层
#include<reg52.h>

sbit LATCH1 = P2^1;         //位码控制
sbit LATCH2 = P2^2; //段码控制

void LedRefresh(unsigned char n);//数码管刷新函数
void InitUART();

unsigned char LedBuff[8];//LED全局缓存
unsigned char  WeiMa[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff} ; //位码(选通数码第 N 位数)
unsigned char code DuanMa[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段码(选通数码要显示数字)

unsigned char i = 0; //动态扫描判断
unsigned int cnt = 0; //定义一个记数变量cnt,记录T0中断次数
unsigned long sec = 0; //定义一个记数变量sec,记录秒数


void main()
{               
        EA = 1; //总中断打开
        TMOD = 0x01; //定时器选择工作模式 1
        TH0 = 0xFF; //给TH0赋值初始化 定时100微妙
        TL0 = 0xA4;
        ET0        = 1        ; //启动中断 T0
        TR0 = 1; // 启动定时器 T0

        InitUART();        //初始化串口波特率

        while(1)
        {
                if(cnt>=10000)        //
                {
                          cnt = 0; //达到10000次后,计数清零
                          sec++;
                          if(sec>=86401) //判断是否达到24小时
                          {
                                sec = 0;        //达到24小时,数据清零重新开始
                          }
                       
                       
                       
                    if(sec<10)                              
                             {WeiMa[0]=0x7f;}
                        else if((sec>9)&&(sec<60))                         
                                {WeiMa[1]=0xbf; }               
                        else if((sec>59) &&(sec<600))          
                {WeiMa[2]=0xdf;WeiMa[3]=0xef;}
                        else if ((sec>599)&&(sec<3600))  
                                {WeiMa[4]=0xf7;}         
                        else if ((sec>3599) &&(sec<36000))        
                            { WeiMa[5]=0xfb;WeiMa[6]=0xfd; }         
                        else if (sec>35999)                                         
                            {WeiMa[7]=0xfe;}
                                                                                
/*--------------------------------------------------------------------------
                         分解显示时钟数字
---------------------------------------------------------------------------*/                               
                        LedBuff[0] = DuanMa[(sec%10)]; //秒 个位
                           LedBuff[1] = DuanMa[(sec%60)/10]; //秒 十位
                           LedBuff[2] = 0x40;
                      LedBuff[3] = DuanMa[(sec/60)%10];//分 个位
                    LedBuff[4] = DuanMa[((sec/60)%60)/10];//分 十位
                      LedBuff[5] = 0x40;
                    LedBuff[6] = DuanMa[(sec/3600)%10];//小时 个位
                      LedBuff[7] = DuanMa[(sec/3600)/10];        //小时 十位                                                                                        
                        }                               
        }
}

/*----------------------------------------------------------------------
                               定时器 T0 中断服务函数
-----------------------------------------------------------------------*/
void InterruptTime0() interrupt 1
{

        TH0 = 0xFF;        //重新加载初始值
        TL0 = 0xA4;
        cnt++; //计数值自动加 1

        LedRefresh(i);
        i++;
        if(i >= 8)
        {
                i = 0;
        }
}
/*----------------------------------------------------------------------
                        数码管动态扫描显示
-----------------------------------------------------------------------*/
void LedRefresh(unsigned char n)
{   
       
    P1 = 0;          //数码管显示数据清零,防止重影
    LATCH2 = 1;
    LATCH2= 0;
       

        P1 = WeiMa[n];
        LATCH1 = 1;
        LATCH1 = 0;
               
        P1 = LedBuff[n];
        LATCH2 = 1;
        LATCH2 = 0;
}

/*------------------------------------------------------------------------
                    串口波特率9600
------------------------------------------------------------------------*/
void InitUART()
{
    TMOD = 0x21;
    SCON = 0x50;
    TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;
}

void UARTInterrupt(void) interrupt 4
{
       
   if(RI)
    {
        RI = 0;
                sec = SBUF;        
    }
   else
       TI = 0;
}
回复

使用道具 举报

ID:66840 发表于 2014-11-28 11:08 | 显示全部楼层
开发板上已通过。数码管驱动芯片为74HC573
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表