蓝桥杯单片机学习记录(3)(定时器中断/串口)

中断系统

一.外部中断

外部中断源(2个)

INT0:由P3^2端口引入,低电平或下降沿引起

INT1:由P3^3端口引入,低电平或下降沿引起

这两个外部中断源标志和它们的触发方式控制位由特殊功能寄存器TCON的低4位控制

内部中断源(3个)

T0:定时器/计数器0中断,由T0回零溢出引起

T1:定时器/计数器1中断,由T1回零溢出引起

TI/RI:串行I/O中断,串行端口完成一帧字符发送/接收后引起

这三个内部中断源的控制位分别锁存在特殊功能寄存器TCON和SCON中

 

1.允许中断

 2.配置中断方式

 3.编写中断函数

void Int0() interrupt 2  //中断处理函数,加关键字interrupt和入口号
{
    //中断处理语句;
}

中断级别由高到低

外部中断0              中断入口0

T0溢出中断            中断入口1

外部中断1              中断入口2

T1溢出中断            中断入口3

串行口中断             中断入口4

 中断响应条件

  • 此中断源的中断允许为1
  • 总中断CPU中断打开(EA = 1)
  • 中断源有中断请求

外部中断1初始化及中断处理函数

void InitInt1()
{
    EA = 1;
    EX1 = 1;
    IT1 = 1;
}

void Int1()  interrupt 2
{
    //....
}

二.定时器/计数器

(定时由内部触发,计数由外部产生)

当工作在定时模式时,每经过一个机器周期内部的16位计数寄存器的值就会加1,当这个寄存器装满时溢出,最高单次定时时间为:65536*1.085 (机器周期)= 时间(us)。

当工作在计数器模式时,T0(P3^4引脚),T1(P3^5引脚)每来一个脉冲计数寄存器加1

使用步骤

  • 启动定时/计数器(TCON)
  • 设置定时/计数工作模式(TMOD)
  • 查询是否溢出(读TCON内TF位)

 定时器0初始化

void Timer0Init(void)//定时50ms
{
	AUXR |= 0X80;//定时器时钟1T模式
	TMOD &= 0XF0;//设置定时模式
	TL0 = (65535-50000) / 256;//设置定时初值
	TH0 = (65535-50000) / 256;//设置定时初值
	
	TF0 = 0;//清除TF0标志位
	TR0 = 1;//允许计数
	ET0 = 1;//溢出中断允许
	EA = 1;
}

 三.串行通信

分为异步通信和同步通信

 串口的使用:

  • 设置AUXR定时器时钟频率及选择串口的波特率发生器
  • 设置SCON串行口的控制器(选择工作模式)
  • 设置PCON波特率是否倍数
  • T2H  T2L设置波特率大小
  • ET1 = 0;禁止定时器1中断
  • TR1 = 1;启动定时器1
  • ES = 1;允许串口中断

AUXR寄存器

 


 SCON寄存器

 


 PCON寄存器

 SMOD = 0:TH1参数 = 256-fosc/12/32/波特率

 SMOD = 1:TH1参数 = 256-fosc/12/16/波特率

12M晶振或11.0592M晶振的情况下,要产生9600Bps的波特率,SMOD = 0时,参数为0XFD;SMOD = 1时,参数为0XFA。

void Uart_Init()
{
	TMOD &= 0X0F;
	TMOD |= 0X20;
	TH1 = 0XFD;
	TL1 = 0XFD;	
	TR1 = 1;
	ET1 = 0;
	
	SCON = 0X50;
	AUXR = 0X00;
	ES = 1;
	EA = 1;
}

串行口中有两个缓冲寄存器SBUF,一个为发送寄存器,一个是接收寄存器,在物理结构上是完全独立的,都是字节寻址,为99H。

串行发送时,CPU向SBUF写入数据,此时99H表示发送缓存SBUF。

串行接收时,CPU向SBUF读出数据,此时99H表示接收缓存SBUF。

数据发送,把数据放进SBUF后,内核会自动将数据发送出去,内容发送完成后,会将TI标志位置1

  • 发送数据程序:SBUF = 数据/变量          eg:SBUF = 0XFF;

数据接收,内核从串口接收到一个完整的数据后,会将RI标志位置1,用户用SBUF直接读取即可

  • 接收数据程序:变量 = SBUF                 eg:dat = SBUF;

数据接收代码

void ServerUart() interrupt 4
{
	if(RI)//数据接收
	{
		RI = 0;
		command = SBUF;
	}
}

发送一个字节代码

void SendByte(uchar dat)//发送一个字节
{
	SBUF = dat;
	while(TI == 0);//内容发送完成后,会将TI标志位置1
	TI = 0;//软件清零,取消此中断
}

发送一个字符串代码

void SendString(uchar *str)
{
	while(*str != '\0')
	{
		sendbyte(*str++);
	}	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wu小燕呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值