精华内容
下载资源
问答
  • 单片机数字时钟电路及程序设计1.单片机时钟设计目标(1. 开机时,显示12:00:00的时间开始计时...2.单片机时钟电路原理图3.系统板上硬件连线(1. 把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态...

    单片机数字时钟电路及程序设计

    1.单片机时钟设计目标

    (1. 开机时,显示12:00:00的时间开始计时;

    (2. P0.0/AD0控制“秒”的调整,每按一次加1秒;

    (3. P0.1/AD1控制“分”的调整,每按一次加1分;

    (4. P0.2/AD2控制“时”的调整,每按一次加1个小时;

    2.单片机时钟电路原理图

    649fb9c3bdcc40b56649700e6d8db552.gif

    3.系统板上硬件连线

    (1. 把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;

    (2. 把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;

    (3. 把“单片机系统”区域中的P0.0/AD0、P0.1/AD1、P0.2/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上;

    4.相关基本知识

    (1. 动态数码显示的方法

    (2. 独立式按键识别过程

    (3. “时”,“分”,“秒”数据送出显示处理方法

    5.C语言源程序

    #include

    unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,

    0x66,0x6d,0x7d,0x07,

    0x7f,0x6f,0x77,0x7c,

    0x39,0x5e,0x79,0x71,0x00};

    unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,

    0xef,0xdf,0xbf,0x7f};

    unsigned char dispbuf[8]={0,0,16,0,0,16,0,0};

    unsigned char dispbitcnt;

    unsigned char second;

    unsigned char minite;

    unsigned char hour;

    unsigned int tcnt;

    unsigned char mstcnt;

    unsigned char i,j;

    void main(void)

    {

    TMOD=0x02;

    TH0=0x06;

    TL0=0x06;

    TR0=1;

    ET0=1;

    EA=1;

    while(1)

    {

    if(P0_0==0)

    {

    for(i=5;i>0;i--)

    for(j=248;j>0;j--);

    if(P0_0==0)

    {

    second++;

    if(second==60)

    {

    second=0;

    }

    dispbuf[0]=second;

    dispbuf[1]=second/10;

    while(P0_0==0);

    }

    }

    if(P0_1==0)

    {

    for(i=5;i>0;i--)

    for(j=248;j>0;j--);

    if(P0_1==0)

    {

    minite++;

    if(minite==60)

    {

    minite=0;

    }

    dispbuf[3]=minite;

    dispbuf[4]=minite/10;

    while(P0_1==0);

    }

    }

    if(P0_2==0)

    {

    for(i=5;i>0;i--)

    for(j=248;j>0;j--);

    if(P0_2==0)

    {

    hour++;

    if(hour==24)

    {

    hour=0;

    }

    dispbuf[6]=hour;

    dispbuf[7]=hour/10;

    while(P0_2==0);

    }

    }

    }

    }

    void t0(void) interrupt 1 using 0

    {

    mstcnt++;

    if(mstcnt==8)

    {

    mstcnt=0;

    P1=dispcode[dispbuf[dispbitcnt]];

    P3=dispbitcode[dispbitcnt];

    dispbitcnt++;

    if(dispbitcnt==8)

    {

    dispbitcnt=0;

    }

    }

    tcnt++;

    if(tcnt==4000)

    {

    tcnt=0;

    second++;

    if(second==60)

    {

    second=0;

    minite++;

    if(minite==60)

    {

    minite=0;

    hour++;

    if(hour==24)

    {

    hour=0;

    }

    }

    }

    dispbuf[0]=second;

    dispbuf[1]=second/10;

    dispbuf[3]=minite;

    dispbuf[4]=minite/10;

    dispbuf[6]=hour;

    dispbuf[7]=hour/10;

    }

    }

    展开全文
  • 本文内容是关于单片机时钟电路程序的设计。
  • 51 单片机 简单 时钟程序 效果图 电路图全套
  • 单片机 温度 时钟显示电路程序 #include "reg52.h" sbit CS = 0xa0; sbit Clk = 0xa1; sbit DO1 = 0xa2; sbit DI = 0xa3;
  • 基于单片机时钟电路设计.pdf
  • 时钟电路本身是不会控制什么东西,而是你通过程序单片机根据时钟来做相应的工作。 在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟...
  • 基于51单片机电子时钟
  • 单片机数字时钟 包含电路图 源程序 几仿真图DSN 绝对满足毕业设计要求··。请联系370740621
  • 单片机设计时钟的汇编程序程序都有解释,带有时钟控制的原理图
  • 一个基于51单片机时钟电路设计源代码,还包括了电路图、PCB、源程序
  • 单片机数字时钟包含电路图+源程序+几仿真图DSN.rar
  • 单片机 简单时钟

    万次阅读 多人点赞 2018-05-26 17:32:08
    单片机 简单时钟 一、简述 通过Proteus仿真电路,用7段数码管实时显示当前时间时间。 工程文件:链接:https://pan.baidu.com/s/1CkKAF8h2dzn-bMoqgL-mhQ 密码:i3a2 二、效果 三、工程结构 1、Keil 工程 ...

    单片机 简单时钟

    一、简述

        通过Proteus仿真电路,用7段数码管实时显示当前时间时间。

        工程文件:链接:https://pan.baidu.com/s/1CkKAF8h2dzn-bMoqgL-mhQ 密码:i3a2

    二、效果

    三、工程结构

    1、Keil 工程

    2、仿真电路图

    四、源文件

    clock.c文件

    #include <reg51.h>
    #include <realTime.h>
    #define uint unsigned int
    #define uchar unsigned char
    uint time_t;//毫秒统计值
    uchar hour,min,sec;//数码管显示值,小时,分,秒
    uchar code led[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//数码管显示0-9
    
    /********************************************************************/
    //函数名:delay_1ms(uint x)
    //功能:利用定时器0精确定时1ms; 自加 time_t的值为后面时间调整函数服务
    //调用函数:
    //输入参数:x,1ms计数
    //输出参数:
    //说明:延时的时间为1ms乘以x
    /********************************************************************/
    void delay_1ms(uint x)
    {
    	TMOD=0X01;//开定时器0,工作方式为1
    	TR0=1;//启动定时器0;
    	while(x--)
    	{
    		TH0=0Xfc;//定时1ms初值的高8位装入TH0
    		TL0=0X18;//定时1ms初值的低8位装入TL0
    		while(!TF0);//等待,直到TF0为1
    		TF0=0;	   //重置溢出位标志
    		time_t++;//毫秒统计值自加1	
    	}		
    	TR0=0;//停止定时器0;
    }
    /**********************************************************/
    //函数名:display_num(uchar num,dis_w)
    //功能:数码管显示
    //调用函数:delay_1ms(uint x)
    //输入参数:num,dis_w
    //输出参数:
    //说明:P0口做数码管段选,P2口做位选
    //通过dis_w的值确定num值在数码管上显示的位置
    /**********************************************************/
    void display_num(uchar num,dis_w)
    {
    	uchar j;
    	for(j=0;j<2;j++)
    	{
    		P0=0xff;//段选口置高,消影	,设置前保证7段二极管是灭的状态
    		P2=~dis_w;//装入位选值	(低电平选中)
    		if(j)
    			P0=~led[num/10];//显示num个位	
    		else			
    			P0=~led[num%10];//显示num十位	
    		dis_w=dis_w<<1;	   //显示十位后显示个位
    		delay_1ms(2);//延时2ms	
    	}
    }
    /**********************************************************/
    //函数名:display_char()
    //功能:显示时间分隔符“-”
    //调用函数:delay_1ms(uint x)
    //输入参数:
    //输出参数:
    //说明:
    /**********************************************************/
    void display_char()
    {
    	P0=0xff;//段选口置高,消影
    	P2=~0x24;	 //P2端口的十六进制~0x24转换成二进制为11011011可知,点亮的是第3、第6两只数码管
    	P0=~0x02;//显示字符“-” ,P0端口的十六进制值~0x02值转换为二进制为11111101,是接数码管的g脚,亮的效果刚好是“-”
    }
    
    void main()
    {
    	
    	SYSTEMTIME CurrentTime;	//时间结构体
    
    	while(1)
    	{
    		//获取当前时间
    		DS1302_GetTime(&CurrentTime);
    		sec=CurrentTime.Second;	//获取当前秒数
    		min=CurrentTime.Minute;	//获取当前分钟数
    		hour=CurrentTime.Hour;  //获取当前小时数
    		display_num(sec,0x01);//显示秒	00000001 右边第1个数码管开始显示
    		display_num(min,0x08);//显示分	00001000 右边第4个数码管开始显示
    		display_num(hour,0x40);//显示小时  01000000		 右边第7个数码管开始显示
    		display_char();//显示分隔符“-”
    	}
    }
    

    realTime.h文件

    #ifndef _REAL_TIMER_H_
    #define _REAL_TIMER_H_
    
    sbit  DS1302_CLK = P1^6;              //实时时钟时钟线引脚 
    sbit  DS1302_IO  = P1^7;              //实时时钟数据线引脚 
    sbit  DS1302_RST = P1^5;              //实时时钟复位线引脚
    sbit  ACC0 = ACC^0;
    sbit  ACC7 = ACC^7;
    
    typedef struct __SYSTEMTIME__
    {
    	unsigned char Second;
    	unsigned char Minute;
    	unsigned char Hour;
    	unsigned char Week;
    	unsigned char Day;
    	unsigned char Month;
    	unsigned char  Year;
    	unsigned char DateString[9];
    	unsigned char TimeString[9];
    }SYSTEMTIME;	//定义的时间类型
    
    #define AM(X)	X
    #define PM(X)	(X+12)            	  // 转成24小时制
    #define DS1302_SECOND	0x80
    #define DS1302_MINUTE	0x82
    #define DS1302_HOUR		0x84 
    #define DS1302_WEEK		0x8A
    #define DS1302_DAY		0x86
    #define DS1302_MONTH	0x88
    #define DS1302_YEAR		0x8C
    #define DS1302_RAM(X)	(0xC0+(X)*2)   	//用于计算 DS1302_RAM 地址的宏 
    
    void DS1302InputByte(unsigned char d) 	//实时时钟写入一字节(内部函数)
    { 
        unsigned char i;
        ACC = d;
        for(i=8; i>0; i--)
        {
            DS1302_IO = ACC0;           	//相当于汇编中的 RRC
            DS1302_CLK = 1;
            DS1302_CLK = 0;
            ACC = ACC >> 1; 
        } 
    }
    
    unsigned char DS1302OutputByte(void) 	//实时时钟读取一字节(内部函数)
    { 
        unsigned char i;
        for(i=8; i>0; i--)
        {
            ACC = ACC >>1;         			//相当于汇编中的 RRC 
            ACC7 = DS1302_IO;
            DS1302_CLK = 1;
            DS1302_CLK = 0;
        } 
        return(ACC); 
    }
    
    
    unsigned char Read1302(unsigned char ucAddr)	//读取DS1302某地址的数据
    {
        unsigned char ucData;
        DS1302_RST = 0;
        DS1302_CLK = 0;
        DS1302_RST = 1;
        DS1302InputByte(ucAddr|0x01);        // 地址,命令 
        ucData = DS1302OutputByte();         // 读1Byte数据
        DS1302_CLK = 1;
        DS1302_RST = 0;
        return(ucData);
    }
    
    
    void DS1302_GetTime(SYSTEMTIME *Time)
    {
    	unsigned char ReadValue;
    	ReadValue = Read1302(DS1302_SECOND);
    	Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
    	ReadValue = Read1302(DS1302_MINUTE);
    	Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
    	ReadValue = Read1302(DS1302_HOUR);
    	Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
    	ReadValue = Read1302(DS1302_DAY);
    	Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);	
    	ReadValue = Read1302(DS1302_WEEK);
    	Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
    	ReadValue = Read1302(DS1302_MONTH);
    	Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
    	ReadValue = Read1302(DS1302_YEAR);
    	Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);	
    }
    
    #endif

     

    五、总结

     

    1.数码管显示数字机理

            数码管是由7段发光二极管组成的,可通过加电平的高低来控制发光二极管的导通与截止。对7个二极管进行合理地组合控制,将会得到0~9这10种数字的显示效果。本工程使用共阳数码管,即低电平时二极管亮。

    2、动态显示  (我们没有这么多的端口来一 一对应控制8个数码管,所以采用动态显示,每次控制一个数码管)

            用P0端口输出一个数字的段码,用P2端口选择那个数码管。一共有6个数字2个“-”(如:13-30-12显示13点30分12秒)

    每一次显示一个字符,只要间隔时间足够短,肉眼就能看到所有的数字。

            采用一个机制协调段码、位码输入,控制某字符在某位显示,其它各位熄灭,只要每位数码管显示——熄灭——显示,这显示到显示间隔足够短,由于数码管的余辉特性和人眼有视觉暂留现象,给人眼的视觉印象就会是连续稳定地显示。

    3、没有精确同步,有待改进。

     

    ---------------------------------------回复qq_43795753 这位兄弟-----------------------------------------

    利用定时器简单的实现简单时钟,并使用按键简单的设置时间:

    链接: https://pan.baidu.com/s/1cxenVFHhL2_WAJ8dFqb2uw 提取码: vemy 

    效果:

     

    keil:

    proteus仿真文件:

    代码: 

    #include <reg51.h>
    
    #define uint unsigned int
    #define uchar unsigned char
    uint ms;//微秒
    uchar hour,min,sec;//数码管显示值,小时,分,秒
    uchar code led[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//数码管显示0-9
    
    sbit key_Hour = P1^0;//用来控制小时的按键
    sbit key_Min = P1^1; //用来控制分钟的按键
    sbit key_Sec = P1^2;//用来控制秒的按键
    
    /*************************************************
    函数功能:软件消抖延时	  
    **************************************************/
    void delay( uint s)
    {
       uchar i,j;
            for(i=0;i<s;i++)
              for(j=0;j<60;j++)
                ;
    }
    
    /**********************************************************/
    //函数名:display_num(uchar num,dis_w)
    //功能:数码管显示
    //调用函数:delay_1ms(uint x)
    //输入参数:num,dis_w
    //输出参数:
    //说明:P0口做数码管段选,P2口做位选
    //通过dis_w的值确定num值在数码管上显示的位置
    /**********************************************************/
    void display_num(uchar num, uint dis_w)
    {
    	uchar j;
    	for(j=0;j<2;j++)
    	{
    		P0=0xff;//段选口置高,消影	,设置前保证7段二极管是灭的状态
    		P2=~dis_w;//装入位选值	(低电平选中)
    		if(j)
    			P0=~led[num/10];//显示num个位	
    		else			
    			P0=~led[num%10];//显示num十位	
    		dis_w=dis_w<<1;	   //显示十位后显示个位
    		delay(2);//延时	
    	}
    }
    /**********************************************************/
    //函数名:display_char()
    //功能:显示时间分隔符“-”
    //调用函数:delay_1ms(uint x)
    //输入参数:
    //输出参数:
    //说明:
    /**********************************************************/
    void display_char()
    {
    	P0=0xff;//段选口置高,消影
    	P2=~0x24;	 //P2端口的十六进制~0x24转换成二进制为11011011可知,点亮的是第3、第6两只数码管
    	P0=~0x02;//显示字符“-” ,P0端口的十六进制值~0x02值转换为二进制为11111101,是接数码管的g脚,亮的效果刚好是“-”
    }
    
    void Timer0(void) interrupt 1	 //定时器0中断处理函数(即当定时器溢出的时候会执行该函数)
    {
    	
    	TR0=0;	  //关闭定时器0
    	TF0=0;	   //重置溢出位标志
    
    	ms++; //毫秒值+1
    	if(ms%130==0)  //每隔一段时间检测一下按键是否有按下,(每1ms中断一次,这个时间太频繁,所以要加if判断一下,不能每1ms就检查)
    	{
    		if(key_Hour == 0)  //检测 小时 按键有没有按下
    		{
    			delay(100);//按键消抖
    			hour++;
    			if(hour >= 24)
    			{
    				hour = 0;
    			}
    			
    		}
    		else if(key_Min == 0)		  //检测 分钟 按键有没有按下
    		{
    			delay(100);
    			min++;
    			if(min >= 60)
    			{
    				min = 0;
    			}
    		}
    		else if(key_Sec == 0)	 //检测 秒 按键有没有按下
    		{
    			delay(100);
    			sec++;
    			if(sec >= 60)
    			{
    				sec = 0;
    			}
    		}
    	}
    
    	//重新装值
    	TH0=0Xfc;//定时1ms初值的高8位装入TH0
    	TL0=0X18;//定时1ms初值的低8位装入TL0
    
    	TR0=1;//启动定时器0;
    }
    
    
    void main()
    {
        ms = 0;	
    	TMOD=0X01;//开定时器0,工作方式为1
    	//定时器赋初值值
    	TH0=0Xfc;//定时1ms初值的高8位装入TH0
    	TL0=0X18;//定时1ms初值的低8位装入TL0
    	
    	
    
    	//设置开始的时间
    	sec = 45;	//秒数
    	min = 58;	//分钟数
    	hour = 21;  //小时数
    
    	ET0=1; //允许外部中断0
    	EA=1;  //开启总中断
    	TR0=1;//启动定时器0;
    
    	while(1)
    	{
    		display_num(sec,0x01);//显示秒	00000001 右边第1个数码管开始显示
    		display_num(min,0x08);//显示分	00001000 右边第4个数码管开始显示
    		display_num(hour,0x40);//显示小时  01000000		 右边第7个数码管开始显示
    		display_char();//显示分隔符“-”
    	
    	    //调整时间
    		if( ms >= 1000 )  //1000ms = 1s
    		{
    			ms = 0;
    			sec++;
    			if(sec >= 60)//60秒 进位1分
    			{
    				sec = 0;
    				min++;//分钟数加1
    				if(min >= 60)//60 分钟小时加1
    				{
    					min = 0;
    					hour++;
    					if(hour >= 24)
    					{
    						hour = 0;
    					}
    				}
    			}
    		}
    	}
    }
    
    
    

     

              

    ================以下回复 Yuki_fx ============

    拿到老师的例子的时候我也没有注意到年月日,例子中,年测的是后面2位,比如2019测出的是19

    小时是24制的,所以有两位数

    测试年月日

    测试星期:

    西方将星期日作为星期的第一天,

      星期日   星期一     星期二    星期三     星期四      星期五      星期六

          1           2              3             4              5                6              7

    上传文件大小限制为5M,所以将测试效果放到网盘:

    链接: https://pan.baidu.com/s/1hJOa6qJWBYuXjlZ-BFovow 提取码: b9gu

    展开全文
  • 51单片机数字钟课程设计(带闹钟,还有数字串在数码管上滚动显示的案例),C语言源程序+PROTEUS仿真电路图。
  • 基于51单片机的数码管显示时钟电路图与c程序 有原理图和PCB 源代码 调试成功,保证好用。
  • ; 定时器T0、T1溢出周期为50MS,T0为秒计数用, T1为调整时闪烁用, ; P3.7为调整按钮,P1口 为字符输出口,采用共阳显示管。 ;; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P1口输出段码数据,P3口作 ...
  • 带proteus电路的纯C单片机时钟程序,可在proteus中运行.hex文件查看结果,程序全部为C代码,适合初学!!
  • STC89C52RC单片机制作的LED时钟,并在开发板上调试成功。 LED时钟仿真 LED时钟电路图 附件包含以下资料
  • 本方案以AT89C52单片机作为主控核心,与DS12887芯片,LM016L液晶显示器构成主控制模块,在主控制模块上接有4个按键和一个扬声器。由于在刚接通电源或者时钟走时出现误差是,则需要进行实间的校准,使用者可以按...
  • 基于AT89C51单片机的数字时钟电路设计与实践.pdf
  • 在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据硬件电路的不同,单片机的时钟连接方式可分为内部...

    01
    在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据硬件电路的不同,单片机的时钟连接方式可分为内部时钟方式和外部时钟方式,如下图所示。

    51单片机时钟电路图怎么设计?这7个时钟汇聚了所有,看看

    时钟电路:(a)内部方式时钟电路,(b)外接时钟电路

    在内部方式时钟电路中,必须在XTAL1和XTAL2引脚两端跨接石英晶体振荡器和两个微调电容构成振荡电路,通常C1和C2一般取30pF,晶振的频率取值在1.2MHz~12MHz之间。对于外接时钟电路,要求XTAL1接地,XTAL2脚接外部时钟,对于外部时钟信号并无特殊要求,只要保证一定的脉冲宽度,时钟频率低于12MHz即可。

    晶体振荡器的振荡信号从XTAL2端送入内部时钟电路,它将该振荡信号二分频,产生一个两相时钟信号P1和P2供单片机使用。时钟信号的周期称为状态时间S,它是振荡周期的2倍,P1信号在每个状态的前半周期有效,在每个状态的后半周期P2信号有效。CPU就是以两相时钟P1和P2为基本节拍协调单片机各部分有效工作的。

    02

    51单片机时钟电路图怎么设计?这7个时钟汇聚了所有,看看

    MCS-51片内有一个高增益反相放大器,其输入端(XTAL1)和输出端(XTAL2)用于外接石英晶体和微调电容,构成振荡器,如图所示。电容C2和C3对频率有微调作用,电容容量的选择范围一般为30pF士10pF。振荡频率的选择范围为1.2~12MHz。

    在使用外部时钟时,8051的XTAL2用来输入外时钟信号,而XTAL1则接地。

    03

    51单片机时钟电路图怎么设计?这7个时钟汇聚了所有,看看

    上图为时钟电路的原理图。分为最小单片机系统、单片机复位电路、按键电路、数码管位选电路、数码管段选电路、数码管显示电路、蜂鸣器电路、温度采集电路。

    使用单片机的P2口进行数模的输出,P14、P15、P16与74HC138连接实现数码管位选,按键电路接入P10、P11、P12、P13四个I\O口,通过程序控制,扫描该四个引脚的信号实现时间的调节。蜂鸣器通过与三极管8550连接,最终接入P17,时间设定启动使其发声。温度传感器接入P3^7,将采集到的模拟信号转化为数字信号后传到单片机。

    04
    ATmega16单片机的时钟电路和输出I/O电路:

    51单片机时钟电路图怎么设计?这7个时钟汇聚了所有,看看

    05
    按键处理设置为:当有没键按下时,时钟正常运行;当按一次K1,时钟停止走动,按K2对秒进行调整;当K1按2次时,按K2对分进行调整;当K1按下3次时,按K2对小时进行调整,当按下4次K1时,校时完毕,时钟按设定的时间进行正常走时。

    当按1次K3进入闹钟设置界面,时钟继续进行走时,按K2对秒进行设置;当按2次K3,按K2对分进行设置;当按3次K3,按K2对秒进行设置;当按下4次K3时,闹钟设置完毕进入时钟显示界面。电路图如下:

    51单片机时钟电路图怎么设计?这7个时钟汇聚了所有,看看

    独立按键电路

    06
    单片机利用外部12MHZ晶振构成振荡电路作为时钟源,时钟电路的原理如下图。

    51单片机时钟电路图怎么设计?这7个时钟汇聚了所有,看看

    07

    51单片机时钟电路图怎么设计?这7个时钟汇聚了所有,看看

    P10控制调时分秒的哪一位,P11调时分秒的加,P12按下显示时间,P13按下显示闹铃,P14按下显示秒表,并且P14还是秒表的暂停和复位开关。

    展开全文
  • 51单片机八位数码管时钟电路仿真

    千次阅读 多人点赞 2020-07-03 10:43:38
    器件选型有:AT89C51模块,八位阳极数码管显示模块,两个独立按键模块,还有P1口作为I/O口需要外加上拉电阻的电阻排,由于仿真的单片机模块内有时钟电路以及复位电路,这里省略了。 2、硬件设计与分析 电路原理图如...

    电路图文件以及详细视频介绍请到B站评论区拿取
    https://www.bilibili.com/video/BV1Ht4y1975h
    仿真电路图
    在这里插入图片描述
    系统设计
    1、方案(系统结构框图、器件选型)

    在这里插入图片描述

    器件选型有:AT89C51模块,八位阳极数码管显示模块,两个独立按键模块,还有P1口作为I/O口需要外加上拉电阻的电阻排,由于仿真的单片机模块内有时钟电路以及复位电路,这里省略了。

    2、硬件设计与分析

    在这里插入图片描述

    电路原理图如图所示,P0口作为I/O口时需要外加上拉电阻,外接了一个电阻排,P2口接两个锁存器,分别控制数码管的位选和段选,给它的使能端口LE送高电平就开始工作,还要注意数码管采用的是共阴极接法。
    这两个锁存器的工作原理是通过单片机控制。
    先打开一个锁存器,选择一个位码,然后关闭,再打开另一个锁存器,选择一个要显示的断码, 采用独立按键接口电路控制8位共阴极数码管,采用中断方式K1按下调时,K2按下时调分,数码管初始显示时间为08-30-59.

    3、软件设计与分析(流程图、代码)
    流程图如下:

    下面是代码:

    #include <reg51.h>
    sbit key1 = P1^0;
    bit flag1s = 0;
    bit KeySta = 1;
    unsigned char hour = 8;
    unsigned char minute = 31;
    unsigned char second = 59;
    unsigned char mode = 0;
    void FreshTime();
    void TimeInit();
    void IntInit();
    void InitLedBuff();
    void keyscan();
      
    unsigned char code LedChar[] = {  //共阴数码管显示字符转换表
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};
    unsigned char LedBuff[8] = {  //数码管显示缓冲区
        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
    
    void main()
    {
       
        TimeInit();
        IntInit();
        InitLedBuff();
      while(1)//显示内容处理
      {
      
       if(flag1s&&!mode) //时间显示模式
        {
          flag1s = 0;
    	  	FreshTime();
        }
         else if(mode == 1)  //校准分钟
        {
          LedBuff[0] = 17;
          LedBuff[1] = 17;
          LedBuff[4] = 17;
          LedBuff[5] = 17;//不显示
    	  LedBuff[6] = 17;
          LedBuff[7] = 17;
          LedBuff[2] = minute/10;
          LedBuff[3] = minute%10;
        }
        else if(mode == 2)  //校准小时
        {
          LedBuff[2] = 17;
          LedBuff[3] = 17;
          LedBuff[4] = 17;
          LedBuff[5] = 17;//不显示
    	   LedBuff[6] = 17;
          LedBuff[7] = 17;
          LedBuff[0] = hour/10;
          LedBuff[1] = hour%10;
        }
        else if(mode == 3)  //校准完成重新显示
        {
          InitLedBuff();
          mode = 0;
        }
        keyscan();
      }
    }
    
    void InitLedBuff()//初始化时间到显示缓冲区
    {
      LedBuff[0] = hour/10;
      LedBuff[1] = hour%10;
      LedBuff[2] = minute/10;
      LedBuff[3] = minute%10;
      LedBuff[4] = second/10;
      LedBuff[5] = second%10;
    }
    void FreshTime()//刷新时间到显示缓冲区
    {
      second++;
      if(second == 60)//进位
      {
        second = 0;
        minute++;
        
        if(minute==60)//进位
        {
          minute=0;//上次分钟会显示到60,改进后我分钟的显示移动到清零之后,这样就不会出现分钟显示到60的情况
          LedBuff[2] = minute/10;
          LedBuff[3] = minute%10;
          hour++;
          if(hour == 24)
            hour = 0;
          LedBuff[0] = hour/10;
          LedBuff[1] = hour%10;
        }  
      }
      LedBuff[4] = second/10;
      LedBuff[5] = second%10;
    }
    
    void TimeInit()//定时器初始化
    {
      TMOD = 0X11;    //设置定时器为模式1
      TL0 = 0xB0; 
      TH0 = 0x3C;     //定时初值 50ms
      TL1 = 0x18;		//
    TH1 = 0xFC;		//定时初值 1ms
      TR0 = 1;    //定时器0开始计时
      TR1 = 1;    //定时器1开始计时
      ET1 = 1;    //使能定时器1
      ET0 = 1;    //使能定时器0
      PT0 = 1;    //提高计时准确性,提高定时器0中断优先级
      EA = 1;     //打开总中断
    }
    void IntInit()//外部中断初始化
    {
      IT0 = 1;     //下降沿触发
      EX0 = 1;    //使能外部中断0
    }
    
    void keyscan() //按键扫描及处理
    {
      static bit backup = 1;
      if (KeySta != backup)  //当前值与前次值不相等说明此时按键有动作
      {
        if (backup == 0)   //如果前次值为0,则说明当前是弹起动作
        {
          if(mode == 1)   //校准分钟时,分钟加一
          {
            minute++;
            if(minute==60)
              minute = 0;
          }
          else if(mode == 2)    //校准小时,小时加一
          {
            hour++;
            if(hour==24)
              hour = 0;
          }
        }
        backup = KeySta;   //更新备份为当前值,以备进行下次比较
      }
    }
    void Int0() interrupt 0 
    {
      mode++;
      if(mode == 4)
      {
        mode = 0;
      }
    }
    void Ledfresh() //数码管显示刷新
    {
      static unsigned char i = 0;
      switch(i)
      {
        case 0 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[0]];i++;break;
        case 1 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[1]];i++;break;
        case 2 : P2 = ~(0x01<<i);P0 = 0x40;i++;break;//时分间隔线
        case 3 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[2]];i++;break;
        case 4 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[3]];i++;break;
        case 5 : P2 = ~(0x01<<i);P0 = 0x40;i++;break;//分秒间隔线
        case 6 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[4]];i++;break;
        case 7 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[5]];i=0;break;
      }
    }
    void Time0() interrupt 1 // 50ms 
    {
      static unsigned char n = 0;
      TL0 = 0xB0;
      TH0 = 0x3C;
      n++;
      if(n==20)
      {
        n=0;
        flag1s = 1;//1s标志位
      }
    }
    
    void Time1() interrupt 3  // 1ms
    {
      static unsigned char keybuff = 0xff;
      TL1 = 0x18;		//
    	TH1 = 0xFC;		//定时初值 1ms
      Ledfresh();
      keybuff = (keybuff<<1)|key1;
      if (keybuff == 0x00)
      {   //连续8次扫描值都为0,即16ms内都只检测到按下状态时,可认为按键已按下
          KeySta = 0;
      }
      else if (keybuff == 0xFF)
      {   //连续8次扫描值都为1,即16ms内都只检测到弹起状态时,可认为按键已弹起
          KeySta = 1;
      }
      else
      {}  //其它情况则说明按键状态尚未稳定,则不对KeySta变量值进行更新
    }
    //电路图文件以及详细视频介绍请到B站评论区拿取https://www.bilibili.com/video/BV1Ht4y1975h``
    
    展开全文
  • 简单时钟程序 电路

    2010-06-08 13:16:43
    51单片机 实现简单时钟电路图 C程序代码
  • 51单片机时钟电路(LCD1602显示)完整源码与仿真,适用于51单片机初学者
  • 对于单片机来说晶振是很重要的,可以说是没有晶振就没有时钟周期,没有时钟周期就无法执行程序代码,那样的话单片机就无法工作。接下来了解一下单片机晶振的电路原理作用。二、单片机晶振的必要性单片机工作时,是...
  • 01在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据硬件电路的不同,单片机的时钟连接方式可分为内部...
  • 在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。电子学习资料大礼包​mp.weixin.qq.com在MCS-51单片机片...
  • 这是一款多功能数字时钟的教程,有电路图和程序。该款时钟基于51单片机,可以测温度,更有全息和超炫的液晶大字符两种显示模式可以选择,红外遥控仅仅用来切换显示模式,也适合红外遥控的初学者
  • PIC32MX单片机的无同步时钟电路HBS通信设计.pdf
  • -----------------------...提供PCB代画 程序代调 论文代写等服务联系Q1721948477,丰厚经验电子工程师保障你的设计完美通过上述作品仅提供资料。 实物购买地址:https://shop253371153.taobao.com/shop/view_shop.ht...
  • 产品自带单片机上电复位、手动复位电路(复位按键)、晶振电路(给单片机提供时钟周期) 采用0.56英寸数码管循环进行时钟与温度显示 采用DS18B20 实现温度测试 实物展示: PS:提供PCB代画 程序代调 论文代写等服务...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,913
精华内容 4,765
关键字:

单片机简单时钟电路及程序