单片机80ms定时_单片机定时器定时1ms - CSDN
  • 51单片机定时器初值计算

    万次阅读 多人点赞 2017-08-08 09:56:58
    **菜鸟关于51类单片机的定时器初值计算问题的计算**首先先来介绍单片机的几个周期: 1、时钟周期,也称为振荡周期:定义为时钟脉冲的倒数,在单片机中也就等于晶振的倒数。 51单片机中把一个时钟周期定义为一个...
                   **菜鸟关于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单片机定时器初值的计算

    千次阅读 2018-04-12 16:46:46
    51单片机定时器初值的计算: 二、50MS定时器初值的计算: 1.晶振12M 12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。 65536-50000=15536(3cb0) TH0=0x3c,TL0=0xb0 2.晶振...

    51单片机定时器初值的计算:

    二、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 
    

    https://blog.csdn.net/looksun/article/details/38471213

    http://www.21ic.com/jichuzhishi/mcu/timer/2014-06-06/541406.html

    展开全文
  • 51单片机定时时间的计算

    千次阅读 2020-05-06 11:55:03
    单片机根据计时/计数模式的不同,来进行计算 M1 M0 工作模式 说明 0 0 0 13位计时计数器 (8192) 0 1 ...

    单片机根据计时/计数模式的不同,来进行计算

    M1

    M0

    工作模式

    说明

    0

    0

    0

    13位计时计数器 (8192)

    0

    1

    1

    16位计时计数器 (65536)

    1

    0

    2

    8位计时计数器,可自动重新载入计数值 (256)

    1

    1

    3

    当成两组独立的8位计时器(256,T0和T1不能同时用)

    举例:当我们选择模式1,16位计时计数器,16位计数器最大十进制数值为65536。来计算定时50ms所定义TH0与TL0的值

    首先计算计数值:

    计数值=50000us(50ms转换成微秒)*11.0592(晶振大小)/12    计算结果=46080

    再计算TH0=(65536-46080)/256

               TL0=(65536-46080)%256       //8位逢256进位,整除的结果为高位,取余的结果为低位

    展开全文
  • 单片机实现0 ~ 99s的计时,将计时实时显示在LCD上,并用24C02实现掉电记忆。 仿真原理图如下: C语言代码如下: /*------------------------ FileName: clock.h Function: 头文件 Author: Zhang Kaizhou ...

    项目描述:
    用单片机实现0 ~ 99s的计时,将计时实时显示在LCD上,并用24C02实现掉电记忆。
    仿真原理图如下:
    在这里插入图片描述
    C语言代码如下:

    /*------------------------
    FileName: clock.h
    Function: 头文件
    Author: Zhang Kaizhou
    Date: 2019-6-12 18:07:29
    ------------------------*/
    #include <reg52.h>
    #include <intrins.h>
    #include <string.h>
    #define uchar unsigned char
    #define uint unsigned int
    	
    /*IIC总线端口定义*/
    sbit SDA = P2^0;
    sbit SCL = P2^1;
    
    /*LCD1602显示模块端口定义*/
    sbit lcdrs = P1^2;
    sbit lcdrw = P1^3;
    sbit lcden = P1^4;
    
    /*主函数模块函数声明*/
    void writeData24C02(uchar address, uchar dat);
    void readData24C02(uchar address, uchar * dat);
    void checkData(uchar * dat);
    void timerInit();
    
    /*IIC总线模块函数声明*/
    void initIIC();
    void startIIC();
    void responseIIC();
    void stopIIC();
    void writeDataIIC(uchar dat);
    void readDataIIC(uchar * dat);
    
    /*LCD1602显示模块函数声明*/
    void LCDInit();
    void display(uchar dat1, uchar dat2);
    void writeCommand(uchar command);
    void writeDataLCD(uchar dat);
    void delay(uchar xms);
    
    /*--------------------------------------------
    FileName: main.c
    Function: 用单片机实现0 ~ 99s的计时,
    将计时实时显示在LCD上,并用24C02实现掉电记忆;
    Author: Zhang Kaizhou
    Date: 2019-6-12 18:06:18
    --------------------------------------------*/
    #include "clock.h"
    
    /*定义全局变量*/
    uchar second = 0, count = 0;
    bit flag = 0;
    
    void main(){
    	LCDInit();
    	initIIC();
    	readData24C02(1, &second); // 通过IIC总线将24C02的第1个存储单元中的数据读取到变量second中
    	checkData(&second); // 首次读取数据时,原来芯片中的数据可能超过100(非法数据)
    	timerInit();
    	TR0 = 1; // 开始计时
    	while(1){
    		display(second / 10, second % 10);
    		if(flag){
    			flag = 0;
    			writeData24C02(1, second);
    		}
    	}
    }
    
    /*向24C02的任意地址address处写入数据dat*/
    void writeData24C02(uchar address, uchar dat){
    	startIIC();
    	writeDataIIC(0xa0); // 向IIC总线发送寻址信号,并声明要进行写操作
    	responseIIC();
    	writeDataIIC(address);
    	responseIIC();
    	writeDataIIC(dat);
    	responseIIC();
    	stopIIC();
    }
    
    /*从24C02的任意地址address处读出数据到变量dat*/
    void readData24C02(uchar address, uchar * dat){
    	startIIC();
    	writeDataIIC(0xa0);
    	responseIIC();
    	writeDataIIC(address);
    	responseIIC();
    	startIIC();
    	writeDataIIC(0xa1); // 向IIC总线发送寻址信号,并声明要进行读操作
    	responseIIC();
    	readDataIIC(dat);
    	stopIIC();
    }
    
    /*检测从24C02读取的数据是否合法*/
    void checkData(uchar * dat){
    	if((* dat) > 100){
    		* dat = 0;
    	}
    }
    
    /*timer初始化*/
    void timerInit(){
    	TMOD = 0x01; // timer0 定时模式 工作方式1(16位定时器)
    	TH0 = (65536 - 46080) / 256; // 系统晶振为11.0592MHz,定时50ms
    	TL0 = (65536 - 46080) % 256;
    	ET0 = 1; // 开定时器0溢出中断
    	EA = 1; // 开全局中断
    }
    
    /*timer0溢出中断服务程序*/
    void timer0Service() interrupt 1{
    	TH0 = (65536 - 46080) / 256; // 重装初值
    	TL0 = (65536 - 46080) % 256;
    	count++;
    	if(count == 20){ // 50ms * 20 = 1s
    		count = 0;
    		second++;
    		flag = 1;
    		if(second == 100){ // 0 ~ 99s
    			second = 0;
    		}
    	}
    }
    
    /*------------------------------
    FileName: IIC.c
    Function: 实现IIC总线的基本操作
    Author: Zhang Kaizhou
    Date: 2019-6-12 18:08:47
    ------------------------------*/
    #include "clock.h"
    
    /*IIC总线初始化*/
    void initIIC(){
    	SCL = 1;
    	_nop_();
    	SDA = 1;
    	_nop_();
    }
    
    /*IIC总线启动信号*/
    void startIIC(){ // 在SCL高电平期间,SDA产生一个下降沿表示启动
    	SDA = 1;
    	_nop_();
    	SCL = 1;
    	_nop_();
    	SDA = 0;
    	_nop_();
    }
    
    /*IIC总线应答信号*/
    void responseIIC(){ // 从机在SCL高电平期间将SDA拉低表示应答
    	SDA = 0;
    	_nop_();
    	SCL = 1;
    	_nop_();
    	SCL = 0;
    	_nop_();
    }
    
    /*IIC总线停止信号*/
    void stopIIC(){ // 在SCL高电平期间,SDA产生一个上升沿表示停止
    	SDA = 0;
    	_nop_();
    	SCL = 1;
    	_nop_();
    	SDA = 1;
    	_nop_();
    }
    
    /*向IIC总线写一个字节数据*/
    void writeDataIIC(uchar dat){
    	uchar i, temp;
    	temp = dat;
    	for(i = 0; i < 8; i++){
    		temp = temp << 1;
    		SCL = 0;
    		_nop_();
    		SDA = CY;
    		_nop_();
    		SCL = 1;
    		_nop_();
    	}
    	SCL = 0;
    	_nop_();
    	SDA = 1;
    	_nop_();
    }
    
    /*从IIC总线读一个字节数据*/
    void readDataIIC(uchar * dat){
    	uchar i;
    	SCL = 0;
    	_nop_();
    	SDA = 1;
    	_nop_();
    	for(i = 0; i < 8; i++){
    		SCL = 1;
    		_nop_();
    		* dat = ((* dat) << 1) | SDA;
    		SCL = 0;
    		_nop_();
    	}
    }
    
    /*-----------------------------
    FileName:display.c
    Function: LCD1602显示函数
    Author: Zhang Kaizhou
    Date: 2019-6-12 18:09:16
    ------------------------------*/
    #include "clock.h"
    
    uchar code table0[] = {"Timekeeping"};
    uchar code table1[] = {"Time:"};
    uchar code table2[] = {"0123456789"};
    uchar num = 0;
    
    /*初始化LCD1602的设置*/
    void LCDInit(){
    	uchar i;
    	lcden = 0; // 拉低使能端,准备产生使能高脉冲信号
    	writeCommand(0x38); // 显示模式设置(16x2, 5x7点阵,8位数据接口)
    	writeCommand(0x0c); // 开显示,不显示光标
    	writeCommand(0x06); // 写一个字符后地址指针自动加1
    	writeCommand(0x01); // 显示清零,数据指针清零
    	
    	/*LCD上电界面*/
    	writeCommand(0x80); // 将数据指针定位到第一行首
    	for(i = 0; i < strlen(table0); i++){
    		writeDataLCD(table0[i]);
    		delay(5);
    	}
    	
    	writeCommand(0x80 + 0x40); // 将数据指针定位到第二行首
    	for(i = 0; i < strlen(table1); i++){
    		writeDataLCD(table1[i]);
    		delay(5);
    	}
    }
    
    /*LCD显示函数*/
    void display(uchar dat1, uchar dat2){
    	writeCommand(0x80 + 0x40 + strlen(table1));
    	writeDataLCD(table2[dat1]);
    	delay(5);
    	writeCommand(0x80 + 0x40 + strlen(table1) + 1);
    	writeDataLCD(table2[dat2]);
    	delay(5);
    }
    
    /*写指令函数*/
    void writeCommand(uchar command){
    	lcdrs = 0; // 命令选择
    	lcdrw = 0;
    	P0 = command;
    	delay(5);
    	
    	lcden = 1; // 产生一个正脉冲使能信号
    	delay(5);
    	lcden = 0;
    }
    
    /*写数据函数*/
    void writeDataLCD(uchar dat){
    	lcdrs = 1; // 数据选择
    	lcdrw = 0;
    	P0 = dat;
    	delay(5);
    	
    	lcden = 1;
    	delay(5);
    	lcden = 0;
    }
    
    /*延时xms函数*/
    void delay(uchar xms){
    	uchar i, j;
    	for(i = xms; i > 0; i--)
    		for(j = 110; j > 0; j--);
    }
    
    展开全文
  • 单片机定时初始值的设定

    千次阅读 2017-09-26 22:20:13
    其实很简单,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期 机器周期=12/n(n指晶振频率),假设你要定时的时间为M 那么定时的初值为: M/机器周期=初值; TH0=(65536-初值...
  • 8051内部集成了2个16bits的计数器, 可以根据需要将其作为定时器使用.... 如果定时器的定时周期设定为50ms, 则需要50000个脉冲. 由于单片机定时器为加1计数器, 所以, 计数器初始值应设为65536 - 50000 = 15536 = 3C...
  • 单片机定时1ms

    2020-07-28 23:32:51
    程序员对单片机不 太理解的 的看看啊
  • 单片机定时问题:亮100ms、灭300ms

    千次阅读 2016-01-25 11:27:10
    6MHz晶振,用定时计数器1,采用中断方式,通过P1.0让一个发光二极管亮100ms、灭300ms,周而复始。汇编编程实现。悬赏分:20 - 解决时间:2010-1-10 13:14 ;----------------------------------最佳答案:;下列程序,...
  • 单片机,用t0方式1定时50ms,t1用方式1门控计数20次,达到1s延迟,点亮一排灯的c语言代码
  • 51单片机定时中断(三)

    千次阅读 2018-12-02 09:49:32
    振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期) 状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。 机器周期:1个机器周期含6个状态周期,12个振荡周期。 ...
  • 1、我的reg52.h里没有定义T2MOD,故我自行添加sfr T2MOD=0xc9; 2、在代码里我使用了led灯做调试。定时1s,16位定时器调试OK,8位...//时间不能大于71ms,如需更大的定时,需要在定时中断函数里累加71ms //定时时间是ms
  • 当用"delay.h"这个头文件进行软件延时时,...每个定时/计数器既可以实现定时功能,也可以实现计数功能。可以工作在4种定时器模式下。 定时/计数器 51单片机有T0和T1 定时/计数器0的工作原理 在定时方式1下,定时...
  • 实验任务: 使用定时器0定时一定时间并在中断处理程序中执行代码 实现现象:LED1每隔0.5s亮灭变化一次 ... 大值为65535*1us = 65.5ms,若需要定时时间超过65.5ms,则不 能直接定时,需要...
  • 单片机 -长时间定时

    2019-02-28 16:15:02
    由于定时时间较长,一个定时/计数器不能直接实现,可以定时/计数器T0产生周期性为10ms定时,然后用一个寄存器R2对10ms计数50次或定时/计数器T1对10ms计数50次实现。 系统时钟为12MHZ,定时/计数器T0定时10ms,计...
  • 单片机 计数/定时 中断实验

    千次阅读 2016-04-09 10:31:34
    计数/定时实验:方式2的计数器:T0来自P3.4引脚。方式2可以自动重装数进入,比较好用。 ORG 0000H LJMP START START: MOV TMOD,#00000110B MOV TH0,#255//初值 MOV TL0,#255 SETB TR0// 打开T0计数器 LP: JNB ...
  • 利用T0定时器定时100ms,每当定时时间到就使 P1.7 求反。也就是使二极管亮100ms,灭100ms,周而复始。请帮忙把程序写出来,谢谢了!!! 悬赏分:20 - 解决时间:2009-12-4 17:41 ;--------------------------------...
  • 单片机实验-定时中断

    千次阅读 2018-07-22 16:15:50
    1.掌握51单片机定时器工作原理。 2.掌握51单片机中断系统工作原理。 3.掌握定时器初始化编程。 4.掌握中断程序的编写和调试。 二.实验设备和器件 1.KEIL软件 2.PROTEUS仿真软件 3.伟福实验箱 三.实验内容 ...
  • 关于PIC单片机的定时器精准计时的计算 在此用了16C711单片机的TMR0做定时中断,希望实现精准计时,在程序中,TMR0用了晶振的32分频,初值#0FCH,因此POPBEAR兄弟计算出每个定时中断的计时时间为(256-X)*32*4/32768=...
  • MCS51系列的单片机通常有2个16位可编程定时/计数器,即定时器0和1 (MCS52系列还有一个定时/计数器2) 可编程的意思是指其功能(如工作模式、定时时间、启动方式等)可由指令来确定和改变。通常都是赋值指令给相关...
  • 51单片机定时/计数器的功能实现

    千次阅读 2017-05-08 16:12:21
    8051单片机内部有两个16位的定时/计数器:T0和T1 定时器用途:延时和脉宽测量 读取方式:软件读取和中断 公式: T(初值)=2^N-定时时间/机器周期时间 机器周期时间=12/fosc N:代表几位定时器,有13 16...
1 2 3 4 5 ... 20
收藏数 4,752
精华内容 1,900
关键字:

单片机80ms定时