单片机第1季:零基础学51单片机-定时计数器介绍

学习目标:

计数就是计算脉冲个数
1.定时器如何工作
2.寄存器介绍
3.定时器的主要寄存器介绍
4.如何编程和程序代码

学习内容:

1.定时器如何工作
1)先设置好定时器的时钟源( 如果需要的话)
2)初始化时钟相关寄存器
3)设置定时时间( 计数个数)
4)设置中断处理程序
5)打开定时器
在这里插入图片描述
2.寄存器介绍
什么是寄存器
( 1 ) register
( 2 ) 寄存器, 寄存, 内容可变, 一般按位定义
( 3 ) 寄存器使用地址访问, 编程上像内存一样
寄存器的工作原理
( 1 ) 寄存器和硬件之间有双向影响
( 2 ) 软件可以读写寄存器
( 3 ) 总结: 寄存器是软件能够控制硬件的关键
单片机学习的关键就是各种寄存器
( 1 ) 单片机的学习主要包括2 个: CPU 和各种内部外设
( 2 ) 各种内部外设的编程接囗就是寄存器
( 3 ) 熟悉一款单片机其实就是熟悉他的寄存器
( 4 ) 寄存器会随着单片机的复杂化而变复杂
( 5 ) 学会用c 语言操作寄存器的技巧
3.定时器的主要寄存器介绍
定时器的主要寄存器介绍1
TCON
TCON寄存器

( 1 ) 8 个位, 但是有4 个名字: TF 、TR 、IE 、IT , 每个名字的符号都有2 个, 后面分别带0 和1 , 对应T0和T1
( 2 ) TF : timer
flag , 定时器( 溢出) 标志位, 是只读( 软件只是通过读取TFI 来知道硬件的状态, 而不用去写这一位来设置硬件的状态) 的。timer 定时时间到了后会做2 件事情: 第一个是把TF 标志改为1 ,第二个是产生中断让CPU 去中断处理; TF 是硬件清零的( 由1 变0 是自动的, 不需要软件来干预。) 有一些CPU 的设计是需要软件去清零的, 这时候用户的程序就一定要记得给标志位清零, 不然就不能重复进入中断或者反复不停的重复进入中断。
( 3 ) TR就是timer
run , 就是定时器的启动计数的开关。当我们把整个定时器初始化好了之后, 我们给TR 位写1 就可以开启计数了。
TR位和GATE位有一定关联性
(4)GATE是TMOD寄存器中的,也是2个分别对应T0和T1。GATE位中文名叫门控位,工作方式是,当GATE=0时(相当于门是打开的,此时GATE位是可以忽略的),此时定时器开关就只受TR位影响。具体就是TR=1开启计数,TR=0结束计数。当timer处于定时器工作模式时GATE就要等于0;GATE一般是在timer处于计数器模式时用的。当timer用来计数时,很关键的就是什么条件下计数,什么条件下不计数。当GATE=0时计数条件只有TR1一个,TR1=1就计数,TR1=0不计数。当GATE=1时是否计数不仅取决于TR1还取决于INT1引脚(P3.3),实际规则是:当TR1=1并且INT1引脚也为高电平时才会计数。
( 1 ) IE 也是一个标志位, 用就是用展示硬的状态改变的。譬如IE1 对应外部断1 (INT1)
平时不发生INT1时“IE1=0 , 当INT1 发生中断时, 硬件自动IE1=1 , 当CPU 处理了INTI1时硬件会自动给1E1=0 ( 硬件自动清零)。
( 2 ) IT 是用来设置外部中断的中断触发方式的。所谓中断的触发方式, 就是指硬件在某种条件下才会被判定为要产生中断, 所以其实就是中断产生的条件。中断触发方式一般就是: 边沿触发和电平触发2 种。边沿触发又分为: 上升沿触发、下降沿触发、双边沿触发; 电平触发方式分为:高电平触发、低电平触发2 种。

TMOD
TMOD寄存器
( 1 ) GATE上面已经介绍完
( 2 )C/T位设置T0 / TI 工作在定时器模式还是计数器模式。1 表示计数器, 0 表示定时器
( 3 ) MI + M0 , 2 个位一起来表示T0 / TI 处于哪种工作模式下, 一般有4 种: 13 位、16 位、8 位自动重载、双8位。

4.如何编程
( 1 ) 定时(timer 初始化)
( 2 ) 主程该干嘛干嘛
( 3 ) 中断处理程序
我们开发板的定时器最多能订多长时间?
内部时钟频率是1MHz , 时钟周期是1us 。最多能定65535 ( 16 位定时器) , 也就是说最大定时时间为65535 * 1us = 65535us = 65.535ms 。
如果要定比较长的时间( 譬如2s ) , 定时器直接是不能满足的, 解决办法是多次定时后加起来构成一个长时间。
计算TLO 和THO :
( 1 ) 确定自己定时时间, 定为50ms
( 2 ) 确定内部时钟周期, 因为12T 模式, 外部晶振12MHz , 所以为:1us
( 3 ) 定时个数就是: 50ms / lus = 50000
( 4 ) TLO = (65536-50000) % 256 ,THO=(65535-50000) / 256 //因为51是加法计数器所以要减50000
可以使用工具计算
51计数器设置

#include<reg51.h> 		//头文件包含

unsigned char count;//10此对应500ms
sbit LED = P0^1;

void timer0_isr(void) interrupt 1 using 1
{
	TL0	= (65535-50000) % 256;
	TH0 = (65535-50000) / 256;

	if(count--==0)
	{
		//说明已经中断了10次了,500ms到了
		//LED取反
		LED = !LED;
		count = 10;

	}
}

void main(void)
{
	TMOD=0x01;	   //T0设置工作在16位定时器模式下
	//50ms	因为是16位所以最大65ms
	TL0	= (65535-50000) % 256;
	TH0 = (65535-50000) / 256;
	TR0 = 1;			//开启计数器
	//
	ET0 = 1;			//开启T0中断
	EA = 1;    			//开启中断总开关

	count = 10;

	while(1);			//主任务		
}


学习时间:

提示:这里可以添加计划学习的时间

例如:

  • 周一至周五晚上 7 点—晚上9点
  • 周六上午 9 点-上午 11 点
  • 周日下午 3 点-下午 6 点

学习产出:

提示:这里统计学习计划的总量

例如:

  • 技术笔记 2 遍
  • CSDN 技术博客 3 篇
  • 习的 vlog 视频 1 个
51计算器程序#include #include #define uchar unsigned char #define uint unsigned int sbit lcden=P3^4; sbit lcdrw=P3^6; sbit lcdrs=P3^5; uchar num,temp,jia=0,cheng=0,chu=0,jian=0,qing=0; uint key,key1,shu; uchar fuhao,flag1,flag=0; uchar table[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,}; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=114;y>0;y--); } bit lcd_bz() { bit result; lcdrs = 0; lcdrw= 1; lcden = 1; _nop_(); _nop_(); _nop_(); _nop_(); result=(bit)(P0&0x80;); lcden=0; return result; } void write_com(uchar com) { while(lcd_bz()); lcdrs=0; lcden=0; lcdrw=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_date(uchar date) { while(lcd_bz()); lcdrs=1; lcden=0; lcdrw=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void lcd_init() { lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } void keyscan() { P3=0xfe; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xee:key=1;num=0;break; case 0xde:key=2;num=0;break; case 0xbe:key=3;num=0;break; case 0x7e:num=1;break; //¼ÓºÅ } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfd; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xed:key=4;num=0;break; case 0xdd:key=5;num=0;break; case 0xbd:key=6;num=0;break; case 0x7d:num=2;break; //¼õºÅ } while( temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfb; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb:key=7;num=0;break; case 0xdb:key=8;num=0;break; case 0xbb:key=9;num=0;break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值