您的位置:首页 > 编程语言 > C#

基于c#环境的单片机和PC串口通信

2016-06-25 22:08 471 查看
c#程序:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace WindowsFormsApplication3

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            SendData(sendtxt.Text);

        }

        private void SendData(string data)

        {

            byte[] senddata=new byte[1];

            //senddata[0] = Convert.ToByte(data,2);

            senddata= Encoding.Default.GetBytes(data);

            serialPort1.Write(senddata,0,1);

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            SetComConfig();

        }

        private void SetComConfig()

        {

            serialPort1.PortName = "COM2";

            serialPort1.BaudRate = 4800;

            serialPort1.Open();

        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

        {

            ReceivedData();

        }

        private void ReceivedData()

        {

            byte[] sbufdata=new byte[1];

            serialPort1.Read(sbufdata,0,1);

            receive.Invoke((EventHandler)delegate{

                //receive.Text = Convert.ToString(sbufdata[0],2);

                receive.Text = Encoding.Default.GetString(sbufdata);

            });

            

        }

    }
}

单片机程序:

#include <reg51.h>  

#include <string.h>    

#include <intrins.h>  

  

sbit LS138A = P2^2;     //定义138译码器的输入A脚由P2.2控制   

sbit LS138B = P2^3;     //定义138译码器的输入脚B由P2.3控制  

sbit LS138C = P2^4;     //定义138译码器的输入脚C由P2.4控制  

  

unsigned char ch;  

bit read_flag= 0 ;  

//此表为 LED 的字模, 共阴数码管 0-9  -   

unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};   

void delay(unsigned int i);  

void init_serialcom( void )  

  

   {  

  

       SCON = 0x50 ;  //SCON: serail mode 1, 8-bit UART, enable ucvr    

  

                         //UART为模式1,8位数据,允许接收  

  

          TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload              

  

                         //定时器1为模式2,8位自动重装  

  

          PCON |= 0x80 ; //SMOD=1;  

  

          TH1 = 0xF3;                   // //baud*2  /*  波特率4800、数据位8、停止位1。效验位无 (12M)  

  

          IE |= 0x90 ;     //Enable Serial Interrupt  

  

          TR1 = 1 ;       // timer 1 run  

  

          TI=1;  

  

           

  

       }  

  

           

  

//向串口发送一个字符  

  

void send_char_com( unsigned char ch)  

  

         {  

            SBUF=ch;  

            while (TI== 0);  

               TI= 0 ;  

  

          }  

  

   

  

//串口接收中断函数  

  

void serial () interrupt 4 using 3  

  

{  

    if (RI)  

          {   

  

                 RI = 0 ;  

  

                 ch=SBUF;   

                   

                 read_flag= 1 ; //就置位取数标志  

  

              }  

  

}  

  

   

  

 main()  

  

    {  

    int LedNumVal = 0;  

    unsigned char LedOut[3];  

    int i = 0;  

  

           init_serialcom(); //初始化串口  

  

                  while ( 1 )  

                  {  

  

                    if (read_flag) //如果取数标志已置位,就将读到的数从串口发出  

  

                    {  

  

                     read_flag= 0 ; //取数标志清0  

                     send_char_com(ch);  

                     LedNumVal = ch;  

                     }  

  

     LedOut[0]=Disp_Tab[LedNumVal / 100];  

     LedOut[1]=Disp_Tab[(LedNumVal / 10) % 10];  

     LedOut[2]=Disp_Tab[LedNumVal % 10]|0x80;  

       

  

     for( i=0; i<3; i++)  //实现8位动态扫描循环  

     {     

      P0 = LedOut[i];  //将字模送到P0口显示  

                                               

      switch(i)   //使用switch 语句控制位选   

         {        

            case 0:LS138A=0; LS138B=0; LS138C=0;  break;           

            case 1:LS138A=1; LS138B=0; LS138C=0;  break;  

            case 2:LS138A=0; LS138B=1; LS138C=0;  break;                  

         }  

    delay(100);    

      }  

                   }  

}  

  

void delay(unsigned int i)  

{  

    char j;  

    for(i; i > 0; i--)  

        for(j = 200; j > 0; j--);  

}

or
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: