蓝桥杯学习笔记(八)----------串口通信/NE555

1.串口
通信原理
通信原理分为串行和并行,这次使用的是串行通信原理。
在这里插入图片描述
IAP15F2K61S2系列单片机具有2个采用UART(Universal Asychronous Receiver/Transmitter)
工作方式的全双工串行通信接口(串口1和串口2)。
每个串行口由2个数据缓冲器、一个移位寄存器、一个串行控制寄存器和一个波特率发生器等组成。
每个串行口的数据缓冲器由2个互相独立的接收、发送缓冲器构成,可以同时发送和接收数据。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码。99H(串口1:SBUF),9BH(串口2:S2BUF)
在这里插入图片描述
两个串行口都有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。串行口1对应的硬件部分是TxD/P3.0和RxD/P3.1引脚。串行口2对应的硬件部分是TxD2,RxD2。
通过设置特殊功能寄存器AUXR1中的S1_ S1,串行口1(UART1)功能可以在[P30/P31],[P36RxD2/P37TxD2],[P16RxD3,P17TxD3]任意切*换。
寄存器
罗列一下需要的寄存器(用蓝色标注了)
在这里插入图片描述串行控制寄存器SCON(可位寻址)和波特率选择特殊功能寄存器PCON(不可位寻址)。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验1:单片机发送给上位机指定的字符串

void UartInit(void)		//9600bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
	TL1 = 0xC7;		//设定定时初值
	TH1 = 0xFE;		//设定定时初值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES = 1;         //串口中断允许
	EA =1;         //总中断开
}
void main()
{
	All_Init();
	UartInit();
	while(1)
	{
		Uart_Sendstring("i love yoi!\r\n");
	}
	
}

void usatr() interrupt 4
{
	if(RI) //如果接收到了
	{
		uartbuff = SBUF;
		RI = 0;//手动清零
	}
	else if(TI)
	{
		TI = 0;
		uart_busy = 0;//发送完成 清零
	}
}

void Uart_SendData(uchar dat)
{
	while(uart_busy);
	SBUF = dat;
	uart_busy = 1;    //发送忙  当发送完后才会清0
}


void Uart_Sendstring(uchar *str)
{
	while(*str)
	{
		Uart_SendData(*str++);
	}
}

实验2:发送字符到数码管上显示,同时接收区返回相同的字符(重点沿研究ASII与hex的关系)(最后将NUM显示在数码管上就好了)

void uart() interrupt 4
{
	if(RI) //如果接收到了
	{
		RI = 0;//手动清零
		num = SBUF;//接收缓冲区
		SBUF = num;//发送缓冲区
	}
	else if(TI)
	{
		TI = 0;
	}
}

追加:
首先要明白的一点是,我输入的1是字符,相当于0X31,然后单片机得到的也是0X31,如若我用 NUM = SBUF -48就可以得到0-9的数字(字符转数字)。发送123,就相当0X30,0X31,0X32 ,因此可以建立一个数组进行储存。(数组要初始化!!!血泪教训…)然后上面代码那种没有转换的就要注意了可以完善一下.

在这里插入图片描述
2.NE555
1.原理图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.蓝桥杯要求没有那么严格,总归来说蓝桥杯的设计就是将它作为了一个可变频率脉冲发生器。简要来说就是通过滑动变阻器Rb3来改变频率。
题目的要求一般为:
用NE555产生用于评率测量功能测试的方波信号,信号频率为500Hz----20kHZ(应该是差不多在这个范围内),可将P34引脚与方波信号发生器输出引脚NET_SIG短接。
用定时器0,让T0工作在计数模式下,而计数的引脚就是我们的P34,进行频率测量的时候,将定时器初值设为0,然后利用另外一个定时器来限定时间在1S或者几秒内,在规定时间完后,停止基数,将定时器0的值取出来,看有多少个脉冲,然后用总脉冲量/总时间,得出的即为脉冲的周期。(跟超声波的程序思路差不多)

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值