搜档网
当前位置:搜档网 › C#的串口通信源程序

C#的串口通信源程序

C#的串口通信源程序
C#的串口通信源程序

基于单片机串口通信的上位机和下位机

首先亮出C#的源程序吧。

主要界面:

只是作为简单的运用,可以扩展的。

源代码:

using System;

using System.Collections.Generic;

using https://www.sodocs.net/doc/2417257703.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO.Ports;

using System.Timers;

namespace 单片机功能控制

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

SerialPort sp = new SerialPort();

private void button1_Click(object sender, EventArgs e)

{

String str1 = comboBox1.Text;//串口号

String str2 = comboBox2.Text;//波特率

String str3 = comboBox3.Text;//校验位

String str4 = comboBox5.Text;//停止位

String str5 = comboBox4.Text;//数据位

Int32 int2 = Convert.ToInt32(str2);//将字符串转为整型

Int32 int5 = Convert.ToInt32(str5);//将字符串转为整型

groupBox3.Enabled = true;//LED控制界面变可选

try

{

if (button1.Text == "打开串口")

{

if (str1 == null)

{

MessageBox.Show("请先选择串口!", "Error");

return;

}

sp.Close();

sp = new SerialPort();

sp.PortName = comboBox1.Text;//串口编号

sp.BaudRate = int2;//波特率

switch (str4)//停止位

{

case "1":

sp.StopBits = StopBits.One;

break;

case "1.5":

sp.StopBits = StopBits.OnePointFive;

break;

case "2":

sp.StopBits = StopBits.Two;

break;

default:

MessageBox.Show("Error:参数不正确", "Error");

break;

}

switch (str3)

{

case "NONE":

sp.Parity = Parity.None; break;

case "ODD":

sp.Parity = Parity.Odd; break;

case "EVEN":

sp.Parity = Parity.Even; break;

default:

MessageBox.Show("Error:参数不正确", "Error");

break;

}

sp.DataBits = int5;//数据位

sp.Parity = Parity.Even;//设置串口属性

sp.Open();//打开串口

button1.Text = "关闭串口";

textBox1.Text = Convert.ToString(sp.PortName) + "已开启!";

}

else

{

sp.Close();

button1.Text = "打开串口";

groupBox3.Enabled = false;//LED控制界面变灰色

textBox1.Text = Convert.ToString(sp.PortName) + "已关闭!";

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

private void Form1_Load(object sender, EventArgs e)

{

//初始化

textBox1.Text = "欢迎使用简易的串口助手!";

groupBox3.Enabled = false;//LED控制界面变灰色

groupBox6.Enabled = false;

groupBox7.Enabled = false;

groupBox8.Enabled = false;

button3.Enabled = false;

button6.Enabled = false;

timer1.Start();

try

{

foreach (string com in System.IO.Ports.SerialPort.GetPortNames()) //自动获取串行口名称

https://www.sodocs.net/doc/2417257703.html,boBox1.Items.Add(com);

//默认设置

comboBox1.SelectedIndex = 0;//选择第一个com口

comboBox2.SelectedIndex = 4;//波特率4800

comboBox3.SelectedIndex = 0;//校验位NONE

comboBox4.SelectedIndex = 0;//停止位为1

comboBox5.SelectedIndex = 0;//数据位为8

}

catch

{

MessageBox.Show("找不到通讯端口!", "串口调试助手");

}

}

private void timer1_Tick(object sender, EventArgs e)

{

label6.Text = DateTime.Now.ToString();

}

private void button2_Click(object sender, EventArgs e)

{

try {

if (button2.Text == "开启")

{

groupBox6.Enabled = true;

radioButton1.Checked = false;

radioButton2.Checked = false;

radioButton3.Checked = false;

radioButton4.Checked = false;

checkBox1.Checked = false;

checkBox2.Checked = false;

checkBox3.Checked = false;

checkBox4.Checked = false;

checkBox5.Checked = false;

checkBox6.Checked = false;

checkBox7.Checked = false;

checkBox8.Checked = false;

button3.Enabled = true;

textBox2.Text = String.Empty;

button2.Text = "关闭";

}

else

{

groupBox6.Enabled = false;

button3.Enabled = false;

button2.Text = "开启";

textBox2.Text = String.Empty;

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

private void button3_Click(object sender, EventArgs e)

{

groupBox6.Enabled = true;

label7.Text = "已发送";

if (textBox2.Text == "")

MessageBox.Show("发送失败,请选择发送的数据!");

else

sp.WriteLine(textBox2.Text);//往串口写数据

}

private void checkBox1_CheckedChanged(object sender, EventArgs e) {

try {

if (checkBox1.Checked)

{

checkBox1.Checked = true;

checkBox2.Checked = false;

checkBox3.Checked = false;

checkBox4.Checked = false;

checkBox5.Checked = false;

checkBox6.Checked = false;

checkBox7.Checked = false;

checkBox8.Checked = false;

label7.Text = "准备发送";

textBox2.Text = "1";

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

private void checkBox2_CheckedChanged(object sender, EventArgs e) {

try {

if (checkBox2.Checked)

{

checkBox1.Checked = false;

checkBox2.Checked = true;

checkBox3.Checked = false;

checkBox4.Checked = false;

checkBox5.Checked = false;

checkBox6.Checked = false;

checkBox7.Checked = false;

checkBox8.Checked = false;

label7.Text = "准备发送";

textBox2.Text = "2";

radioButton1.Checked = false;

radioButton2.Checked = false;

radioButton3.Checked = false;

radioButton4.Checked = false;

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

private void checkBox3_CheckedChanged(object sender, EventArgs e) {

try

{

if (checkBox3.Checked)

{

checkBox1.Checked = false;

checkBox2.Checked = false;

checkBox3.Checked = true;

checkBox4.Checked = false;

checkBox5.Checked = false;

checkBox6.Checked = false;

checkBox7.Checked = false;

checkBox8.Checked = false;

radioButton1.Checked = false;

radioButton2.Checked = false;

radioButton3.Checked = false;

radioButton4.Checked = false;

label7.Text = "准备发送";

textBox2.Text = "3";

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

private void checkBox4_CheckedChanged(object sender, EventArgs e) {

try

{

if (checkBox4.Checked)

{

checkBox1.Checked = false;

checkBox2.Checked = false;

checkBox3.Checked = false;

checkBox4.Checked = true;

checkBox5.Checked = false;

checkBox6.Checked = false;

checkBox7.Checked = false;

checkBox8.Checked = false;

radioButton1.Checked = false;

radioButton2.Checked = false;

radioButton3.Checked = false;

radioButton4.Checked = false;

label7.Text = "准备发送";

textBox2.Text = "4";

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

private void checkBox5_CheckedChanged(object sender, EventArgs e) {

try

{

if (checkBox5.Checked)

{

checkBox1.Checked = false;

checkBox2.Checked = false;

checkBox3.Checked = false;

checkBox4.Checked = false;

checkBox5.Checked = true;

checkBox6.Checked = false;

checkBox7.Checked = false;

checkBox8.Checked = false;

radioButton1.Checked = false;

radioButton2.Checked = false;

radioButton3.Checked = false;

radioButton4.Checked = false;

label7.Text = "准备发送";

textBox2.Text = "5";

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

private void checkBox6_CheckedChanged(object sender, EventArgs e) {

try

{

if (checkBox6.Checked)

{

checkBox1.Checked = false;

checkBox2.Checked = false;

checkBox3.Checked = false;

checkBox4.Checked = false;

checkBox5.Checked = false;

checkBox6.Checked = true;

checkBox7.Checked = false;

checkBox8.Checked = false;

radioButton1.Checked = false;

radioButton2.Checked = false;

radioButton3.Checked = false;

radioButton4.Checked = false;

label7.Text = "准备发送";

textBox2.Text = "6";

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

private void checkBox7_CheckedChanged(object sender, EventArgs e) {

try

{

if (checkBox7.Checked)

{

checkBox1.Checked = false;

checkBox2.Checked = false;

checkBox3.Checked = false;

checkBox4.Checked = false;

checkBox5.Checked = false;

checkBox6.Checked = false;

checkBox7.Checked = true;

checkBox8.Checked = false;

radioButton1.Checked = false;

radioButton2.Checked = false;

radioButton3.Checked = false;

radioButton4.Checked = false;

label7.Text = "准备发送";

textBox2.Text = "7";

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

private void checkBox8_CheckedChanged(object sender, EventArgs e) {

try

{

if (checkBox8.Checked)

{

checkBox1.Checked = false;

checkBox2.Checked = false;

checkBox3.Checked = false;

checkBox4.Checked = false;

checkBox5.Checked = false;

checkBox6.Checked = false;

checkBox7.Checked = false;

checkBox8.Checked = true;

radioButton1.Checked = false;

radioButton2.Checked = false;

radioButton3.Checked = false;

radioButton4.Checked = false;

label7.Text = "准备发送";

textBox2.Text = "8";

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

private void button5_Click(object sender, EventArgs e)

{

try

{

if (button5.Text == "开启")

{

radioButton1.Checked = false;

radioButton2.Checked = false;

radioButton3.Checked = false;

radioButton4.Checked = false;

checkBox1.Checked = false;

checkBox2.Checked = false;

checkBox3.Checked = false;

checkBox4.Checked = false;

checkBox5.Checked = false;

checkBox6.Checked = false;

checkBox7.Checked = false;

checkBox8.Checked = false;

groupBox7.Enabled = true;

button6.Enabled = true;

textBox2.Text = String.Empty;

button5.Text = "关闭";

}

else

{

groupBox7.Enabled = false;

button6.Enabled = false;

button5.Text = "开启";

textBox2.Text = String.Empty;

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

private void button6_Click(object sender, EventArgs e)

{

label7.Text = "已发送";

if (textBox2.Text == "")

MessageBox.Show("发送失败。请选择发送的数据!");

else

sp.WriteLine(textBox2.Text);//往串口写数据

}

private void radioButton1_CheckedChanged(object sender, EventArgs e) {

try

{

if (radioButton1.Checked)

{

label7.Text = "准备发送";

textBox2.Text = "9";

checkBox1.Checked = false;

checkBox2.Checked = false;

checkBox3.Checked = false;

checkBox4.Checked = false;

checkBox5.Checked = false;

checkBox6.Checked = false;

checkBox7.Checked = false;

checkBox8.Checked = false;

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

private void radioButton2_CheckedChanged(object sender, EventArgs e) {

try

{

if (radioButton2.Checked)

{

label7.Text = "准备发送";

textBox2.Text = "a";

checkBox1.Checked = false;

checkBox2.Checked = false;

checkBox3.Checked = false;

checkBox4.Checked = false;

checkBox5.Checked = false;

checkBox6.Checked = false;

checkBox7.Checked = false;

checkBox8.Checked = false;

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

private void radioButton3_CheckedChanged(object sender, EventArgs e) {

try

{

if (radioButton3.Checked)

{

label7.Text = "准备发送";

textBox2.Text = "b";

checkBox1.Checked = false;

checkBox2.Checked = false;

checkBox3.Checked = false;

checkBox4.Checked = false;

checkBox5.Checked = false;

checkBox6.Checked = false;

checkBox7.Checked = false;

checkBox8.Checked = false;

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

private void radioButton4_CheckedChanged(object sender, EventArgs e) {

try

{

if (radioButton4.Checked)

{

label7.Text = "准备发送";

textBox2.Text = "c";

checkBox1.Checked = false;

checkBox2.Checked = false;

checkBox3.Checked = false;

checkBox4.Checked = false;

checkBox5.Checked = false;

checkBox6.Checked = false;

checkBox7.Checked = false;

checkBox8.Checked = false;

}

}

catch (Exception er)

{

MessageBox.Show("Error:" + er.Message, "Error");

return;

}

}

}

}

下位机程序:

#include

#include

#include

#define uchar unsigned char //宏定义

#define uint unsigned int //宏定义

uchar b; //用来接收数据存储

uchar j=0;

uint i=0; //用来判断相应的子程序uchar LED1= 0xfe; //作为流水灯的开始

uchar LED2=0Xfe; //作为跑马灯的开始

uchar LED3 = 0xfE; //作为二进制加法灯的开始uchar LED4=0XFF; //作为花样灯的开始uchar code table[]=

{0xff,//全灭

0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//依次逐个点亮

0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,//依次逐个叠加

0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,//依次逐个递减

0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e,//两边靠拢后分开

0x7e,0x3c,0x18,0x00,0x00,0x18,0x3c,0x7e,//两边叠加后递减

0x00};//全亮

void delay(void); //延时函数的声明

void liushuideng(void); //流水灯的声明

void paomadeng(void); //跑马灯的声明

void huayangdeng(void); //花样灯的声明

void erjinzhideng(void); //二进制加法灯的声明

void xianshi(uint j); //显示程序

void init(void); //初始化函数

void main (void)

{

init(); //初始化

while(1)

{

xianshi(i); //显示

}

}

void init(void) //初始化函数的定义

{

SCON = 0x50; //REN=1允许串行接受状态,串口工作模式 1

TMOD|= 0x20; //定时器工作方式2

PCON|= 0x80;

//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无(11.0592)

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

TL1 = 0xF3;

TR1 = 1; //开启定时器

PS=1; //把串口中断的优先级设为最高

ES = 1; //开串口中断

EA= 1; // 开总中断

// IE = 0x0;

}

void delay(void) //延时函数的定义

{

uchar i;

uchar ms=250;

while(ms--)

{

for(i = 0; i < 120; i++);

}

}

void liushuideng(void) //流水灯

{

P2 = LED1;

delay();

LED1 = LED1 << 1; //循环右移1位,点亮下一个LED "<<"为左移位if(P2 ==0X00 )

{

LED1 = 0xfe;

} // 0xfe = 1111 1110

}

void paomadeng(void) //跑马灯

{

P2 = LED2;

LED2 = _crol_(LED2,1); //循环右移1位,点亮下一个LED 此函数位库函数

delay();

}

void huayangdeng(void) //花样灯

{ P2=table[j++];

delay();

if(j==42)

j=0;

}

void erjinzhideng(void) //二进制加法灯

{

P2 = LED4;

delay();

LED4--;

}

void xianshi(uint j) //调用相对应的程序

{

if(j==1)

P2=0xfe; //点亮第一个LED

if(j==2)

P2=0xfd; //点亮第二个LED

if(j==3)

P2=0xfb; //点亮第三个LED

if(j==4)

P2=0xf7; //点亮第四个LED

if(j==5)

P2=0xef; //点亮第五个LED

if(j==6)

P2=0xdf; //点亮第六个LED

if(j==7)

P2=0xbf; //点亮第七个LED

if(j==8)

P2=0x7f; //点亮第八个LED

if(j==9)

liushuideng(); //流水灯

if(j==10)

paomadeng(); //跑马灯

if(j==11)

huayangdeng(); //花样灯

if(j==12)

erjinzhideng(); //二进制加法灯

}

void com_isr(void) interrupt 4 //串口中断入口函数

{

ES=0; //再中断进行处理程序的时候关闭串口中断b=SBUF; //将接收的数据存于变量中

switch(b) //分支语句,进行判断

{

case '1':i=1;break; //点亮第一个LED的赋值

case '2':i=2;break; //点亮第二个LED的赋值

case '3':i=3;break; //点亮第三个LED的赋值

case '4':i=4;break; //点亮第四个LED的赋值

case '5':i=5;break; //点亮第五个LED的赋值

case '6':i=6;break; //点亮第六个LED的赋值

case '7':i=7;break; //点亮第七个LED的赋值

case '8':i=8;break; //点亮第八个LED的赋值

case '9':i=9;break; //流水灯的赋值

case 'a':i=10;break; //跑马灯的赋值

case 'b':i=11;break; //花样灯的赋值

case 'c':i=12;break; //二进制加法灯的赋值

default:

break;

}

RI=0; //清除中断标志位

ES=1; //处理完中断程序再开启串口中断}

c语言串口通信范例

一个c语言的串口通信程序范例 分类:技术笔记 标签: c语言 串口通信 通信程序 it 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include #include #include #include #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20 static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)();

static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data); outp(ComPortAddr+4,0x0a);

C语言串口通信助手代码

该程序全部由C写成没有C++ 更没用MFC 完全是自娱自乐给需要的人一个参考 #include "stdafx.h" #include #include "resource.h" #include "MainDlg.h" #include #include #include HANDLE hComm;//用于获取串口打开函数的返回值(句柄或错误值)OVERLAPPED m_ov; COMSTAT comstat; DWORD m_dwCommEvents;

TCHAR cRecs[200],cSends[100]; //接收字符串发送字符串 char j=0,*cCom; //接收用统计数据大小变量端口选择 BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog); HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand); HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose); } return FALSE; } /*系统初始化函数*/ BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { HWND hwndCombo1=GetDlgItem(hwnd,IDC_COMBO1); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM1")); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM2"));

VC++_串口上位机编程实例

VC++串口上位机简单例程(源码及详细步骤) (4.33MB) VC++编写简单串口上位机程序 2010年4月13日10:23:40 串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW等等,我会的语言很少,C语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相当蹩脚的C++写出了一个简单的串口上位机程序,分享一下,体验一下单片机和PC通信的乐趣。 编译环境:VC++6.0 操作系统:VMWare虚拟出来的Windows XP 程序实现功能: 1、PC初始化COM1口,使用n81方式,波特率57600与单片机通信。PC的COM口编号可以通过如下方式修改: 当然也可以通过上位机软件编写,通过按钮来选择COM端口号,但是此次仅仅是简单的例程,就没有弄那么复杂了。COM1口可用的话,会提示串口初始化完毕。否则会提示串口已经打开Port already open,表示串口已经打开,被占用了。 2、点击开始转换,串口会向单片机发送0xaa,单片机串口中断接收到0xaa后启动ADC转

换一次,并把转换结果ADCL、ADCH共两个字节的结果发送至PC,PC进行数值转换后在窗口里显示。(见文章末尾图) 3、为防止串口被一只占用,点击关闭串口可以关闭COM1,供其它程序使用,点击后按钮变为打开串口,点击可重新打开COM1。 程序的编写: 1、打开VC++6.0建立基于对话框的MFC应用程序Test,

2、在项目中插入MSComm控件:工程->增加到工程->Components and Controls->双击Registered ActiveX Controls->选择Microsoft Communications Control,version6.0->Insert,按

单片机串口通信C程序及应用实例

一、程序代码 #include//该头文件可到https://www.sodocs.net/doc/2417257703.html,网站下载#define uint unsigned int #define uchar unsigned char uchar indata[4]; uchar outdata[4]; uchar flag; static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter; void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void); void main() { system_initial(); initial_comm(); while(1) { if(flag==1) { ES = 0; serial_contral(); ES = 1; flag = 0; } else read_Instatus(); } } void uart_send(void) { for(T_counter=0;T_counter<4;T_counter++) { SBUF = outdata[T_counter]; while(TI == 0);

TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }

c语言串口通信范例

c语言串口通信范例 This manuscript was revised by the office on December 22, 2012

一个c语言的串口通信程序范例 标签:分类: 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include <> #include <> #include <> #include <> #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20

static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)(); static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100);

UART串口通信设计实例

2.5 UART串口通信设计实例(1) 接下来用刚才采用的方法设计一个典型实例。在一般的嵌入式开发和FPGA设计中,串口UART是使用非常频繁的一种调试手段。下面我们将使用Verilog RTL编程设计一个串口收发模块。这个实例虽然简单,但是在后续的调试开发中,串口使用的次数比较多,这里阐明它的设计方案,不仅仅是为了讲解RTL编程,而且为了后续使用兼容ARM9内核实现嵌入式开发。 串口在一般的台式机上都会有。随着笔记本电脑的使用,一般会采用USB转串口的方案虚拟一个串口供笔记本使用。图2-7为UART串口的结构图。串口具有9个引脚,但是真正连接入FPGA开发板的一般只有两个引脚。这两个引脚是:发送引脚TxD和接收引脚RxD。由于是串行发送数据,因此如果开发板发送数据的话,则要通过TxD线1 bit接着1 bit 发送。在接收时,同样通过RxD引脚1 bit接着1 bit接收。 再看看串口发送/接收的数据格式(见图2-8)。在TxD或RxD这样的单线上,是从一个周期的低电平开始,以一个周期的高电平结束的。它中间包含8个周期的数据位和一个周期针对8位数据的奇偶校验位。每次传送一字节数据,它包含的8位是由低位开始传送,最后一位传送的是第7位。

这个设计有两个目的:一是从串口中接收数据,发送到输出端口。接收的时候是串行的,也就是一个接一个的;但是发送到输出端口时,我们希望是8位放在一起,成为并行状态(见图2-10)。我们知道,串口中出现信号,是没有先兆的。如果出现了串行数据,则如何通知到输出端口呢?我们引入“接收有效”端口。“接收有效”端口在一般情况下都是低电平,一旦有数据到来时,它就变成高电平。下一个模块在得知“接收有效”信号为高电平时,它就明白:新到了一个字节的数据,放在“接收字节”端口里面。

C语言串口通信-源代码

#include #include #include #include #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20 static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)(); static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data);

WIN_API串口通信详细讲解带范例程序说明

WIN32 API串口通讯实例教程 第一节实现串口通讯的函数及串口编程简介 API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作。常用函数及作用下: 函数名作用 CreateFile 打开串口 GetCommState 检测串口设置 SetCommState 设置串口 BuilderCommDCB 用字符串中的值来填充设备控制块 GetCommTimeouts 检测通信超时设置 SetCommTimeouts 设置通信超时参数 SetCommMask 设定被监控事件 WaitCommEvent 等待被监控事件发生 WaitForMultipleObjects 等待多个被监测对象的结果 WriteFile 发送数据 ReadFile 接收数据 GetOverlappedResult 返回最后重叠(异步)操作结果 PurgeComm 清空串口缓冲区,退出所有相关操作 ClearCommError 更新串口状态结构体,并清除所有串口硬件错误 CloseHandle 关闭串行口 用Windows API 编写串口程序本身是有巨大优点的,因为控制能力会更强,效率也会更高。 API编写串口,过程一般是这样的: 1、创建串口句柄,用CreateFile; 2、对串口的参数进行设置,其中比较重要的是波特率(BaudRate),数据宽度(BytesBits),奇偶校验(Parity),停止位(StopBits),当然,重要的还有端口号(Port); 3、然后对串口进行相应的读写操作,这时候用到ReadFile和WriteFile函数; 4、读写结束后,要关闭串口句柄,用CloseFile。 下面依次讲述各个步骤的过程。

用C编写的RS232串口通信程序

void main() { delayms(100); init(); //初始化系统 delayms(100); init_wdt(); //初始化看门狗 while(1) { while(!RI_0) //是否收到数据 { clr_wdt(); } RI_0=0; //清除接收中断标志 buffer=S0BUF; if(buffer==0x5a) //检测祯头0 start0=1; if(buffer==0x54) //检测祯头1 start1=1; if(buffer==0x5a) //检测祯尾0 end0=1; if(buffer==0xfe) //检测祯尾1 end1=1; if((start0==1)&(start1==1)) { buff[i]=buffer; //从祯头1开始存储数据 i++; } if((end0==1)&(end1==1)) //是否已经接收祯尾 { count=i; //数据长度为count个 i=1; if((buff[2]==0x03)&(count==107)) //是否422指令 { buff[0]=0x5a; //重填祯头0 buff[count-4]=0; //校验和清零 for(k=2;k<(count-4);k++) //计算校验和 { buff[count-4]+=buff[k]; } for(k=0;k

S0BUF=buff[k]; while(!TI_0); //等待发送完成 TI_0=0; //清除发送中断标志 } reset(); } else if((buff[2]==0x05)&(count==7)) //是否AD测试指令 { sendad(); reset(); } else if((buff[2]==0x18)&(count==7)) //是否发送时序信号指令 { sendpaulse(); reset(); } else //如果接收错误,则恢复各标志位为初始状态以便下次接收 { reset(); } } } } void reset() { start0=0; //祯头祯尾标志位清零 start1=0; end0=0; end1=0; for(k=0;k

Labview串口通信开发实例(值得拥有)

串口通信的基本概念 串口通信的基本概念 1,什么是串口? 2,什么是RS-232? 3,什么是RS-422? 4,什么是RS-485? 5,什么是握手? 1,什么是串口? 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米; 而对于串口而言,长度可达1200米。

典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参 数必须匹配: a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB 设备的通信。 b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信 的情况。 c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和

RS232串口通信基本知识与实例

1,RS232串口通信基本知识 (1)目前较为常用的串口是9针串口(DB9。通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口;若距离较远,需附加调制解调器(MOD EM)。 (2)RS232C串口通信接线方法(三线制) 接收数据针脚(或线)与发送数据针脚(或线)相连,彼些交叉,信号地对应相接 (3)DB9接口三线引脚定义 2 ---- RXD 接收数据 3 ---- TXD 发送数据 5 ---- GND 信号地 (4)串行通信方式 1)单工:信息只能单向传送 2)半双工:信息可双向传送但不能同时进行 3)全双工:信息可同时进行双向传送 (5)RS232逻辑电平 逻辑0电平规定为+5 ~ +15V之间;逻辑1是电平为-5 ~ -15V之间,因此在与单片机进行通信时需要进行电平转换 (6)RS232串行通信接口电路设计 (7)51单片机串行通信接口软件设计 1)两个重要指标:可靠性和速度,可靠性是第一位。 2)与串口通信相关的几个寄存器和控制位 TMOD:可以用它来设置定时器工作方式(如果在MCU中使用的是定时器来产生波特率,就需要对这个寄存器进行设置,通常设为0x20,即设置定时器1为8位自动重装定时器,即工作方式1) TH1和TL1:定时器1初始值(可通过波特率计算软件获得) TR1:开启定时器1 SCON:串口控制寄存器,通常设为0x50,即10位异步传输,由定时器1

产生波特率,无奇偶校验位,允许接收 PCON:这个寄存器主要用到它的最高位SMON,当最高位设为1时,原波特率加倍 ES:串口中断使能位 EA:全局中断使能位 3)波特率计算方法(使用一个名为“51波特率初值计算.exe”的小软件)第1步:选择定时器工作方式(方式2) 第2步:输入晶振值(11.0592) 第3步:选择波特率(9600) 第4步:设置SMOD值(0) 第5步:点击确定 第6步:将软件上显示值赋给TH1和TL1 4)串口初始化程序 void Initial_RS232(unsigned char rate) { //默认晶振值为11.0592MHz unsigned char Reload1; switch(rate) //根据拨码器设置波特率 { case 0: Reload1 = 0xE8; //2400bps break; case 1: Reload1 = 0xF4; //4800bps break; case 2: Reload1 = 0xFA; //9600bps break; case 3: Reload1 = 0xFD; //19200bps break; default: Reload1 = 0x00; break; } PCON = PCON|0x80; //SMOD = 1 ;波特率加倍 TMOD = 0x20; //0011,00010设置定时器1为8位自动重装计数器 SCON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位 TH1 = Reload1; //设置定时器1自动重装数 TL1 = Reload1; TR1 = 1; //开定时器1 ES = 1; //允许串口中断 EA = 1; //开总中断 }

delphi7串口通信(spcomm控件)实例

Delphi7串口通信(spcomm控件)实例 最近在用delphi7做串口通信,网上找了很多例程,复制粘贴运行就没有能通过的,再次鄙视一下列位先行者,你们帮人倒是帮到底啊,没一个是拿过来能用的,太坑了,在N天的努力下(鄙人比较笨)终于通过串口接收到数据,希望给后来人予以帮助,程序如下: 功能简介 功能比较简单,只是从串口接收单片机发送的数据,给memo1 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms,

Dialogs, SPComm, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Comm1: TComm; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word); procedure Comm1ModemStateChange(Sender: TObject; ModemEvent: Cardinal); private { Private declarations } public { Public declarations } end; var

c语言串口通信范例

c语言串口通信范例标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]

一个c语言的串口通信程序范例 标签:分类: 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include <> #include <> #include <> #include <> #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20

static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)(); static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; ?

串口通信linux c语言实现

/*write*/ #include #include #include #include #include #include #define MAX_SIZE 30 void set_speed(int,int); int main(int argc,char **argv) { int fd; int flag; int write_num=0; struct termios term; speed_t baud_rate_i; speed_t baud_rate_o; char buff[MAX_SIZE]="hello,beautiful day!"; fd=open(argv[1],O_RDWR|O_NONBLOCK); if(fd<0) printf("open the COM1 error!\n"); else printf("open COM1 ok!\n"); flag=tcgetattr(fd,&term); baud_rate_i=cfgetispeed(&term); baud_rate_o=cfgetospeed(&term); printf("%d,%d\n",baud_rate_i,baud_rate_o); set_speed(fd,9600); flag=tcgetattr(fd,&term); baud_rate_i=cfgetispeed(&term); baud_rate_o=cfgetospeed(&term); printf("%d,%d\n",baud_rate_i,baud_rate_o); while(1) { buff[29]='\n'; write_num=write(fd,buff,sizeof(buff));

VC串口通信实例 MSComm

VC串口通信实例 MSComm 计算机与外界的信息交换称为通信。基本的通信方式有并行通信和串行通信两种。串行通信是指一条信息额各位数据被逐位按顺序传送的通信方式。随着计算机技术的发展和推广,利用串口进行数据通讯在通讯领域中占有着重要的地位。串行通信的特点是:数据位传送,按位顺序进行,最少只需要一根传输线即可完成,成本低但传送速度慢。串行通信的距离可以从几米到几千米。利用串口进行数据通讯在通讯领域中占有着重要的地位,串口通讯在通讯软件中有着十分广泛的应用。如电话、传真、视频和各种控制等。串口通讯目前流行的方法大概有三种:一是利用Microsoft提供的CMSCOMM控件进行通讯,不过现在很多程序员都觉应该放弃这种方式。二是利用WINAPI函数进行编程,这种编程的难度高,要求掌握很多的API 函数。三是利用现在网络上面提供的一些串口通讯控件进行编写。这三种方法都没有同Windows服务联系起来。 串行接口输入输出过程描述 串行接口包括4个主要寄存器,即控制寄存器、状态寄存器、数据输入寄存器及数据输出寄存器。控制寄存器用来接收CPU送给此接口的各种控制信息,而控制信息决定接口的工作方式。状态寄存器的各位叫状态位,每一个状态位都可以用来指示传输过程中的某一种错误或当前传输状态。数据输入寄存器总是和串行输入/并行输出移位寄存器配对使用的。在输入过程中,数据一位一位从外部设备进入接口的寄存器,当接收完一个数据后,数据就从移位寄存器送到输入寄存器,再等待CPU来取走。输出的情况与输入过程类似,在输出过程中,数据输出寄存器与并行输入/串行输出移位寄存器配对使用。当CPU往数据输出寄存器中输出一个数据后,数据便传输到移位寄存器,然后一位一位地通过输出线送到外设。串行通信数据的收发方式分为异步通信方式与同步通信方式。

C语言实现串口通信

摘要: 本文说明了异步串行通信(RS-232)的工作方式,探讨了查询和中断两种软件接口利弊,并给出两种方式的C语言源程序的I/O通道之一,以最简单方式组成的串行双工线路只需两条信号线和一条公共地线,因此串行通信既有线路简单的优点同时也有它的缺点,即通信速率无法同并行通信相比,实际上EIA RS-232C在标准条件下的最大通信速率仅为20Kb/S。 尽管如此,大多数外设都提供了串行口接口,尤其在工业现场 RS-232C的应用更为常见。IBM PC及兼容机系列都有RS-232的适配器,操作系统也提供了编程接口,系统接口分为DOS功能调用和BIOS 功能调用两种:DOS INT 21H的03h和04h号功能调用为异步串行通信的接收和发送功能;而BIOS INT 14H有4组功能调用为串行通信服务,但DOS和BIOS功能调用都需握手信号,需数根信号线连接或彼此间互相短接,最为不便的是两者均为查询方式,不提供中断功能,难以实现高效率的通信程序,为此本文采用直接访问串行口硬件端口地址的方式,用C语言编写了串行通信查询和中断两种方式的接口程序。 1.串行口工作原理 微机串行通信采用EIA RS-232C标准,为单向不平衡传输方式,信号电平标准±12V,负逻辑,即逻辑1(MARKING)表示为信号电平-12V,逻辑0(SPACING)表示为信号电平12V,最大传送距离15米,最大传送速率19.6K波特,其传送序列如图1,平时线路保持为1,传送数据开始时,先送起始位(0),然后传8(或7,6,5)个数据位(0,1),

接着可传1位奇偶校验位,最后为1~2个停止位(1),由此可见,传送一个ASCII字符(7位),加上同步信号最少需9位数据位。 @@T8S12300.GIF;图1@@ 串行通信的工作相当复杂,一般采用专用芯片来协调处理串行数据的发送接收,称为通用异步发送/接收器(UART),以节省CPU的时间,提高程序运行效率,IBM PC系列采用8250 UART来处理串行通信。在BIOS数据区中的头8个字节为4个UART的端口首地址,但DOS 只支持2个串行口:COM1(基地址0040:0000H)和COM2(基地址0040:0002H)。8250 UART共有10个可编程的单字节寄存器,占用7个端口地址,复用地址通过读/写操作和线路控制寄存器的第7位来区分。这10个寄存器的具体功能如下: COM1(COM2) 寄存器 端口地址功能DLAB状态 3F8H(2F8H) 发送寄存器(写) 0 3F8H(2F8H) 接收寄存器(读) 0 3F8H(2F8H) 波特率因子低字节1 3F9H(2F9H) 波特率因子高字节1 3F9H(2F9H) 中断允许寄存器0 3FAH(2FAH) 中断标志寄存器 3FBH(2FBH) 线路控制寄存器 3FCH(2FCH) MODEM控制寄存器 3FDH(2FDH) 线路状态寄存器

c语言串口通信范例

c语言串口通信范例 SANY GROUP system office room 【SANYUA16H-

一个c语言的串口通信程序范例 分类:技术笔记 标签: c语言 串口通信 通信程序 it 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include #include #include #include #define COM232? 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20 static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)();

static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data); outp(ComPortAddr+4,0x0a);

51单片机串口通信

一、串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。串口通信的工作原理请同学们参看教科书。 以下对串口通信中一些需要同学们注意的地方作一点说明: 1、波特率选择 波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。MSC-51串行端口在四种工作模式下有不同的波特率计算方法。其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。 在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。在此模式下波特率计算公式为:波特率=(1+SMOD)*晶振频率/(384*(256-TH1)) 其中,SMOD——寄存器PCON的第7位,称为波特率倍增位; TH1——定时器的重载值。 在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。 下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。则TH1=256-62500/波特率 根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。列计数器重载值,通信误差如下表: 因此,在通信中,最好选用波特率为1200,2400,4800中的一个。 2、通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:0xA1:单片机读取P0端口数据,并将读取数据返回PC机;0xA2:单片机从PC机接收一段控制数据;0xA3:单片机操作成功信息。 在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC机接收到0xA3时,就表明单片机操作已经成功。 3、硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。

51单片机的串口通信程序(C语言)

#include #include #include #include #define uchar unsigned char #define uint unsigned int sbit Key1 = P2^3; sbit Key2 = P2^2; sbit Key3 = P2^1; sbit Key4 = P2^0; sbit BELL = P3^6; sbit CONNECT = P3^7; unsigned int Key1_flag = 0; unsigned int Key2_flag = 0; unsigned int Key3_flag = 0; unsigned int Key4_flag = 0; unsigned char b; unsigned char code Num[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80, 0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00, 0x10,0x89}; unsigned char code Disdigit[4] = {0x7F,0xBF,0xDF,0xEF}; unsigned char Disbuf[4]; void delayms(uint t) { uint i; while(t--) { /* 对于11.0592M时钟,约延时1ms */ for (i=0;i<125;i++) {} } } //----------------------------------------------------- void SendData(uchar Dat) { uchar i=0; SBUF = Dat; while (1) { if(TI) { TI=0; break;

相关主题