PIC单片机的AD数据传输和上位机C#窗口界面实时显示

硬件:BK300开发板+PIC16F877A芯片+Pickit2
软件:MPLAB IDE v8.91、Visual Studio 2019

下位机

让连在RA0脚上的R1充当模拟量,PIC16F877A片内ADC模块进行模数转换,用时间片轮询调度的方法,周期性进行A/D转换过程,并将AD转换的结果显示在数码管上(00h-ffh),同时将AD数据发送到上位机串口;


我一开始使用了4M的晶振,后来转用18.432M的晶振,大家记得根据自己的需要改变波特率寄存器的值就好啦!



上位机

C#的部分我跟网上学着写了个串口助手用来接收和发送数据,以及实时显示AD数据图像
`using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

namespace RS232_AD
{

public partial class 串口助手 : Form
{private StringBuilder sb = new StringBuilder();private long receive_count = 0;//接收字节计数,全局变量private long send_count = 0;//接收字节计数,全局变量List<byte> list = new List<byte>();//全局变量;波形显示数据列表public 串口助手(){InitializeComponent();CheckForIllegalCrossThreadCalls = false;  //操控线程}private void Form1_Load(object sender, EventArgs e){串口.Text = "COM1";波特率.Text = "57600";数据位.Text = "8";校验位.Text = "无";停止位.Text = "1";Receive_HEX.Checked = true;Send_HEX.Checked = true;波形显示按钮.Enabled = false;timer1.Interval = 1000;}private void 波形显示按钮_Click1(object sender, EventArgs e){throw new NotImplementedException();}private void 停止位_SelectedIndexChanged(object sender, EventArgs e){}private void panel1_Paint(object sender, PaintEventArgs e){}private void label1_Click(object sender, EventArgs e){}private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){}private void label6_Click(object sender, EventArgs e){}private void 串口_SelectedIndexChanged(object sender, EventArgs e){串口.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());}private void 发送按钮_Click(object sender, EventArgs e){ byte[] temp = new byte[1];try{//首先判断串口是否打开if (COM1.IsOpen){int num = 0;//判断发送模式if (Send_HEX.Checked){//需要用正则表达式将用户输入字符中的十六进制字符匹配出来string buf = 发送端.Text;string pattern = @"\s";string replacement = "";Regex rgx = new Regex(pattern);string send_data = rgx.Replace(buf, replacement);num = (send_data.Length - send_data.Length % 2) / 2;for (int i = 0; i < num; i++) {temp[0] = Convert.ToByte(send_data.Substring(i * 2, 2), 16);COM1.Write(temp, 0, 1);}if (send_data.Length % 2 != 0) {temp[0] = Convert.ToByte(send_data.Substring(发送端.Text.Length - 1, 1), 16);COM1.Write(temp, 0, 1);num++;}}else {if (Send_ASCII.Checked){COM1.WriteLine(发送端.Text);num = 发送端.Text.Length;}}send_count += num;Tx字节数.Text = "Tx:" + send_count.ToString() + "Bytes";}}catch (Exception ex){//捕获异常,创建一个新对象//响铃并显示异常给用户System.Media.SystemSounds.Beep.Play();MessageBox.Show(ex.Message);}}private void 发送端_TextChanged(object sender, EventArgs e){}private void label4_Click(object sender, EventArgs e){}private void 打开串口按钮_Click(object sender, EventArgs e){try {//将可能产生异常的代码放在try块中if (COM1.IsOpen==false){串口.Enabled = false;波特率.Enabled = false;数据位.Enabled = false;校验位.Enabled = false;停止位.Enabled = false;COM1.PortName = 串口.Text;COM1.BaudRate = Convert.ToInt32(波特率.Text);COM1.DataBits = Convert.ToInt16(数据位.Text);if (校验位.Text.Equals("无"))COM1.Parity = System.IO.Ports.Parity.None;else if (校验位.Text.Equals("奇"))COM1.Parity = System.IO.Ports.Parity.Odd;else if (校验位.Text.Equals("偶"))COM1.Parity = System.IO.Ports.Parity.Even;else if (校验位.Text.Equals("标志"))COM1.Parity = System.IO.Ports.Parity.Mark;else if (校验位.Text.Equals("空格"))COM1.Parity = System.IO.Ports.Parity.Space;if (停止位.Text.Equals("1"))COM1.StopBits = System.IO.Ports.StopBits.One;else if (停止位.Text.Equals("1.5"))COM1.StopBits = System.IO.Ports.StopBits.OnePointFive;else if (停止位.Text.Equals("2"))COM1.StopBits = System.IO.Ports.StopBits.Two;COM1.Open();//打开串口打开串口按钮.Text = "关闭串口";打开串口按钮.BackColor = Color.LightSteelBlue;串口状态.Text = "串口已打开";串口状态.ForeColor = Color.Red;波形显示按钮.Enabled = true;timer1.Enabled = true;}else {//串口已经处于打开状态COM1.Close();//关闭串口   打开串口按钮.Text = "打开串口";打开串口按钮.BackColor = Color.White;串口.Enabled = true;波特率.Enabled = true;数据位.Enabled = true;校验位.Enabled = true;停止位.Enabled = true;波形显示按钮.Enabled = false;串口状态.Text = "串口已关闭";串口状态.ForeColor = Color.Black;timer1.Enabled = false;list.Clear();receive_count = 0;}}catch (Exception ex) {//捕获可能发生的异常//刷新COM口选项//响铃并显示异常给用户System.Media.SystemSounds.Beep.Play();MessageBox.Show(ex.Message);}}private void 波特率_SelectedIndexChanged(object sender, EventArgs e){}private void 接收端_TextChanged(object sender, EventArgs e){}private void 清空按钮_Click(object sender, EventArgs e){接收端.Text = "";//发送端.Text = "";//receive_count = 0;list.Clear();Rx字节数.Text = "Rx:" + receive_count.ToString() + "Bytes";}private void COM1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e){int num = COM1.BytesToRead;//获取接收缓冲区中的字节数byte[]received_buf = new byte[num];//声明一个大小为num的字节数据用于存放读出的byte型数据receive_count += num;COM1.Read(received_buf, 0, num);//读取接收缓冲区中num个字节到byte数组中for (int j=0;j<received_buf.Length;j++) {list.Add(received_buf[j]);if (list.Count > 200) { list.RemoveAt(0);}}sb.Clear();if (Receive_ASCII.Checked){foreach (byte b in received_buf){sb.Append(Encoding.ASCII.GetString(received_buf));//将byte型数据转化为ascii码数组}}else{foreach (byte b in received_buf){sb.Append(b.ToString("X2") + ' ');//将byte型数据转化为2位16进制文本显示}}try{//因为要访问UI资源,所以需要使用invoke方式同步ui接收端.AppendText(sb.ToString());Rx字节数.Text = "Rx:" + receive_count.ToString() + "Bytes";}catch (Exception ex) { System.Media.SystemSounds.Beep.Play();MessageBox.Show(ex.Message);}}private void radioButton1_CheckedChanged(object sender, EventArgs e){}private void label7_Click(object sender, EventArgs e){}private void 串口状态_Click(object sender, EventArgs e){}private void label8_Click(object sender, EventArgs e){}private void pictureBox1_Click(object sender, EventArgs e){}private void chart1_Click(object sender, EventArgs e){}private void pictureBox1_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;Pen Axis = new Pen(Color.Black, 3);//创建绘制坐标轴的画笔Axis.EndCap = LineCap.ArrowAnchor;//坐标轴结尾形状为箭头Pen grid = new Pen(Color.Blue, 1);//创建绘制网格的画笔grid.DashStyle = DashStyle.Dash;//网格画笔设置为虚线形式Pen V = new Pen(Color.Red, 2);//创建画数据线的画笔Font 宋体16 = new Font("宋体", 16);Font 宋体10 = new Font("宋体", 10);Brush black = new SolidBrush(Color.Black);g.DrawString("时间", 宋体16, black, 600, 290);g.DrawString("电压模拟量 255=5V", 宋体16, black, 32, 12);g.DrawString("0", 宋体10, black, 10, 280);g.DrawString("30", 宋体10, black, 5, 250);g.DrawString("60", 宋体10, black, 5, 220);g.DrawString("90", 宋体10, black, 5, 190);g.DrawString("120", 宋体10, black, 0, 160);g.DrawString("150", 宋体10, black, 0, 130);g.DrawString("180", 宋体10, black, 0, 100);g.DrawString("210", 宋体10, black, 0, 70);g.DrawString("250", 宋体10, black, 0, 40);g.DrawString("270", 宋体10, black, 0, 10);g.TranslateTransform(0, pictureBox1.Height - 1, MatrixOrder.Append);//把坐标原点从左上角换到左下角与笛卡尔坐标系一致g.ScaleTransform(1, -1);//改变坐标轴的方向Point orgin = new Point(30, 30);//设置原点Point topx = new Point(30, 305);//x轴顶点坐标Point topy = new Point(655, 30);//y轴顶点坐标g.DrawLine(Axis, orgin, topx);//画x轴g.DrawLine(Axis, orgin, topy);//画y轴int x = 92;for (int i = 0; i <= 10; i++)//绘制网格的纵向线条{g.DrawLine(grid, x, 30, x, 300);x += 62;}int y = 60;//绘制网格的横向线条for (int i = 0; i <= 9; i++){g.DrawLine(grid, 30, y, 650, y);y += 30;}}private void 串口助手_Paint(object sender, PaintEventArgs e){}private void 波形显示按钮_Click(object sender, EventArgs e){  try{timer1.Enabled = true;pictureBox1.Refresh();}catch { }}private void timer1_Tick(object sender, EventArgs e){pictureBox1.Refresh();Graphics g = pictureBox1.CreateGraphics();Pen Axis = new Pen(Color.Black, 3);//创建绘制坐标轴的画笔Axis.EndCap = LineCap.ArrowAnchor;//坐标轴结尾形状为箭头Pen grid = new Pen(Color.Blue, 1);//创建绘制网格的画笔grid.DashStyle = DashStyle.Dash;//网格画笔设置为虚线形式Pen V = new Pen(Color.Red, 2);//创建画数据线的画笔Font 宋体16 = new Font("宋体", 16);Font 宋体10 = new Font("宋体", 10);Brush black = new SolidBrush(Color.Black);g.DrawString("时间", 宋体16, black, 600, 290);g.DrawString("电压模拟量 255=5V", 宋体16, black, 32, 12);g.DrawString("0", 宋体10, black, 10, 280);g.DrawString("30", 宋体10, black, 5, 250);g.DrawString("60", 宋体10, black, 5, 220);g.DrawString("90", 宋体10, black, 5, 190);g.DrawString("120", 宋体10, black, 0, 160);g.DrawString("150", 宋体10, black, 0, 130);g.DrawString("180", 宋体10, black, 0, 100);g.DrawString("210", 宋体10, black, 0, 70);g.DrawString("250", 宋体10, black, 0, 40);g.DrawString("270", 宋体10, black, 0, 10);g.TranslateTransform(0, pictureBox1.Height - 1, MatrixOrder.Append);//把坐标原点从左上角换到左下角与笛卡尔坐标系一致g.ScaleTransform(1, -1);//改变坐标轴的方向Point orgin = new Point(30, 30);//设置原点Point topx = new Point(30, 305);//x轴顶点坐标Point topy = new Point(655, 30);//y轴顶点坐标g.DrawLine(Axis, orgin, topx);//画x轴g.DrawLine(Axis, orgin, topy);//画y轴int x = 92;for (int i = 0; i <= 10; i++)//绘制网格的纵向线条{g.DrawLine(grid, x, 30, x, 300);x += 62;}int y = 60;//绘制网格的横向线条for (int i = 0; i <= 9; i++){g.DrawLine(grid, 30, y, 650, y);y += 30;}for (int i = 0; i < list.Count - 1; i++){g.DrawLine(V, 30 + i, 30 + list[i], 30 + i + 1, 30 + list[i + 1]);}}
}
}

`

因为在各种博客上学到了很多,非常感激
希望这些能对大家有所帮助

PIC单片机的AD数据传输和上位机C#串口界面实时显示相关推荐

  1. 上位机通过串口获取单片机数据

    上位机通过串口获取单片机数据(C#) 需求 准备 功能设计 界面设计 关键程序 打开串口 发送数据 接收数据 实现页面 完整源码 后续 需求 我们在平时使用单片机制作项目时,总是希望能够实时显示一些数 ...

  2. stm32单片机 北斗GPS 定位 vb上位机显示。 蓝牙主从级通信

    stm32单片机 北斗GPS 定位 vb上位机显示. 蓝牙主从级通信. 主单片机获取GPS北斗模块定位信息后,通过蓝牙发送给从模块. 从蓝牙模块,从模块通过串口讲定位信息发送给vb上位机. 上位机实时 ...

  3. 最简单DIY基于ESP32CAM的物联网相机系统⑤(用C#上位机实现串口图传)

    第一篇:最简单DIY基于ESP32CAM的物联网相机系统①(用网页实现拍照图传) 第二篇:最简单DIY基于ESP32CAM的物联网相机系统②(在JAVAWEB服务器实现图片查看器) 第三篇:最简单DI ...

  4. C#之windows桌面软件第十课:电脑ADC值显示(上位机)(单通道显示)

    C#之windows桌面软件第十课:电脑ADC值显示(上位机) (单通道显示) using System; using System.Collections.Generic; using System ...

  5. c语言如何控制上位机界面大小,电机上位机控制及界面设计参考.doc

    电机上位机控制及界面设计参考 PAGE 1 电机上位机控制及界面设计 吴牛俊 (自动化与电气工程学院 指导教师:周克宁) 摘要:随着计算机.电子.通讯技术的飞速发展,人们对于车间现场设备的运行管理控制 ...

  6. C#上位机开发串口通信编程——倒计时器开发

    C#上位机开发串口通信编程--倒计时器开发 一.介绍 这是我按照B站上的一个上位机开发视频教程开发的倒计时器开发,本来只有开始计时功能,没有停止计时功能,停止计时功能后面我自己添加了. 视频网址:C# ...

  7. 从零开始编写一个上位机(串口助手)QT Creator + Python

    提示:本博客作为学习笔记,有错误的地方希望指正,此文可能会比较长,作为学习笔记的积累,希望对来着有帮助.   绪论:笔者这里使用的是QTCreator和Python来实现一个简单的串口上位机的开发的简 ...

  8. Qt上位机软件串口通讯

    录了一个串口讲解的视频,分别放在了抖音和B站,大家可以看看,主要讲了一下原理, B站我的主页:laorenshen的个人空间_哔哩哔哩_Bilibili 视频源码下载免费:Qt上位机软件串口通讯,视频 ...

  9. C#上位机:串口通讯

    C#上位机:串口通讯 基本介绍 参数配置 串口开关与检测 数据发送 数据接收 相关功能函数 基本介绍 语言与开发技术: C#.Winform. 串口通讯是上位机的基础功能,可以通过USB等COM串口进 ...

最新文章

  1. ListView 空值时的友好提示
  2. Linux Kernel 5.14 arm64异常向量表解读-中断处理解读
  3. python 速度 memmap_使用python测量文件的读写速度
  4. 今天是个特殊的一天,有意义的一天,值得纪念的一天~
  5. Project编写功能点的规划时间
  6. 医疗设备-呼吸机-数据解析
  7. Android4.0 添加一个新的Android 键值
  8. mean shift 图像分割(一、二、三)
  9. python零基础教学plc_利用Python构建电脑和PLC通信的方法
  10. 和运营开会的知道的一些点
  11. UVa12235: Help Bubu 题解
  12. 需求与商业模式创新-4-战略
  13. 高速的二舍八入三七作五_详解青银高速市区段计费方法人工车道比ETC贵3元
  14. 计数器(Verilog)
  15. Python日期推算实操案例
  16. 次表面散射(Subsurface Scattering)(转)
  17. 相机SD卡文件夹下所有文件损坏解决方法
  18. loadrunner入门教程(17) --关联
  19. 洛谷p2655 2038年问题 普及/提高- 模拟
  20. 后端程序员如何写出优雅的前端试图【Thymeleaf】

热门文章

  1. 【特征检测】LIOP特征描述算法
  2. css字体与盒子模型
  3. 自己正在使用的工具,备注一下
  4. 关于机器人进展的一些个人看法
  5. 移动硬盘无法访问位置不可用,里面的资料怎样找到
  6. cacti监控服务器性能,cacti监控服务器
  7. 关闭mac电脑的安全机制
  8. 经常出现exeplorer.exe错误的问题的总结
  9. tcpdump 网络抓包工具常用命令(转)
  10. Linux驱动开发(十八)---网络(网卡)驱动学习