找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 330|回复: 3
收起左侧

单片机定时器时钟程序

[复制链接]
ID:1150380 发表于 2025-5-13 18:34 | 显示全部楼层 |阅读模式
#include "reg52.h"


typedef unsigned int u16;
typedef unsigned char u8;


#define SMG_A_DP_PORT        P0

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴0-F

u8 XS[8];//8段数码管
u16 h,min,s,ms;//时,分,秒 毫秒;


void delay_10us(u16 ten_us)//当传入Ten_us=1时,大约延时10us
{
        while(ten_us--);
}

void ZD0_init(void)
{
          TMOD|=0X01;//选择为定时器0模式,工作方式1
          TH0=0XFC;//给定时器赋初值,定时1ms
          TL0=0X17;
          ET0=1; //打开定时器0中断
          EA=1;        //打开总中断
          TR0=1;//打开定时器
}

void smg_display(void)//数码管主程序
{
        u8 i=0;
               
                for(i=0;i<8;i++)
                {                                 
                        switch(i)//位选
                        {
                                case 0: LSC=1;LSB=1;LSA=1;break;
                                case 1: LSC=1;LSB=1;LSA=0;break;
                                case 2: LSC=1;LSB=0;LSA=1;break;
                                case 3: LSC=1;LSB=0;LSA=0;break;
                                case 4: LSC=0;LSB=1;LSA=1;break;
                                case 5: LSC=0;LSB=1;LSA=0;break;
                                case 6: LSC=0;LSB=0;LSA=1;break;
                                case 7: LSC=0;LSB=0;LSA=0;break;
                        }
                        P0=XS[i];//段送码
                        delay_10us(100);
                        P0=0x00;//消音
                }         
}


void xianshishu()//第7 6 4 3 1 0位显示数字
{          
        XS[0]=gsmg_code[s%10];  //秒位
        XS[1]=gsmg_code[s/10];        //秒位
        XS[3]=gsmg_code[min%10];//分位
        XS[4]=gsmg_code[min/10];//分位
        XS[6]=gsmg_code[h%10];//时位
        XS[7]=gsmg_code[h/10];//时位
}
void hg()//横杠闪烁判断
{
                if(ms==500)//横杠500毫秒的判断
                {
                        XS[2]=0x40;//横杠显示
                        XS[5]=0x40;//横杠显示
                }
                else
                {

                  XS[2]=0x00;//横杠不显示
                  XS[5]=0x00;//横杠不显示
                }
}
void main()
{
        ZD0_init();//定时器初始化
        while(1)
        {       
                xianshishu();//显示位数程序       
                  smg_display();//数码管程序
        }
}
void ZD0() interrupt 1 //定时器0中断函数
{
       
        TH0=0XFC;//给定时器赋初值,定时1ms
        TL0=0X17;
        ms++;
        if(ms>=1000)//1000*ms=1s
        {
           ms=0;//毫秒清零
           s++;
                  if(s>=60)//60秒
                {
                        s=0;//秒清零
                        min++;
                    if(min>=60)//60分钟
                        {
                           min=0;//分清零
                           h++;
                                if(h>=24)//24小时
                                {
                                  h=0;//时清零
                       
                                }
                        }
                }       
        }
       
        if(ms%500==0)////横杠500毫秒的判断
        {
          hg();        //横杠程序
        }
}

回复

举报

ID:619259 发表于 2025-5-14 11:36 | 显示全部楼层
TH0=0XFC;//给定时器赋初值,定时1ms
TL0=0X17;
楼主这个初始值是不是有误呢?晶振频率多少?
回复

举报

ID:1150380 发表于 2025-5-14 15:09 | 显示全部楼层
cy009 发表于 2025-5-14 11:36
TH0=0XFC;//给定时器赋初值,定时1ms
TL0=0X17;
楼主这个初始值是不是有误呢?晶振频率多少?

晶振 12   0~65535  你换算下多少  FC17
回复

举报

ID:619259 发表于 2025-5-14 16:53 | 显示全部楼层
潇博 发表于 2025-5-14 15:09
晶振 12   0~65535  你换算下多少  FC17

正确应是 FC18
回复

举报

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

本版积分规则

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

Powered by 单片机教程网

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