网站首页 > 基础教程 正文
串行接口是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。
串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。
今天以C#与单片机串口通信实现上位机控制单片机的灯亮与灯灭,上位机接收来自单片机的数据,处理后实现计数功能并用柱状图显示出来。
1、部分代码如下:
上位机部分:
chart1.Series.Clear();
chart1.ChartAreas.Clear();
ChartArea chartareas1 = new ChartArea();
Series series1 = new Series("1");
Series series2 = new Series("2");
Series series3 = new Series("3");
series1.BorderColor = Color.Red;
series1.Color = Color.Red;
series1.ChartType = SeriesChartType.Column;
series1.BorderWidth = 2;
series1.ShadowOffset = 2;
series2.BorderColor = Color.Yellow;
series2.Color = Color.Yellow;
series2.ChartType = SeriesChartType.Column;
series2.BorderWidth = 2;
series2.ShadowOffset = 2;
series3.BorderColor = Color.Green;
series3.Color = Color.Green;
series3.ChartType = SeriesChartType.Column;
series3.BorderWidth = 2;
series3.ShadowOffset = 2;
series1.Points.AddY(count_A);
series2.Points.AddY(count_B);
series3.Points.AddY(count_C);
chart1.Series.Add(series1);
chart1.Series.Add(series2);
chart1.Series.Add(series3);
chart1.ChartAreas.Add(chartareas1);
单片机程序:
#include <reg51.h>
#include <string.h>
#include <intrins.h>
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int //宏定义无符号整型
uint i=0;//取值变量
uint j=0;
uchar dat;
uchar select;
uchar wei[10]={0xfd,0xfc,0xfb,0xf5,0xee,0xde,0xbe,0x7e,0x80,0x90}; //位的控制端
sbit P00=P0^0;
sbit P01=P0^1;
sbit P02=P0^2;
sbit P03=P0^3;
static bit key_bit = 0;
/********************************************************************
延时函数
*********************************************************************/
void delayms(uchar n)
{
uchar m,s;
for(m=n;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
/********************************************************************
功能:串口初始化,波特率9600,方式1
*********************************************************************/
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
/********************************************************************
键盘取值函数
*********************************************************************/
void Keyin(uchar c)
{
switch(c)
{
case '1':P00=0;break;
case '2':P01=0;break;
case '3':P02=0;break;
case '4':P00=0;P01=0;break;
case '5':P00=0;P02=0;break;
case '6':P01=0;P02=0;break;
case '7':P00=0;P01=0;P02=0;break;
case '8':P0=0xff;break;
default:break;
}
}
/********************************************************************
取键值函数
*********************************************************************/
void read_key()
{
uchar temp;
if((P2!=0xff)&&(!key_bit))
{
delayms(10);
temp=P2;
key_bit =1;
}
if((P2==0xff)&&(key_bit))
{
select=temp;
key_bit =0;
}
}
/********************************************************************
数据发送函数
*********************************************************************/
void RS232(uchar addrs)
{
SBUF=addrs; //
while(!TI); //
TI=0; //
}
/********************************************************************
发送键值函数
*********************************************************************/
void TXD_date()
{
switch(select) //发送数据
{
case 0xfe:RS232('A');select=0;break;
case 0xfd:RS232('B');select=0;break;
case 0xfb:RS232('C');select=0;break;
case 0xf7:RS232('D');select=0;break;
case 0xef:RS232('E');select=0;break;
case 0xdf:RS232('F');select=0;break;
case 0xfc:RS232('a');select=0;break;
case 0xfa:RS232('b');select=0;break;
case 0xf9:RS232('c');select=0;break;
default:break;
}
}
void main()
{
Init_Com(); //初始化
while(1)
{
delayms(10); //延时等待
if(RI) //扫描判断是否接收到数据,
{
dat = SBUF; //接收数据SBUF赋与dat
RI=0;
Keyin(dat);
}
else
{
read_key();
TXD_date();
}
}
}
2、效果动画演示
3、完整代码较长,已上传网盘,需要源代码的请关注评论后私信发送“单片机”即可自动获取。感谢您的阅读和关注。
猜你喜欢
- 2024-10-12 340.C# 中最有价值的语法糖及其应用场景
- 2024-10-12 Dev——手把手教你学会CheckedListBox(C#)
- 2024-10-12 流程控制-循环语句(5-5)-C#编程零基础到入门学习
- 2024-10-12 C#12那些有意思的特性 c# 特性的实现原理
- 2024-10-12 C#得到网关和DNS地址 .netcore 网关
- 2024-10-12 C#设计模式之4-原型模式 c++原型模式
- 2024-10-12 C#05(判断、循环语句) c#循环次数由什么决定
- 2024-10-12 C#:编程界的全能王,其他语言只能望尘莫及?
- 2024-10-12 C# 中的模式匹配与安全的类型转换:is 和 as 运算符的深入解析
- 2024-10-12 C# 循环语句介绍 c#循环输出
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)