前言:由于不可抗拒因素,初始的STC12C5A60S2芯片由于无法进行烧录(。。。因为没带有锁紧座的开发板),暂且使用STC15F2K60S2芯片。。

一 串行通信概述:

串口通信有SPI IIC UART 等多种,最常见的是UART ,大部分情况下,串口通信指的就是UART.

  • 关于波特率:串口每秒钟传输的位数
  • UART 的数据发送与接收:
  1. 串口有两个缓冲寄存器SBUF,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的,他们都是字节寻址的寄存器。
  2. 串行发送时,CPU向SBUF 写入数据,例如SBUF=0x58;此时TI置1。
  3. 串行接收时,CPU从SBUF 读出数据,例如Date=SBUF;此时RI置1。

二 代码

1.初始化

可利用STC-ISP计算生成波特率等初始化数据。

void UartInit(void)		//9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xDC; //设定定时初值
TH1 = 0xDC; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1; //打开总中断
ES=1; //打开接收中断 }

注意:初始化函数STC-ISP没有生成总中断和接收中断,所以EA,ES注意补上。

2.中断

void Usart() interrupt 4	//串口中断函数接收程序
{
if (RI==1)
{
receiveData = SBUF;
RI=0;
}
}

串口中断号如下:根据串口中断选取中断号。

中断源                                                           中断号     

     外部中断0          INT0                                    interrupt 0 

     定时器0中断      T0                                        interrupt 1 

     外部中断1          INT1                                    interrupt 2 

     定时器1中断      T1                                        interrupt 3 

     串口中断           TX/RX                                   interrupt 4

如果接收到数据,将数据存储到变量receiveData中,同时记得要软件将RI置0。

以上单片机可以接收到发来的数据,那么单片机如何发送数据呢?

3.数据发送

void send1_Byte(unsigned char byte)//发送hex字符
{
SBUF = byte;
while(TI==0); //发送完会自动置1
TI=0; //手动清零
} void Send1_String(char *str) //发送字符串
{
while (*str!='\0') //检测字符串结束标志
{
send1_Byte(*str++);
}
}

第一个函数是单片机发送hex字符,第二个是单片机发送一个字符串。

当单片机发送结束后,TI会硬件置1,用此可以判断是否发送结束,同时,发送结束后记得用软件置0。

发送字符串同理。

4.具体功能的实现

因为考虑到将来单片机外接的模块较多,所以通过串口(模拟各模块)发送不同的数据给单片机,从而使单片机产生不同的功能。

void working()
{
if(receiveData!=0x00)//发现有数据输入到单片机
{
switch(receiveData)
{
case 0x01: send1_Byte(11); receiveData=0x00; break;
case 0x02: send1_Byte(22); receiveData=0x00; break;
case 0x03: Send1_String("HELP!\r\n"); receiveData=0x00; break;
case 0x04: yy=1; receiveData=0x00; break;
}
}
} int main()
{
uchar tt;
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
UartInit(); while(1)
{
working();
while(yy==1)
{
for(tt=0;tt<5;tt++)//led灯闪烁5次,表示提醒。
{
P0=0x00;
Delay500ms();
P0=0xff;
Delay500ms();
}
yy=0;
}
}
}

当发送0x01,0x02,0x03,0x04时,产生不同的效果。当串口发送0x03时,单片机会发送字符串“HELP!”,同理也可以增加更多功能。

三 总结


#include <stc15f2k60s2.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar receiveData,m,yy; void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xDC; //设定定时初值
TH1 = 0xDC; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1; //打开总中断
ES=1; //打开接收中断 }
void send1_Byte(unsigned char byte)//发送hex字符
{
SBUF = byte;
while(TI==0); //发送完会自动置1
TI=0; //手动清零
} void Send1_String(char *str) //发送字符串
{
while (*str!='\0') //检测字符串结束标志
{
send1_Byte(*str++);
}
} void Usart() interrupt 4 //串口中断函数接收程序
{ if (RI==1)
{
receiveData = SBUF;
RI=0;
}
} void working()
{
if(receiveData!=0x00) //发现有数据输入
{
switch(receiveData)
{
case 0x01: send1_Byte(11);receiveData=0x00;break;
case 0x02: send1_Byte(22);receiveData=0x00;break;
case 0x03:
{
Send1_String("HELP!\r\n");
receiveData=0x00;
}
break;
case 0x04:
{
yy=1;
receiveData=0x00;
}
break;
}
} } void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k; _nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
} int main()
{
uchar tt;
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
UartInit(); while(1)
{
working();
while(yy==1)
{
for(tt=0;tt<5;tt++)
{
P0=0x00;
Delay500ms();
P0=0xff;
Delay500ms();
}
yy=0;
}
}
}

初步构想是首先通过模块与电脑,单片机与电脑通过串口的接受与发送进行调试,然后逐步过渡到单片机与模块直接的通信。

STC15F2K60S2串口通信的应用。的更多相关文章

  1. .NET 串口通信

    这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...

  2. BluetoothChat用于蓝牙串口通信的修改方法

    本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车.界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信. SPP-CA模块自带代码,在这 ...

  3. Win10 IoT C#开发 4 - UART 串口通信

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,既可以开发设备UI与用户交互式操作,又可以控制GPIO等接口,使得原来嵌入式繁琐的开发变得简单.通过Remote Debug ...

  4. 使用Java实现简单串口通信

    最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar ...

  5. Java 串口通信

    在Windows系统下,用Java开发串口通信相关的程序时,需要用到几个文件. (1)win32com.dll 要放在jdk\jre\bin目录下. (2)comm.jar 和javax.comm.p ...

  6. .NET 串口通信中断接收,包含0X1A(作为EOF)

    .NET串口通信中将`0X1A`当做EOF处理,.NET接收到EOF会触发一次接收中断,此时事件形参`SerialDataReceivedEventArgs`值为枚举 `Eof`,其他为`Chars` ...

  7. STC12C5A60S2 双串口通信

    STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同:特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器, ...

  8. mfc 调用Windows的API函数实现同步异步串口通信(源码)

    在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...

  9. VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程

    首先,在 vs2008 环境下创建 MFC 运用程序 设置项目名称为 ComTest(这个地方随意命名,根据个人习惯),点击确定后,点击下一步 出现如下界面 选择"基于对话框"模式 ...

随机推荐

  1. LeetCode43,一题让你学会高精度算法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode系列第22篇文章,今天讲的内容是高精度算法. 今天和大家讨论的算法是高精度,对应的LeetCode是第43题.题面其实 ...

  2. 编译Zookeeper3.4.6源代码并通过Intellij IDEA运行(2020年)

    一.问题背景 生产环境Windows机器上用的Zookeeper 3.4.6,最近经常报如下异常: 经过搜索,看到一篇帖子可以解决:https://www.jianshu.com/p/73eec030 ...

  3. 懂一点Python系列——快速入门

    本文面相有 一定编程基础 的朋友学习,所以略过了 环境安装.IDE 搭建 等一系列简单繁琐的事情. 一.Python 简介 Python 英文原意为 "蟒蛇",直到 1989 年荷 ...

  4. 发布一个npm包(webpack loader)

    发布一个npm包,webpack loader: reverse-color-loader,实现颜色反转. 初始化项目 mkdir reverse-color-loader cd ./reverse- ...

  5. hdu1455 拼木棍(经典dfs)

    给定木棍序列,求解能将木棍拼成相同长度的数根长木棍的情况下长木棍长度的最小值. /*hdu1455dfs */ #include<bits/stdc++.h> using namespac ...

  6. Unity 游戏框架:命名的力量--变量

    变量的命名入门 大家先来试着理解一下这段代码: var todoList = new TodoList(); todoList.Todos = new List<Todo>(); var ...

  7. DL 调参经验

    2019-10-20 11:45:54 数据侧 1.在数据集很大的情况下,不要立马跑全量数据.可以现在小数据集上进行测试,估算一下运行时间. 2.数据shuffle和augmentation,训练之前 ...

  8. 读Hadoop3.2源码,深入了解java调用HDFS的常用操作和HDFS原理

    本文将通过一个演示工程来快速上手java调用HDFS的常见操作.接下来以创建文件为例,通过阅读HDFS的源码,一步步展开HDFS相关原理.理论知识的说明. 说明:本文档基于最新版本Hadoop3.2. ...

  9. pd库dataframe基本操作

    一.查看数据(查看对象的方法对于Series来说同样适用) 1.查看DataFrame前xx行或后xx行 a=DataFrame(data); a.head(6)表示显示前6行数据,若head()中不 ...

  10. 国内外主要的PHP开源CMS系统分析

    国内PHP开源CMS内容管理系统从程序框架,模版加载到程序功能上都有很大的进步,大部分都采用了自定义模块,自定义模型的方式,同时提供各个CMS都提供不同的特色功能,CMS内容管理系统一直影响着互联网的 ...