蓝桥杯单片机学习记录(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++);
	}	
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
蓝桥杯单片机定时器2写串口通信的过程如下: 1. 首先,需要将定时器2的工作模式设置为8位自动重装载模式,即T2CON寄存器的低4位设置为0x34。 2. 然后,需要设置定时器2的计数初值,即将TH2和TL2寄存器初始化为一个合适的值,这里假设波特率为9600,计数初值为0xFD。 3. 接下来,需要打开定时器2中断,即将IE寄存器的第5位设置为1。 4. 在中断处理函数中,需要判断是否是定时器2产生的中断,并清除相应的中断标志。然后,将SBUF中的数据发送出去,最后重新设置TH2和TL2寄存器的值。 下面是示例代码: ```c #include <reg52.h> #define BAUDRATE 9600 #define TIMER_VALUE 0xFD void init_serial() { // 设置波特率 TH2 = 256 - (11059200UL / 32 / BAUDRATE); TL2 = TH2; // 设置定时器2为8位自动重装载模式 T2CON = 0x34; // 打开定时器2中断 IE |= 0x20; } void serial_send(char ch) { // 等待发送缓冲区为空 while (!TI); // 发送数据 TI = 0; SBUF = ch; } void timer2_isr() interrupt 5 { // 判断是否是定时器2产生的中断 if (TF2) { // 清除中断标志 TF2 = 0; // 发送数据 serial_send('A'); // 重新设置计数初值 TH2 = TIMER_VALUE; TL2 = TIMER_VALUE; } } void main() { init_serial(); // 启动定时器2 TR2 = 1; // 允许中断 EA = 1; // 主循环 while (1) { // 在这里添加其他任务 } } ``` 在这个示例代码中,我们将定时器2的工作模式设置为8位自动重装载模式,并将波特率设置为9600。在中断处理函数中,我们将发送字符'A',并重新设置TH2和TL2寄存器的值。 需要注意的是,由于单片机的晶振频率可能不同,所以在计算计数初值时需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Wu小燕呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值