蓝桥杯单片机必备知识—–(12)串口通讯

蓝桥杯单片机必备知识—–(12)串口通讯

蓝桥杯单片机必备知识—–(12)串口通讯

串口初始化函数

//主程序中调用

void UartInit(void)		//9600bps@11.0592MHz
{
   
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器2时钟为Fosc/12,即12T
	T2L = 0xE8;		//设定定时初值
	T2H = 0xFF;		//设定定时初值
	AUXR |= 0x10;		//启动定时器2
}

发送字符串

void sendstring(unsigned char *str)//发送字符串
{
   
	while(*str !='\0')//等待\0
		{
   
			//sendbyte(*str++);//发送下一个字符
			SBUF=*str++; //将数据放进SBUF缓冲器
			while(TI==0); //等待发送数据完成
			 TI=0; //清除发送完成标志
		}
}

串口中断

void s() interrupt 4
{
   
	if(RI)
	{
   
		str1[scount++]=SBUF;   RI=1时接收数据,将数据放入SBUF
		RI = 0;
	}
}

整个代码粘贴

#include <stc15f2k60s2.h>
#include <stdio.h>

#define uchar unsigned char
#define uint unsigned int

uchar tab[] = {
   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar dspbuf[] = {
   10,10,10,10,10,10,10,10};
uchar temperature = 12;
unsigned char str1[20];
unsigned char scount = 0;
unsigned char str[20];

void load();
void sendstring(unsigned char *str);
void sendbyte(unsigned char dat);
void display();
void uart_proc();
void cls()
{
   
	P2 = (P2 & 0x1f) | 0x80;
	P0 = 0xff;
	P2 = 0x1f;
	
	P2 = (P2 & 0x1f) | 0xa0;
	P0 = 0x00;
	P2 = 0x1f;
}

void UartInit(void)		//9600bps@11.0592MHz
{
   
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器2时钟为Fosc/12,即12T
	T2L = 0xE8;		//设定定时初值
	T2H = 0xFF;		//设定定时初值
	AUXR |= 0x10;		//启动定时器2
}


void main()
{
   

	cls();
	AUXR = 0xc0;
	TMOD = 0x00;
	TL0 = 0xcd;
	TH0 = 0xd4;
	TR0 = 1;
	ET1 = 1;
	ES = 1;
	EA = 1;
	UartInit();
	while(1)
	{
   
		uart_proc();
	}
}

void s() interrupt 4
{
   
	if(RI)
	{
   
		str1[scount++]=SBUF;
		RI = 0;
	}
}
void uart_proc()
{
   
	if(scount > 0)
	{
   
		//sendstring(str1); 
		if(str1[scount-1] == 0xa)
		{
   
			sendstring(str1);		
			
			if((str1[0] =='s')  && (str1[1] == 0xd))
			{
   
				sprintf(str,"#temperature:%02u\r\n",(uint)(temperature));//发送Hello
				sendstring(str);
			}
			scount = 0;
			
		}
		else
			if(scount==6)
			{
   
	      sendstring(str1);		
				scount = 0;
			}
		
	}		
}




void sendstring(unsigned char *str)//发送字符串
{
   
	while(*str !='\0')//等待\0
		{
   
			//sendbyte(*str++);//发送下一个字符
			SBUF=*str++; //将数据放进SBUF缓冲器
			while(TI==0); //等待发送数据完成
			 TI=0; //清除发送完成标志
		}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100133.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • strtok独到深刻的讲解「建议收藏」

    strtok独到深刻的讲解「建议收藏」strtok函数的使用是一个老生常谈的问题了。该函数的作用很大,争议也很大。以下的表述可能与一些资料有区别或者说与你原来的认识有差异,因此,我尽量以实验为证。交代一下实验环境是必要的,winxp+vc6.0,一个极端平民化的实验环境。本文中使用的源代码大部分来自于网络,我稍加修改作为例证。当然,本人水平有限,有不妥之处在所难免,各位见谅的同时不妨多做实验,以实验为证。strtok的

    2022年7月14日
    15
  • threadlocal底层实现_什么是底层

    threadlocal底层实现_什么是底层ThreadLocal作用:提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂性。package com.mupack;public class App{ private String content; public void setContent(String content) { this.content = content; } public Stri

    2022年8月9日
    3
  • vue前端面试题2022_前端常见面试题

    vue前端面试题2022_前端常见面试题然后现在也是找了一些在Vue方面经常出现的面试题,留给自己查看消化,也分享给有需要的小伙伴。如果文章中有出现纰漏、错误之处,还请看到的小伙伴留言指正,先行谢过。以下↓1.说一下Vue的双向绑定数据的原理vue实现数据双向绑定主要是:采用数据劫持结合“发布者-订阅者”模式的方式,通过Object.defineProperty()来劫持各个属性的setter、…

    2022年9月7日
    0
  • SVR回归_时间序列分析优缺点

    SVR回归_时间序列分析优缺点文章目录1.SVR时间序列预测2.SVR调参3.SVR高斯核与过拟合1.SVR时间序列预测SVR可用于时间序列分析,但不是较好的选择。现在一般采用LSTM神经网络来处理时间序列数据#SVR预测#也可用于时间序列分析(ARIMA也可用于时间序列分析)importnumpyasnpfromsklearnimportsvmimportmatplotlib.pyplotaspltif__name__==”__main__”:#构造数据N=50

    2022年10月25日
    0
  • CodeForces 484A Bits

    CodeForces 484A Bits

    2022年1月13日
    45
  • Spring是如何解决循环依赖问题的及三级缓存的作用

    Spring是如何解决循环依赖问题的及三级缓存的作用前置知识 所谓的三级缓存只是三个可以当作是全局变量的 Map Spring 的源码中大量使用了这种先将数据放入容器中等使用结束再销毁的代码风格 Spring 的初始化过程大致有四步我们说的循环依赖就是第四步在给 Bean 属性注入的时候发生的一个问题循环依赖就是 假设有两个类 A 和 B A 中需要注入 B B 中需要注入 A 由于 A 注入 B 时 B 没有创建 B 创建时 A 也无法创建导致的死循环问题我们都知道 AOP 是 Spring 的一个重要核心思想 其实现就是根据动态代理来实现的 也就是说我们的 Bean 其实很大概率都是要生成代理类 让

    2025年6月12日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号