专业编程基础技术教程

网站首页 > 基础教程 正文

C#与单片机串口通讯,实现简单的计数功能

ccvgpt 2024-10-12 14:10:08 基础教程 6 ℃

串行接口是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。

串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。

C#与单片机串口通讯,实现简单的计数功能

今天以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、完整代码较长,已上传网盘,需要源代码的请关注评论后私信发送“单片机”即可自动获取。感谢您的阅读和关注。

Tags:

最近发表
标签列表