利用51单片机的定时器_51单片机利用定时器中断按键控制小灯 - CSDN
  • 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);
    			}
    	}	
    }

     

    展开全文
  • //功能:实现LED灯闪烁 #include "reg52.h" #define X 50000 //宏定义一个数,方便修改时间 sbit led_1 = P1^0; //定义P1口的第1位(即P1.0) unsigned char count; //定义全局变量,不用赋值,默认为0 ...
    //功能:实现LED灯闪烁
    #include "reg52.h"  
    #define X 50000				//宏定义一个数,方便修改时间	
    sbit led_1 = P1^0;			//定义P1口的第1位(即P1.0)
    unsigned char count;		//定义全局变量,不用赋值,默认为0
    void init();
    void main ()
    {	
    	init();
    	while (1)	
    	{
    	 	if(count == 20)		//每一秒进入一次if函数
    		{
    		 	count = 0;		//count清零,重新开始加
    			led_1 = ~led_1;	//位取反,实现LED等的闪烁效果
    		}
    	}	
    }
    
    void init()
    {
    	EA = 1;						//开启中断总开关
    	ET0 = 1;					//开启定时器0中断开关
    	TMOD = 0x01;				//设置定时器0为工作方式1
    	TH0 = (65536 - X) / 256;	//给定时器赋初值
    	TL0 = (65536 - X) % 256;
    	TR0 = 1;					//使定时器0工作
    }
    
    void LED0() interrupt 1			//定时器0中断服务程序
    {
     	TH0 = (65536 - X) / 256;	//每次进入中断程序要从初值开始计算,否则会导致计算错误
    	TL0 = (65536 - X) % 256;
    	count++;					//每进入一次中断程序,count加一
    }

     

    展开全文
  • 单片机利用定时器中断制作秒表 #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单片机中把一个时钟周期定义为一个节拍(用P表示),2个节拍定义为状态周期(用S表示) 时钟周期是单片机中最小的时间单位。 eg:12M晶振的单片机,时钟周期=振荡周期=1/12 us。2、机器周期:
                   **菜鸟关于51类单片机的定时器初值计算问题的计算**
    
    首先先来介绍单片机的几个周期:   
    

    1、时钟周期,也称为振荡周期:定义为时钟脉冲的倒数,在单片机中也就等于晶振的倒数。
    51单片机中把一个时钟周期定义为一个节拍(用P表示),2个节拍定义为状态周期(用S表示)
    时钟周期是单片机中最小的时间单位。
    eg:12M晶振的单片机,时钟周期=振荡周期=1/12 us。

    2、机器周期:定义为完成一项基本操作所需要的时间,称为机器周期。
    在计算机中,为了方便管理,把一条指令的执行过程分为若干个阶段,每个阶段去执行一项基本操作。
    如:取指令,存储器读,存储器写等。
    在51单片机中1个机器周期由6个状态周期组成,也就是12个时钟周期=12 x 1/12 us =1 us
    定义机器周期是因为时钟周期时间太短,根本做不了什么。

    3、指令周期:定义为执行一条指令所需的时间。
    通常,包含一个机器周期的指令称为单周期指令,比如 MOV指令,CLR指令等。
    包含两个机器周期的指令称为双周期指令。
    另外还有四周期指令。

    小伙伴们看完了上面的周期是不是看懵了………hahahahahahaha

    不要慌,其实我们这节课要用到的就一句话—— 在51单片机中1个机器周期由6个状态周期组成,也就是12个时钟周期=12 x 1/12 us =1 us

    这里我们知道了一个机器周期的时间是1us,所以如果我们要延时1ms就是1000个机器周期;
    可能大家我们刚开始了解定时器的时候都会与疑惑,为什么要用定时器这么麻烦的东西,自己用delay()慢慢调一个合适的参数就可以了。 其实如果深入了解定时器真的比delay() 强大太多我先列举几点:
    1.就如上面所说用定时器定时1ms,这里就要注意了,这个1ms不是和delay延时1ms一样哦,这个1ms是精确的1ms哦,越往后学需要的定时就要求越高,所以定时器是一定要搞定的。

    2.相比于delay计时,delay是要直接让单片机做空循环,死等。而定时器则是利用定时器的溢出间隔,如果时间上不够,可以在溢出中断中配合软件计数器来实现。 前者浪费cpu,后者更高效。
    

    言归正传,现在来计算初值了,直接用例子说明,就比如用定时器0延时50ms

    一言不合,先上代码

    void main()
    {
    TOMD|=0x01;         //设置TMOD工作方式寄存器的M0M1为01,对照表格即为定时器/计数器的4种模式中的16位定时器/计数器模式
        TH0=(65536-46080)/256; //装初值11.0592M晶振定时50ms数为46080
        TL0=(65536-46080)%256;
        EA=1;    //中断总开关
        ET0=1;   //开启定时器/计数器的中断允许位置为1
        TR0=1;   //
        return 0;
    }
    void T0_time() interrupt 1
    {
        TH0=(65536-46080)/256;
        TL0=(65536-46080)%256;
        num++;
        if(num==20)
        {
            num=0;
        }
    }
    首先一个机器周期=12*一个时钟周期=12*(1/晶振)  一般的51晶振频率为11.0592M
    
        则一个机器周期= 1.085069444444444 us     单位是微秒
    

    所以如果要定时50ms 则要50 000/1.085069444444444~=46080个机器周期

        又因为TOMD|=0x01选择了16位的模式,就是TH0高八位 TL0低八位,所以最大到溢出就是65536
    
        故初值设为65536-46080即程序运行了大约46080个机器周期即50ms
    
        而后面的/256 %256就是划分低八位和高八位的
    

    这是我的第一篇博客,就是希望大家有所帮助(虽然有些地方都可以有问题haha),自己的对玩单片机更加的理解,利己利彼。学单片机学acm的都知道,一个点想不清楚的时候网上找到一个好的解答是多么的珍贵。所以希望大家一起加油,在单片机中找到更多的乐趣。。。。。。

    展开全文
  • 51单片机定时器0与计数器1复用定时输出1S
  • 本文详细介绍了51单片机学习过程中定时器的初值计算问题以及相关概念,力求把每一个学习过程中的可能会遇到的难点说清楚,并举相关的例子加以说明。学习完毕,又顺手利用刚学到定时器的相关知识写了一个“定时器...

     

    前言:

           本文详细介绍了51单片机学习过程中定时器的初值计算问题以及相关概念,力求把每一个学习过程中的可能会遇到的难点说清楚,并举相关的例子加以说明。学习完毕,又顺手利用刚学到定时器的相关知识写了一个“定时器初值计算”控制台程序,能够实现:51定时器三种不同工作方式下的初值计算输出,既实用,又能加深对所学知识的理解。


         

       软件使用VS2012编写,实现效果如下,仅仅是控制台程序,没有界面,有兴趣的话可以自己用C#或者QT写个界面,或者做一些功能上拓展,跟我们平常学习51资料中附带的定时器初值计算小工具一样哦!

          

     

       附51系列单片机控制台程序定时器初值核心计算函数源码(完整VS2012工程源码下载

    /*
     * 函数名:Timer_Initial_calculation
     * 描述  :定时器初值计算函数
     * 输入  :无
     * 输出  :无
     */
    void Timer_Initial_calculation()
    {
    	int N;	//计数值 
    	int n;  //定时器位数 
    	int TimeDigit;	//计数总值 
    
    	N = (t*fosc*1000) / 12;     //计算计数值N 
    	//定时器位数选择
    	switch(y)
    	{
    		case 0: 
    			n=13;
    			TimeDigit = pow(2.0,n);      //定时器位数选择 
    			TimingMax = TimeDigit*12/fosc/1000;		//计算定时最长时间 
    			THX = (TimeDigit - N)/32;	//初值高八位 
    			TLX = (TimeDigit - N)%32;	//初值低八位 
    			break;
    		case 1: 
    			n=16;
    			TimeDigit = pow(2.0,n);      //定时器位数选择 
    			TimingMax = TimeDigit*12/fosc/1000;		//计算定时最长时间 
    			THX = (TimeDigit - N)/256;	//初值高八位 
    			TLX = (TimeDigit - N)%256;	//初值低八位 
    			break;
    		case 2: 
    			n=8;
    			TimeDigit = pow(2.0,n);      //定时器位数选择 
    			TimingMax = TimeDigit*12/fosc/1000;		//计算定时最长时间  
    			THX = TimeDigit - N;		//初值高八位 
    			TLX = TimeDigit - N;		//初值低八位 
    			break;
    		default:
    			break;
    	}
    	
    }

       

    下面开始正式介绍定时器初值计算相关内容:

     

    一、系统周期:

    时钟周期

    时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率,则时钟周期为250ns。由于时钟脉冲是计算机的基本工作脉冲,它控制着计算机的工作节奏(使计算机的每一步都统一到它的步调上来)。显然,对同一种机型的计算机,时钟频率越高,计算机的工作速度就越快。但是,由于不同的计算机硬件电路和器件的不完全相同,所以其所需要的时钟周频率范围也不一定相同。我们学习的8051单片机的时钟范围是1.2MHz-12MHz。 在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。

    机器周期

     在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。8051系列单片机的一个机器周期同6个S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。

    指令周期

    指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。

    通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令

     

    二、定时器初值的计算:

    例:对12MHz  1个机器周期 1us  12/fosc = 1us

    方式0  13位定时器最大时间间隔  = 2^13 = 8.192ms

    方式1  16位定时器最大时间间隔  = 2^16 = 65.536ms

    方式2  8位定时器最大时间间隔  = 2^8 = 0.256ms =256 us 

    方式3 仅适用于T0,此时T0分成两个8位计数器,T1停止计数

    当选用定时器的方式1时,设机器周期为Tcy,定时器产生一次中断的时间为t,那么需要计数的个数N=t/Tcy,装入THX和TLX中的数分别为:

    THX = (2^16 - N)/256     TLX = (2^16 -N )%256(此处的X为定时器0或定时器1

    公式为:(2^y - X)*Tcy = t

            Tosc= 1/ fosc

    一个机器周期 = 12个时钟周期 = 12/fosc

    溢出速率 = 1 / 溢出时间        故:初值X = 2^y – t/Tcy

               THX = 高八位   TLX = 低八位

          注:

             X:定时器初值

             N:计数值

             y:定时器工作方式

             fosc:晶振频率

               Tcy:机器周期,Tosc:时钟周期  Tcy = 1/Tosc

     

    例:50ms定时器初值计算:

    1. 晶振12M

    12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。  

                 65536-50000=15536(3cb0)

                 TH0=0x3c,TL0=0xb0

    2.晶振11.0592M

    11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期。

                65536-46080=19456(4c00)

                    TH0=0x4c,TL0=0x00

     

    以12M晶振为例:每秒钟可以执行1000000次机器周期个机器周期。而T 每次溢出 最多65536 个机器周期。我们尽量应该让溢出中断的次数最少(50ms),这样对主程序的干扰也就最小。

     

    三、定时器不同工作方式下赋初值问题:

    1)定时器方式013为计数器,由TL05位(高3位未用)和TH08为组成,因此定时器方式0最多能装载的数为2^19=8192个。当使用定时器方式0时,计数初值

    THX=8192-N/32,TLX=(8192-N)%32.   N 为计数个数=t/Tcy.

    2)定时器方式116为计数器,由TLX8位和THX8位组成的加1计数器。因此最多能装载2^16=65536个数。计数初值为:

    THX=65536-N/256,TLX =(65536-N)%256

         在定时器的方式0和方式1中,当计数溢出后,计数器变为0,因此在循环定时或循环计数时,必须使用软件反复设置计数初值,这样会影响到定时精度,也会使程序设计比较麻烦,使用定时器方式2可解决反复装初值所带来的问题。

    3)定时器方式28位初值自动重装的定时/计数器,THX被作为常数缓冲器,当TLX计数溢出时,在使溢出标志TFX1的同时,还会自动地将THX中的常数重新装入TLX中。方式2适合用作较精确的脉冲信号发生器。计数初值为:

        THX=256-NTLX=256-N

    4)方式3只适用于定时/计数器T0。此时,T0被分成两个独立的计数器。需要注意:当T0工作在方式3时,T1一定不要有中断的场合,因为工作方式3时,T0会占用T1的中断标志位。

     

    取模与取余问题:

    高八位和低八位就像我们十进制的十位和个位,就比如整数89=8*10+9*1;十位上算的“8”当然就是要8910求模,而个位上的9则是8910求余了!至于为什么TH0TL0赋初值要对256求模或求余,那是因为高八位和低八位都是8byte的,也就是它最大只能是“11111111”,化成十进制就是255,再加最前面的“00000000”也就是256个位矢量,所以就要对256求模或求余。

    因为高TH0和低TH0都是八位的 最多能装的数据是255,如果不对255取模取余的话 是装不下的。

           定时器方式013为计数器,由TL05位(高3位未用),所以应对2^5也就是32进行取余、取模。

     

           定时器模式2是自动重装模式, TH0TL0都要用到,TL0是真正的定时/计数器,肯定要有一个初值,在此基础上向上计数,溢出时就将TH0的值装入TL0,不用再次人工写程序干预

     

    四、计数器初值的计算:

    计数器的初值计算要比定时器的相对简单,例如:定时器T1工作在方式2的计数器状态,计算T1的初值:

                     初值X = 2^8 – 计数值

     

    展开全文
  • 1.本篇博文旨在帮助那些像我一样刚入门51单片机,如果你对定时器有一定了解,但是其中的的工作方式不能理解,那么这篇文章很适合你,如果你是大神的话…直接绕行吧…… 2.我在学习的过程中由于知识上的不足很多的...
  • 利用51系列单片机定时器实现脉冲宽度
  • 1.利用实验板和配件,设计一个时钟,时间显示在LCD1602上,并按秒更新,能够在实验板上设计3个按键调整时,分,秒。其功能为:功能选择键,数值增大和数值减小键。利用板上AT24C02设计实现断电保护显示数据的功能。 ...
  • 采用汇编语言,实现51单片机内部定时器产生脉冲的功能,附注释,方便自学。
  • 51单片机定时器可用两种方式处理:查询和进入中断处理。 1.查询方式 void Init_T0 (void) 定时器初始化 { TMOD = 0x01;//计时器模式 TH0 = (65535-65000) /256;//初装值为65536-65000,逐步+1,最后加到65535...
  • 常规方法测量脉冲的频率,利用51单片机的两个定时器来测量,一个定时器来定时,一个定时器作为计数方式;能不能有一个更好的方法,不使用这么多硬件,只使用一个定时器就可以满足需求? 当然可以的,定时器2有输入...
  • 对于刚接触单片机的同学来说可能会对定时器/计数器的应用很蒙圈,特别是初值的计算和各种定时方式的选择。下面希望能给你带来一个清晰的思路。 定时器:一般用于软件计时,给定时器设置一个时间,时间到了系统停止...
  • 定时器是单片机最重要的一个功能,一开始学的时候遇到了不少的问题,通过不断地...在这里我整理了一下定时器的使用,就用51单片机来举例。像别的STC15等系列的单片机其实原理上差不多的,分享给大家希望能帮助大家。
  • 基于51单片机定时器代码,用汇编语言写的,在实际开发板上运行过,有用.
  • 利用51单片机定时器设计一个时钟 一、功能要求 1602液晶显示时间,且每秒更新,自动计时。 用3个按键实现调节时、分、秒更能,可以定义为功能键、增加键、减小键。 当按键被按下时,蜂鸣器响一声提示。 利用AT24C...
  • 基于at89c51的外部定时器0终端实验,包含汇编源码和proteus仿真工程文件。
  • 实现数字时钟的方式是使用单片机定时器来实现的,让数码管动态显示
  • 我们首先需要了解什么是中断? 中断是指CPU在执行某一过程中由于外界原因必须暂停现在的事情,处理别的事情,处理完了再回去执行暂停的事情。 中断的优点? 1.分时操作。 2.实时响应 3.可靠性高 ... ...
  • 单片机中有两个特殊功能寄存器与定时/计数有关,这就是TMOD和TCON。顺便说一下,TMOD和TCON是名称,我们在写程序时就能直接用这个名称来指定它们,当然也能直接用它们的地址89H和88H来指定它们(其实用名称也就是...
1 2 3 4 5 ... 20
收藏数 3,228
精华内容 1,291
关键字:

利用51单片机的定时器