单片机制作定时器_51单片机定时器中断和静态数码管制作秒表 - CSDN
  • 51单片机定时器做时钟

    千次阅读 2019-02-24 13:01:29
    2、用定时器 定时器代码 #include <reg52.h> sbit LED=P1^0; unsigned char numl=0; int flag=0; void main() { TMOD=0x01; //定时器工作模式 TH0=(65536-50000)/256; ...

    要求

    1、用8位数码显示管显示00-00-00表示小时-分钟-秒。

    2、用定时器

    定时器代码

    #include <reg52.h>
    
    sbit LED=P1^0;
    unsigned char numl=0;
    int flag=0;
    
    void main()
    {
    	TMOD=0x01;										//定时器工作模式
    	TH0=(65536-50000)/256;				//定时高8位
    	TL0=(65536-50000)%256;				//定时低8位
    	TR0=1;												//打开定时器0
    	ET0=1;												//打开定时器0中断
    	EA=1;													//打开总中断
    	while(1)
    	{
    		if(flag)
    		{
    			flag=0;										//flag清零,下一次flag=1的时候进入
    			LED=!LED;									//LED取反输出
    		}
    	}
    }
    
    void timer0() interrupt 1
    {
    	TH0=(65536-50000)/256;				//重置定时高8位
    	TL0=(65536-50000)%256;				//重置定时低8位(50ms)
    	numl++;
    	if(numl==20)										//判断计数到1s
    	{
    		numl=0;
    		flag=1;											//flag置1 --> 主函数里执行取反
    	}
    }
    

    时钟程序:

    #include <reg52.h>
    sbit duan=P2^2;
    sbit wei=P2^3;
    unsigned char num[11]=//0到9和-显示数据提前储存
    {
    	0xc0,0xf9,0xa4,0xb0,0x99,
    	0x92,0x82,0xf8,0x80,0x90,
    	0xbf
    };
    void delay_ms(unsigned int num)//1ms延时
    {
    	unsigned int x,y;
    	for(x=0;x<110;x++)
    		for(y=0;y<num;y++);
    }
    void delay_10us(unsigned int num)//10us延时
    {
    	unsigned int x;
    		for(x=0;x<num;x++);
    }
    unsigned char numl=0;
    int flag=0;
    void timer0() interrupt 1
    {
    	TH0=(65536-50000)/256;				
    	TL0=(65536-50000)%256;				
    	numl++;
    	if(numl==20)										
    	{
    		numl=0;
    		flag=1;											
    	}
    }
    void main()
    {
    	int i,hg=0,hd=0,mg=0,md=0,sg=0,sd=0,pd;
    	wei=0;
    	duan=0;
    	TMOD=0x01;										
    	TH0=(65536-50000)/256;				
    	TL0=(65536-50000)%256;				
    	TR0=1;												
    	ET0=1;												
    	EA=1;													
    	while(1)
    	{
    		if(flag)
    		{
    			flag=0;										
    			sd++;									
    		}
    			if(sd==10)
    			{
    				sd=0;
    				sg++;
    			}
    			if(sg==6)
    			{
    				sg=0;
    				md++;
    			}	
    			if(md==10)
    			{
    				md=0;
    				mg++;
    			}	
    			if(mg==6)
    			{
    				mg=0;
    				hd++;
    			}
    			if(hd==10)
    			{
    				hd=0;
    				hg++;
    			}
    			if(hg==2&&hd==4)
    			{
    				hd=0;
    				hg=0;
    			}
    			for(i=0;i<8;i++)
    			{
    				wei=1;
    				P0=0x01<<i;
    				wei=0;
    				duan=1;
    				switch(i)
    				{
    					case 0:P0=num[hg];break;
    					case 1:P0=num[hd];break;
    					case 2:P0=num[10];break;//输出-
    					case 3:P0=num[mg];break;
    					case 4:P0=num[md];break;
    					case 5:P0=num[10];break;
    					case 6:P0=num[sg];break;
    					case 7:P0=num[sd];break;
    				}		
    				duan=0;
    				delay_10us(150);
    				wei=1;
    				P0=0x00;
    				wei=0;
    				duan=1;
    				P0=0xff;
    				duan=0;
    				delay_10us(30);
    			}
    	}	
    }

     

    展开全文
  • 51单片机 定时器及其应用

    千次阅读 多人点赞 2018-11-05 22:51:40
    89c51单片机内部有两个16位的定时/计数器,即定时器T0和定时器T1,单片机的定时功能其实就是通过计数来实现的,当单片机每一个机器周期产生一个脉冲时,计数器就加一。定时器的应用涉及到中断方面的知识,可以先了解...

    89c51单片机内部有两个16位的定时/计数器,即定时器T0和定时器T1,单片机的定时功能其实就是通过计数来实现的,当单片机每一个机器周期产生一个脉冲时,计数器就加一。定时器的应用涉及到中断方面的知识,可以先了解中断的概念再来看定时器

    如,一个16位的定时器,它所能计数的范围是0~65535,如果单片机采用的是12M的晶振,那么定时器单次最长的时间为65535*((1/12)*12),因为一个一个机器周期等于12个振荡周期,那么定时器加一所用的时间是1/12M*12是1us,也就是一个12MHz晶振的51单片机单次最长时间约为65ms.

    定时器的控制

    89c51的定时器由两个寄存器控制,分别是工作模式寄存器TMOD和控制寄存器TCON

    工作模式寄存器TMOD是用于控制定时器0/1的工作模式,通过对TMOD进行赋值,则可以改变定时器的工作模式

    具体各位的定义如下

    当我们使用定时器功能时,就只用设置D0、D1、D4、D5的的值就可以了,其余位置0即可

    我们在使用定时器时基本使用的是模式1和模式2,模式0与模式3基本不用,我就不进行描述了。

    模式1

    当TMOD的D5位置0,D4位置1时,即为定时器T1的模式一,该模式对应的是一个16位的定时器,寄存器TH1和TL1即为T1初值的高8位和低8位,定时时间为:(65536-T1的初值)*振荡周期*12

    模式二

    当TMOD的D5位置1,D4位置0时,即为定时器T1的模式二,该模式对应的是一个可以自动装载的8位定时器,当定时器计数满了(计数溢出时),会自动把TH1中的内容重新装载到TL1中,那么模式二计数的最长时间即为(257-T1的初值)*振荡周期*12

     定时器的控制寄存器TCON

    TCON的各位定义如下

    TF1:T1的溢出标志位,当T1溢出时,由硬件自动使TF1位置1,并向CPU申请中断。当CPU响应中断进入中断服务子程序后,TF1又被硬件自动清0,也可以用软件清0.

    TF0:T0溢出标志位。其功能和操作情况同TF1

    TR1:T1的运行控制位,当该位置1时,即启动定时器1当该位置0时,即关闭

    TR0:T0的运行控制位,其功能及操作情况同TR1。

    接下来我将用定时器来结合数码管制作一个0-9计时器

    具体操作如下(定时器的初始化在程序最下面)

    include <reg52.h>  //引用了51单片机的官方库文件 

    void T0INI() ;                           //定时器0初始化函数声明                       
    unsigned int temp = 0,i = 0;    //中间变量
    unsigned char leddata[]={        //定义一个字符型数组用来存放共阳极数码管数字显示
     
                    0xC0,  //"0"
                    0xF9,  //"1"
                    0xA4,  //"2"
                    0xB0,  //"3"
                    0x99,  //"4"
                    0x92,  //"5"
                    0x82,  //"6"
                    0xF8,  //"7"
                    0x80,  //"8"
                    0x90,  //"9"
                    0x88,  //"A"
                    0x83,  //"B"
                    0xC6,  //"C"
                    0xA1,  //"D"
                    0x86,  //"E"
                    0x8E,  //"F"
                    0x89,  //"H"
                    0xC7,  //"L"
                    0xC8,  //"n"
                    0xC1,  //"u"
                    0x8C,  //"P"
                    0xA3,  //"o"
                    0xBF,  //"-"
                    0xFF,  //熄灭
                    0xFF  //自定义
     
                             };

    void main()
    {
           T0INI();
            while(1)
            {
                P2 = 0x0e;                  //位选段P20置0
                P0 = leddata[i];         //数码管显示
                if(TF0 == 1)             //当定时器计数溢出时
                        {
                                TH0 = 0X3c;           
                                TL0 = 0xb0;            //给定时器高8位和低8位重新赋值
                                temp++;                 //50ms加1
                        }
                
                    if(temp == 20)               //计数到20次也就是一秒
                             i++;                      //数码管显示值加一
                        if(i == 10)
                             i = 0;           
            }
    }  

    void T0INI()    //定时器T0初始化
    {
        IE = 0x82;                //cpu开总中断  ,定时器T0溢出中断允许 
        TCON = 0x10;        //打开定时器T0
        TMOD = 0x01;        //设置T0为工作模式1,16位定时计数器
        TH0 = 0X3c;
        TL0 = 0xb0;            //12Mhz定时50ms
    }

    展开全文
  • 51单片机利用定时器中断制作秒表

    千次阅读 2019-04-13 21:47:06
    单片机利用定时器中断制作秒表 #include #define LED P0 sbit LA=P2^4; //对应着138译码器C,B,A端口 sbit LB=P2^3; sbit LC=P2^2; sbit start=P3^1;//三个键控制开关和暂停 sbit pulse=P3^0; sbit end=P3^2; char...

    单片机利用定时器中断制作秒表

    #include
    #define LED P0
    
    sbit LA=P2^4; //对应着138译码器C,B,A端口
    sbit LB=P2^3;
    sbit LC=P2^2;
    
    sbit start=P3^1;//三个键控制开关和暂停
    sbit pulse=P3^0;
    sbit end=P3^2;
    
    char count; //中断次数定义
    unsigned  int sec; //秒数
    char i0,i1,i2,i3; //led数码管的0~4位
    unsigned char Display[10]= {0x3f,0x06,0x5b,0x4f,0x66,
                                0x6d,0x7d,0x07,0x7f,0x6f}; //led数码管段码
    void show(char j0,char j1,char j2,char j3); //显示秒数的函数
    void TransfromData(unsigned int sec); //数据处理,将秒数转换为个十百千万
    void Delay10ms(); //延时函数
    void main() 
    {
    	EA=1; //打开总中断
    	ET0=1;//打开定时器中断0
    	TMOD=0x01;//选择工作模式1
    	TH0=(65536-50000)/256;//定时50ms需要的高位初始化
    	TL0=(65536-50000)%6;//定时50ms需要的低位初始化    
      	while(1)
      	{
    		show(0,0,0,0);//未开始时显示0000
    
        	if(start==0 )
        	{
    			Delay10ms();//延时消抖
       			if(start==0)
      			{
    				TR0=1; //开始计数
    				while(pulse!=0 && end!=0) //未按下pulse或者时显示计时
    				{
    					TransfromData(sec);
    					show(i0,i1,i2,i3);
        			}
       
        			if(end==0)//按下end后的操作
    				{
    					TR0=0;
    					TH0=(65536-50000)/256;
          				TL0=(65536-50000)%6;
    					sec=0;
    					count=0;
    					//未下start的操作,一旦按下start可以跳出循环,由于按下按键有几十毫秒的时间
    					//在程序开始处仍然可以将start认为是按下的,又开始继续工作
    					while(start != 0)
    					{ 
        					show(0,0,0,0);
    					}
    				}
        			if(pulse==0)//按下pulse后的操作
        			{
        				TR0=0;
    					while(start != 0)
    					{
    						TransfromData(sec);
        					show(i0,i1,i2,i3);
    					}
    				TR0=1;
    				}
    			} 
    		}
    	}
    }
    void TransfromData(unsigned int s) {
    	i3=(s/1000);
    	i2=(s-i3*1000)/100;
    	i1=(s-i3*1000-100*i2)/10;
    	i0=s;
    }
    
    void int_T0() interrupt 1 {
    
    	TH0=(65536-50000)/256;
    	TL0=(65536-50000)%6;
    	count++;
    	if(count==20) 
    	{
    		sec++;
    		count=0;
    	}
    }
    void show(char j0,char j1,char j2,char j3)
    {
    	char i;
    	char j;
    	for(i=0; i<4; i++) 
    	{
    		switch(i) //通过switch语句进行段选和位选
    		{
    			case(0):LA=0;LB=0;LC=0;LED=Display[j0];break;
    			case(1):LA=0;LB=0;LC=1;LED=Display[j1];break;
       			case(2):LA=0;LB=1;LC=0;LED=Display[j2];break;
    			case(3):LA=0;LB=1;LC=1;LED=Display[j3];break;
    		}
    		j=10;while(j--) ;
    		LED=0x00;
    	}	
    }
    void Delay10ms()
    {
    	unsigned char i, j;
    	i = 108;
    	j = 145;
    	do
    	{
    		while (--j);
    	} 	while (--i);
    }
    
    展开全文
  • 51单片机定时器0实现流水灯

    万次阅读 2016-05-13 21:09:09
    51单片机定时器0实现流水灯的代码如下,用P1口接led灯,代码如下都有注释就不具体解释了,英语不怎么好,有的地方将就一下了,本次主要讲一下P1口怎么赋值的。原先写的都是用查表来移位的,个人感觉不怎么好,麻烦...

    51单片机用定时器0实现流水灯的代码如下,用P1口接led灯,代码如下都有注释就不具体解释了,英语不怎么好,有的地方将就一下喽,本次主要讲一下P1口怎么赋值。原先写的都是用查表来移位的,个人感觉不怎么好,麻烦。直接用位运算的比较好。 n初始值为0,然后n每次循环都加1,P1口赋值语句为: P1=~(0x01<< n) ; 此处注意和P1=~(0xfe<< n) ; 的区别。

    /*********调用头文件*****************/
        #include<reg51.h>
        #include<intrins.h>
    
        /***********宏定义*******************/
        #define uint unsigned int   
        #define uchar unsigned char 
        #define long_time0 10    //定时器0定时时间,每次50ms
    
        /************定义全局变量************/
        uint n=0;                //循环移位变量
    
        /************子函数声明**************/
        void init_time0(void);   //定时器0初始化子函数
    
        /*************主函数*****************/
        void main(void)
        {
            init_time0();
    
        }
    
        /*********定时器0初始化函数**********/
        void init_time0(void)
        {
                EA=1;                   //开总中断
                ET0=1;                  //开定时器0中断
                TMOD=0X01;              //选择方式1
                TH0=(65536-50000)/256;  //每次定时50秒
                TL0=(65526-50000)%256;
                TR0=1;                  //开启定时器
                while(1);               //等待定时器0中断
        }
        /************定时器中断函数**********/
        void time0(void) interrupt 1 using 0
        {
            static uint i=0;
            i++;
            if(long_time0==i)
            {
                P1=~(0x01<<n);          //P1=~(0xfe<<n);
                if(++n==8)n=0;
                i=0;                    //定时时间到清零
            }
            TH0=(65536-50000)/256;      //重新装入初值
            TL0=(65526-50000)%256;
        }
    展开全文
  • 51单片机基于定时器的精准呼吸灯

    千次阅读 多人点赞 2019-12-09 10:24:58
    51单片机基于定时器的精准呼吸灯 设计目的:实现LED小灯从最暗到最亮再到最暗的循环显示 最暗——最亮——最暗 整个周期为2.88秒(符合呼吸频率) 以下代码可调,可以自己定义时间。 51单片机 P2接LED。 只需要把...
  • 单片机定时器设计一段门铃 硬件连接: 代码: #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit Key = P1^7; sbit DoorBell = P3^0; uint p = 0; void Timer0() interrupt...
  • 利用51单片机定时器设计一个时钟 一、功能要求 1602液晶显示时间,且每秒更新,自动计时。 用3个按键实现调节时、分、秒更能,可以定义为功能键、增加键、减小键。 当按键被按下时,蜂鸣器响一声提示。 利用AT24C...
  • 51单片机的延时及定时器

    万次阅读 2017-02-25 16:33:36
    经常看些东西,有时在书上,有时在网上,还有的是突然醒悟,也该做一些总结,最近想总结一下单片机的定时以及延时问题。 单片机主要是两种延时方式: 1.硬件延时:要用到定时器/计数器,这种方法可以提高CPU的工作...
  • 51单片机利用定时器和1602液晶显示实现一个计时器 说明 1.平台:windows10 64位教育版 2.工具:普中科技HC6800-ES V2.0 、keil uVision 2 3.注意:芯片STC89C52,8位1602液晶显示 原理 笔者参考的是郭天祥的《新概念...
  • 51单片机:有趣的定时器实验

    千次阅读 2019-06-11 11:25:34
    51单片机:有趣的定时器实验 本以为考完试搞完课设就没啥单片机啥事了,结果莫名的来了软件工程软件基础训练,训练Proteus和Keil软件。我嘞天,之前天天用好不?这课程安排的emmmmm,我还要其他课设好不?真是没办法...
  • STM32F103系列的单片机定时器

    千次阅读 2018-07-22 19:33:08
    STM32F103系列的单片机一共有11个定时器,且所有定时器的技数频率均为72MHZ,其中:2个高级定时器4个普通定时器2个基本定时器2个看门狗定时器1个系统嘀嗒定时器出去看门狗定时器和系统滴答定时器的八个定时器列表;...
  • #include #define SEGPORT P0 sbit bit_select = P2^0; sbit seg_select = P2^1; unsigned char duanma[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};...
  • 基于51单片机可调时的万年历程序(利用定时器) 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown...
  • (基于51核的STC12C5A60S2,keil uvision5 mdk 5.25 编译) #include <STC12C5A60S2.h> //选择对应的代码进行测试 1——运行,0——不运行 sbit LED1 = P2 ^ 4; sbit LED2 = P2 ^ 5;...sbit...
  • 此时钟利用的是定时器的简单时钟,可以利用独立键盘进行分,时的调整,并利用数码管进行显示 #include #include #define uint unsigned int #define uchar unsigned char sbit wela=P2^7; sbit dula=P2^6; sbit s2=...
  • 利用定时器计数器2作为串口波特率发生器(reg52.h文件缺少对T2CON的定义,需自己定义,在reg52.h头文件加sfr T2CON = 0xC8;)。 程序如下: #include "reg52.h" #include "intrins.h" #include "stdio.h" #define u8...
  • 利用51单片机制作一个秒表的详细过程

    万次阅读 多人点赞 2017-07-25 19:08:35
    利用51单片机制作一个秒表的详细过程 前面的话: 和很多朋友一样,在学51单片机的过程中我们肯定会涉及到制作一个秒表,牵涉到把单片机的多个部分组合起来使用,这对于我们初学者来说可能显得有些困难,我同大家...
  • 用stm32做项目时,需要用定时器做一个秒表计时,但发现秒表总是比实际慢,百思不得其解,最终求教高人,得以解决,现将心得整理如下,以警醒自己方便他人! int main(void) {   u16 i;  s8 key_value;   ...
  • 经过几天的学习之后,我对STM32的系统定时器产生了一些心得和体会,现记录下来,供大家参考交流。 当然,欢迎大家指出其中的错误和不足。现在进入正文。 首先,STM32的系统定时器是什么呢? 这次百度百科查不到...
  • 本例程由c语言编写,使用stc89c52rc单片机定时器实现,6ms周期pwm输出,实现led灯31级亮度调节。
1 2 3 4 5 ... 20
收藏数 1,436
精华内容 574
关键字:

单片机制作定时器