-
2021-04-21 18:08:47
#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit led1=P1^0; uchar num; void main() { TMOD=0x01; TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1; while(1) { if(num==20) { num=0; led1=~led1; } } } void T0_time() interrupt 1 { TH0=(65536-45872)/256; TL0=(65536-45872)%256; num++; }
更多相关内容 -
用定时器T1查询方式控制单片机发出1KHz音频-综合文档
2021-05-23 08:43:34用定时器T1查询方式控制单片机发出1KHz音频 -
51单片机定时器T1在工作方式2下生成占空比40%的方波
2018-05-24 14:29:29使用51单片机定时器T1在工作方式2下生成占空比40%的方波,并且在仿真软件里调试出来 -
怎么利用555定时器产生1Hz脉冲的方波发生器
2021-01-20 00:28:48555定时器做一个频率为1Hz的秒脉冲发生器 原理就是直流电震荡后升压,比如说1个小功率电棍,利用6V-12V直流电源可产生一种高压脉冲。电路中三极管Q1、Q2构成了一振荡器,产生频率为3Hz的直流脉冲电压,并输入变压器... -
使用定时器0以方式1产生周期为20ms的等宽正方波连续脉冲,并由P1.2输出,以查询方式完成。
2017-11-12 11:13:22使用定时器0以方式1产生周期为20ms的等宽正方波连续脉冲,并由P1.2输出,以查询方式完成。 -
定时器中断实验 编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。
2021-01-07 18:22:01编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。 程序: #include<reg51.h> sbit fm=P2^3; unsigned char cnt; int main(void) { TMOD=0x01; TH0=(65536-46083)/256; TL0=(65536-46083)%256;...编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。
程序:
#include<reg51.h>
sbit fm=P2^3;
unsigned char cnt;
int main(void)
{
TMOD=0x01;
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
cnt=0;
TR0=1;
EA=1;
ET0=1;
while(1);
}
void int0_timer (void) interrupt 1
{
cnt++;
if(cnt1)
{
fm=0;
}
if(cnt2)
{
fm=1;
cnt=0;
}
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
} -
《51单片机定时器小练习》—利用定时器实现方波发生器
2021-01-20 11:05:26索引任务要求Proteus仿真图程序代码 如果有朋友对定时器还不太了解,可以看一下这篇文章 链接: 《单片机定时器总结》—用最简洁的方式学会51单片机定时器。. 任务要求 -
034 利用定时器产生乐曲_单片机_利用定时器产生乐曲_
2021-09-30 06:43:11利用定时器产生乐曲,包含仿真图与C语言代码 -
51单片机程序源码例子6.利用定时器和蜂鸣器唱歌
2021-05-08 16:53:4451单片机程序源码例子6.利用定时器和蜂鸣器唱歌 -
定时器计数器T1典例
2021-01-06 06:46:24(利用定时器T1,方式0,方式1,方式2.分别编写三个程序实现),输出的方波在Proteus利用示波器观看)交作业的时候交Proteus工程文件还有源程序,截图在作业本上,程序也写在作业本上) 答:方式0:#include sbit P1... -
如何基于51单片机利用定时器的实现PWM的方法详细概述
2021-01-19 18:28:14大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。... -
利用定时器产生乐曲.zip
2021-08-31 16:25:10源代码+仿真+电路图 -
中断系统应用实例(1)用定时器T1工作方式1控制两个LED以不同周期闪烁
2020-06-05 13:53:38利用定时器T1工作方式1控制两个LED以不同周期闪烁,使得LED1每秒闪烁4次(即周期为250ms),LED2每秒闪烁1次(即周期为1s)。 2.控制分析 2.1 LED侧分析 若要使LED1每秒闪烁4次(即周期为250ms),LED2每秒闪烁1次...1.控制目标
利用定时器T1工作方式1控制两个LED以不同周期闪烁,使得LED1每秒闪烁4次(即周期为250ms),LED2每秒闪烁1次(即周期为1s)。
2.控制分析
2.1 LED侧分析
若要使LED1每秒闪烁4次(即周期为250ms),LED2每秒闪烁1次(即周期为1s),那么需要分别给P1.0和P1.2接口分别输出周期为250ms(高低电平分别125ms)和1000ms(高低电平分别500ms)的方波。
2.2 程序分析
因为LED1和LED2的周期刚好是倍数关系,因此可以考虑定时器设置为125ms溢出,那么每溢出一次P1.0取反一次,每溢出四次P1.1取反一次。但是T1是16位定时器,那么最大仅为65535,机器周期为1.085us,则单次最多只能计时约71.1ms,因此我们可以考虑采用62.5ms溢出,那么每溢出2次P1.0取反一次,每溢出8次P1.1取反一次。
初值计算:单片机内部的时钟振荡器产生11.0529MHz的脉冲信号,经12分频后得到11.0529/12MHz的脉冲信号,那么经过62.5ms需要的脉冲信号为62.5ms/((12/11.0529)*10^(-3)ms)≈57567次,即T1设定初值应为57567次。3.程序编写
#include<reg52.h> #include<intrins.h> sbit LED1=P1^0; sbit LED2=P1^1; //LED灯位定义 unsigned char sum1; unsigned char sum2;//全局变量定义,用以对溢出次数计数 void main() { EA=1; //开总中断 ET1=1;//允许T1中断 TMOD=0X10;//M1=0,M0=1,即T1被设定为定时器、工作方式1 TH1=(65536-57567)/256; //T1高八位设初值 TL1=(65536-57567)%256; //T1低八位设初值 TR1=1; //T1启动 sum1=0; sum2=0; while(1) ; //一直循环等待中断 } void Tim1() interrupt 3//中断服务函数,T1的中断编号为3 { sum1++; sum2++;//每溢出一次sum1和sum2加1 if(sum1==2) { LED1=~LED1; sum1=0; } if(sum2==8) { LED2=~LED2; sum2=0; } TH1=(65536-57567)/256; //T1高八位设初值 TL1=(65536-57567)%256; //T1低八位设初值 //注意一定要再次对T1重新赋初值,否则溢出一次后将会从0开始计数 }
-
怎么利用555定时器产生1hz脉冲的方波发生器
2020-07-12 07:36:58电路中三极管Q1、Q2构成了一振荡器,产生频率为3Hz的直流脉冲电压,并输入变压器比为6V:240V升压器的初级线圈,在每个脉冲结束时,相应地在变压器的次级线圈产生一高电压。脉冲的重复频率可通过选择C2、R1值进行... -
C语言05-利用定时器测量脉冲宽度(STC32G-DEMO-CODE-220311kw)
2022-06-14 05:51:06C语言05-利用定时器测量脉冲宽度(STC32G-DEMO-CODE-220311kw)C语言05-利用定时器测量脉冲宽度(STC32G-DEMO-CODE-220311kw)C语言05-利用定时器测量脉冲宽度(STC32G-DEMO-CODE-220311kw)C语言05-利用定时器测量... -
51单片机定时器工作方式1、2原理详解
2019-08-09 18:38:361.本篇博文旨在帮助那些像我一样刚入门51单片机,如果你对定时器有一定了解,但是其中的的工作方式不能理解,那么这篇文章很适合你,如果你是大神的话…直接绕行吧…… 2.我在学习的过程中由于知识上的不足很多的...写在前面
1.本篇博文旨在帮助那些像我一样刚入门51单片机,如果你对定时器有一定了解,但是其中的的工作方式不能理解,那么这篇文章很适合你,如果你是大神的话…直接绕行吧……
2.我在学习的过程中由于知识上的不足很多的讲解看不懂,在翻找了许多资料真正理解之后,打算以一种简单易懂的方式进行解释,这是一份很 详尽基础 的讲解手册。
3.全文以定时器0为例,定时器1的用法与其相同。
4.由于是讲定时器实现原理,文章文字显得较多,不过都是很简单的文字,只要认真看都能看得懂。
知识填充
虽然看懂这篇博文不需要太多的知识储备,但是在这里还是做一个简单的知识普及,便于下文的讲解
- 4位二进制数可以和1位十六进制数相互转化,如二进制数1111转化为十六进制是0xf; 二进制转化11111111转化为十进制是255。
- 51单片机的时钟周期由晶振决定,假定晶振频率是12M,那么它的时钟周期为1/12M,机器周期是12倍的时钟周期,即为12/12M,文章以12M晶振为例讲解。
方式一
工作原理
采用方式1时,计数位数时16位,由TH0作为高八位,TL0 作为低八位,组成16位加一计数器,在TR0 置1后单片机开始计时,每经过一个机器周期单片机输出一个脉冲使定时器加一,加到16位全为1时会溢出,使TF0 置1,利用此性质可以去执行相应的功能,TF0置1是一个信号。
若 TH0 和 TL0 的初值都为0(即整个定时器的值为0000000000000000),当16位全为1时,单片机一共输出了655361个脉冲,时间经过了65536*12/12M秒钟即为65.536ms。初值的设定
那么问题来了,我们想要利用的时间都是1s,2s这种,而不是65.536ms,如果能让开始计时到TF0 置1这个时间变成50ms这种,就能够通过几次计数溢出达到计时1s钟的目的,这就到了初值的计算。
由之前的分析可知,单次计时最长为65.536ms,以单次定时50ms(0.05s)为例,需要20次可以定时1s钟。假设开始计时时16位定时器的初值为x,由于单片机定时固定到达65536溢出,那么(65536-x)*12/12M = 0.05,可计算得到x = 15536。化为16进制为0x3cb0。那么TH0 = 0x3c, TL0 = 0xb0;2代码实现
定时1s钟的代码如下:
#include<reg52.h> void main() { unsigned char cnt = 0; TMOD = 0x01; //设置定时器为工作方式1 TH0 = 0x3c; TL0 = 0xb0; //设置初值 TR0 = 1; //打开定时器开关,开始定时 while(1) { if(TF0 == 1) { TF0 = 0; TH0 = 0x3c; TL0 = 0xb0; //单次计时完成后,TH0 与TL0 的值均为11111111,所以需要对他们重新赋初值 cnt++; if(cnt == 20) { cnt = 0; //此处填写定时完成时要执行的功能 } } } }
方式二
工作原理
方式2是自动重装初值的8位计数方式,在本质上是与方式1一样的。在工作方式2中,TH0 只起到为TL0 重装初值的作用,并不参与计数。当TL0 计数到全为1时再有一个脉冲就会触发溢出,TL0 的溢出不仅使TF0 置1,TF0置1是一个信号 ,而且将TH0内容重新装入TL0 ,TH0 内容由代码设置,重装时值不变,然后进行新一轮的定时 ,这就是所谓方式2自动重装初值。
初值的设定
方式2的初值的计算方式和方式1相同,与方式1不同的是:由于方式2只有TL0 计数,最多可以记256个脉冲(8位从全0编为全1),单次定时最长也就只有0.256ms(方式1为65.536ms)
依然以定时1s钟为例,单次定时时间为0.2ms,设初值为x,(256-x)*12/12M = 0.2**10-3(0.2乘10的-3次方,由于格式问题只能打两个星号……),解得x = 56,化为十六进制为0x38,则TH0 和TL0 的初值均为0x38;代码实现
#include<reg52.h> void main() { unsigned int cnt = 0; TMOD = 0x02; TH0 = 0x38; TL0 = 0x38; TR0 = 1; if(TF0 == 1) { TF0 = 0; //TH0 = 0x38; //TL0 = 0x38; 这两处由于是自动重装初值,所以单次定时结束后不需要再赋值 cnt++; if(cnt == 5000) { cnt = 0;//单次定时0.2ms,5000次后定时1s //此处填写定时完成时要执行的功能 } } }
效果跟方式1相同3,
经过笔者实验方式2更精准一些?咱也不知道,咱也不敢问
16位全为1的二进制数的值为216 = 65536 ↩︎
计算初值还有另外一个方法,就是以产生的脉冲次数(频率)为中心。
单片机时间频率为12M,机器频率为12M/12,即定时1s钟定时器计数的个数为12M/12(我在这里卡住很长时间,不太好理解),但是方式1单次计数个数最多为65536,远远达不到12M/12次。
计时1s单片机计数个数为12M/12.那计时50ms(0.05s)计数个数就应该是(12M/12)/ 20 = 50000,那初值就应该是15536。 ↩︎不知道读者有没有注意到,在定义cnt变量时,方式1采用的是unsigned char cnt = 0; 而方式2采用的却是unsigned int cnt = 0; 这里涉及到了数据结构的问题,我会在其它博文里提到,这里只需简单理解为方式2中cnt的值过大,unsigned char型容不下就行了。 ↩︎
-
利用定时器中断方式控制led灯的闪烁速度_【单片机自学】4.定时器
2020-11-20 09:08:531硬件连接定时器是单片机内部的特殊功能模块。在控制系统中,常常要求有一些实时时钟以实现定时或者延时控制,如定时中断、定时检测、定时扫描等等,也往往要求有计数器,对外部事件进行计数。要实现定时或者延时... -
定时器/计数器的4种工作方式及应用
2021-05-23 09:51:41在前面的学习中,我们已经知道通过设置TMOD的M1、M0两位,可以选择...工作方式0及应用当M1M0=00时,T0采用方式0工作,如图5-2所示,此时T0是一个由TL0的低5位和TH0的8位构成的13位计数器(注:TL0的高3位未用)。图... -
51单片机利用定时器0延时1分钟P1间隔闪烁
2020-06-15 08:30:4751单片机利用定时器0延时1分钟P1间隔闪烁 // An highlighted block #include <reg51.h> #define uchar unsigned char void delay60s(); void main(void) { while(1) { P1=0x00; delay60s(); P1=0xff; ... -
利用STM32F4系列基本定时器写延时程序
2021-01-06 03:54:20STM32F4系列基本定时器TIM6 TIM7前言必须了解定时器时钟频率影子寄存器代码设计参考 前言 在一些需要的情况下软件延时十分必要,有时为了测试方便大都直接用了while(–i)或者for循环大致延时下看看就可以了。当需要... -
定时器0的方式1 定时器1的方式1 数码管和led
2014-07-16 17:03:27#include #define uchar unsigned char #define uint unsigned int sbit dula=P2^6;...sbit led1=P1^0; uchar code table[]= { 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f, 0x7 -
利用定时器0,工作方式1实现LED1亮一秒,灭一秒
2012-12-11 17:16:53/*****************************...功能:利用定时器0,工作方式1实现LED1亮一秒,灭一秒( LED1=P1^7;) 时间:2012.12.10 作者:荆轩道 ************************************************************/ #include -
基于51的时钟程序,利用定时器来计时,通过按键调整时间,可定闹铃。
2021-01-13 23:00:07基于AT89C52单片机做的简易时钟,通过数码管显示小时,分钟,秒,利用定时器来精确计时,可以通过按键调整时分秒的数字,另外可在代码里设置闹铃时间,到达设定值蜂鸣器响起。代码清晰,有备注,方便初学者学习。 -
利用定时器在单片机P1口输出1Mhz方波
2009-10-17 16:43:01利用定时器在单片机P1口输出1Mhz方波 -
51单片机实验 LED半秒闪烁 定时器0方式2 中断实现
2020-12-08 22:05:21要求使用定时器0工作方式2,中断实现。 C语言代码: #include "at89x52.h" sbit LED = P1^0; int cnt = 0; void InterruptTimer0_init() { EA = 1; //打开总中断 TMOD = 0x02; //设置 T0 为模式 2 TH0 = ... -
用定时器T1中断控制两个LED以不同周期闪烁-综合文档
2021-05-23 08:42:52用定时器T1中断控制两个LED以不同周期闪烁 -
51单片机实现 定时器计数 数码管显示0到99.rar
2020-04-12 09:40:47用51单片机 定时器T0的计数功能 实现 两位数码管动态显示0到99 包含两种方式 查询方式和中断方式,内涵原理图和代码 -
STM32单片机利用软件定时器实现分时多任务(使用HAL库编写)
2021-01-20 11:03:391、STM32CubeIDE 配置 LED管脚配置 串口1配置(也就是debug串口) 2、代码 usart.c文件 /* USER CODE BEGIN 0 */ #include stdio.h /* USER CODE END 0 */ . . . /* USER CODE BEGIN 1 */ #ifdef __GNUC__ #... -
CC2530实验代码之定时器T1、T3的使用
2019-03-13 08:41:411) 通过实验掌握 CC2530 芯片 GPIO 的配置方法 2) 掌握 Led 驱动电路及开关 Led 的原理 3) 掌握定时器 T1 的配置与使用 4) 握定时器 T3(8 位)通过中断方式控制 LED1 周期性闪烁 -
STC单片机定时器0和EEPROM读写
2018-04-28 16:06:45STC最新出来的单片机的定时功能和EEPROM的读写功能的实现,