1、基于单片机C#串口通信(完整资料)(可以直接使用,可编辑 优秀版资料,欢迎下载)基于C与单片机串口通信的投票器李浩东0093104 周守悦2003101012一 作品的设计概述我们知道每年每个班都需要班委换届,有很多同学积极参加竞选,然而每一次竞选投票都是大家拿出一张纸,然后再纸上写上自己心目中班委的名字,然后交给监票读票记票,这个过程不仅大大浪费了大家的宝贵时间,还有可能出现漏票等情况,体现不了公平公正公开。本设计是通过按钮给班委竞选人投票,每个候选人都对应一个按钮,投票人如果想投票给某个人可以按下其对应按钮,每按下一次改竞选人的票数就会自动增加1,每个人只能按下一次,电脑显示屏将通过柱形图
2、动态的呈现每个候选人获得票数竞争的情况以及通过框图显示总票数,不仅使得投票结果更加公开公正,而且也大大节省了大家的时间.本设计的创新点是通过柱形图动态显示整个投票过程,而不是直接显示到最后投票结果,更加体现公正公开。二 作品的设计与分析1. 主要功能与分析 主要使用单片机和PC机之间的串口通信,在单片机硬件上设置七个按键,其中四个键是用来给A,,,四个人投票的,这四个按键每按下一次就自动增,记录这四个按键按下的总次数u1,u2,nm,nu4,并把四个数按顺序不断循环通过串口发给PC机,PC机通过串口把这些数据存储下来,并读出来,通过C#编程,把这四个人所获得的总票数在ctureox控件上面的柱
3、形图动态呈现出来,通过time控件,不断更新这个人所获得的票数,让投票人通过柱形图更加形象直观的看出每个被投票人的竞争情况,同时在柱形图下方有着这四个人获得总票数的真实数目。还有一个按键是票数清零,如果这次投票已经完成或者无效可以按下这个按键,此时A,B,C,D四个人的总票数将变成零。还有一个按键作用是停止投票,如果需要停止这次投票可以按下此键,这时候那四个投票的按键将不可用。最后一个按键的作用是继续投票,如需继续投票,可按此键。其系统设计图如下:PC机图像显示清零继续暂停ABCD单片机数据传输.串口通信规则单片机与PC机为了可以进行通信,必须要遵守一定的通信规则,这个共同的规则就是通信端口的
4、初始化。通信端口的初始化有以下几项必须设置:()数据的传输速率传输双方通过传输线的电压改变来交换数据,但传输线的电压改变的速度必须和接收端的接收速度保持一致,R2通常用于异步传输,即双方并没有一个可参考的同步时钟作为基准。由于没有一个参考时钟,双方所发送的高低电位到底代表几个位就不得而知了,要使得双方的数据读取正常,就要考虑到传输速率波特率,其所代表的意义是每秒钟所能产生的最大电压状态改变率,或者说是每秒钟可以振荡的次数.原始信号经过不同的波特率取样后,所得的结果完全不一样。取样速度只有原来的一半时,信号被跳着取样,数据因此产生错误。因此通信双方获得相同的通信速度是首先要做的事情.(2)数据的
5、发送单位一般串行通信端口所发送的数据是字符类型的,若用来传输文件,则会使用二进制的数据类型。当使用字符类型时,通常使用SCI码,ASCI码中8个位形成一个字符.以实际的RS232传输来看,由于大多数应用只是发送文字码,因此只要个位就可以将CII码的1号字符表达出来,所有的可见字符都在这个范围内,所以只要个数据位就足够了.不同的情况下,会使用到不同的发送单位,但使用多少个位合成一个字节必须先行确定.(3)起始位及停止位由于异步串行通信中并没有使用同步脉冲作为基准,故接收端完全不知道发送端何时将进行数据的发送,而当发送端准备要开始发送数据时,发送端会在所送出的字符前后分别加上高电位的起始位(逻辑0
6、)及低电位的停止位(逻辑),它们分别是所谓的起始位和停止位。当发送端要开始发送数据时,便将传输在线的电位由低电位提升至高电位,而当发送结束后,再将电位降至低电位.接收端会因起始位的触发(因电压由低电位升至高电位)而开始接收数据,并因停止位的通知(因电压维持在低电位)而确切数据的字符信号已经结束。(4)校验位的检查为了预防错误的产生,因此使用校验位作为检查的机制;校验位是用来检查所发送数据正确性的一种核对码,其中又分成奇校验位和偶校验位两种方式,分别是检查字符码中I的数目是奇数或偶数。以偶校验位为例,A的ASCII码1001 (二进制),其中1的数目是三个,因此校验位便是1,使1的数目保持偶数。
7、同理,校验位是奇校验位时,A的校验位便是,使1的数目保持奇数。3. 串口通信协议由于本设计主要从单片机串口发送数据,所以因此有关串口通信的原理的介绍都是围绕单片机讲解的。(1) 0C51串行口的控制寄存器(1.)特殊功能寄存器SCOSC 是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志,字节地址为98H.SCON寄存器的各位定义如表-1所示。位7643210字节地址:8HSMSM1SMRETB8RB8T RISCN 表31 SCN寄存器SM0和SM为工作方式选择位,可选择四种工作方式,如表2所示.SMSM1方式说明波特率00移位寄存器fo/120110位异步收发器
8、(8位数据)可变10211位异步收发器(9位数据)fsc/6或foc/321311位异步收发器(9位数据)可变表- 串口通信4种工作方式SM2为多机通信控制位,主要用于方式和方式3。当接收机的SM2=时可以利用收到的RB8来控制是否激活(RB=时不激活,收到的信息丢弃;B1时收到的数据进入,并激活R,进而在中断服务中将数据从SBU读走)。当S2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活R(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。在方式0时,S2必须是0.在方式1时,若M1,则只有接收到有效停止位时,RI才置1。RN为允许串行接收位
9、。由软件置REN=1,则启动串行口接收数据;若软件置RE=0,则禁止接收。TB8用在方式2或方式中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位(在方式和方式1中,该位未用).RB8用在方式2或方式中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式时,若M0,则RB8是接收到的停止位。TI,发送中断标志位.在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使T置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清,取消此中断申请。I,接收中断标志位。在方式0时,当
10、串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请7。(12)特殊功能寄存器CONPCON的字节地址为8H,它的第位SOD是与串口通信波特率的设置有关的选择位。SOD(CON.)为波特率倍增位。在串行口方式1、方式、方式3时,波特率与SOD有关,当SMOD=时,波特率提高一倍.复位时,SD=0。(2)8C5单片机串行口的工作方式(2.1)方式0设置SON寄存器的S0、SM1 0时,串行口工作于方式0。此时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RX(
11、P3.)引脚输入或输出,同步移位脉冲由XD(P1)引脚输出。发送和接收均为位数据,低位在先,高位在后。波特率固定为fsc1。其中fs为时钟频率.(.2)方式1设置CN寄存器的SM0、M0 时,串行口工作于方式1.方式1是10位数据的异步通信口。T为数据发送引脚,RD为数据接收引脚,传送一帧数据的格式如图所示。其中1位起始位,8位数据位,1位停止位。 用软件置REN为1时,接收器以所选择波特率的1倍速率采样RX引脚电平,检测到D引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边
12、时,控制电路进行最后一次移位。当RI0,且M2=0(或接收到的停止位为1)时,将接收到的9位数据的前8位数据装入接收SBF,第9位(停止位)进入R,并置I=,向CPU请求中断.方式一的输入输出图如图38、9所示。图- 方式1输入图9 方式1输出(23)方式2和方式设置ON寄存器的M0、SM1 时,串行口工作于方式2,当SM0、SM1 时,串行口工作于方式3。方式2或方式3为11位数据的异步通信口.TXD为数据发送引脚,XD为数据接收引脚 。方式2和方式3时起始位1位,数据位(含1位附加的第位,发送时为SO中的T8,接收时为RB8),停止位1位,一帧数据为11位.方式2的波特率固定为晶振频率的1
13、64或13,方式3的波特率由定时器T1的溢出率决定。 方式2和方式3输出:发送开始时,先把起始位输出到T引脚,然后发送移位寄存器的输出位(D)到TXD引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由T引脚输出.第一次移位时,停止位“”移入输出移位寄存器的第9位上 ,以后每次移位,左边都移入0.当停止位移至输出位时,左边其余位全为0,检测电路检测到这一条件时,使控制电路进行最后一次移位,并置T=,向P请求中断。发送时序图如下图310所示。图310 方式或方式3的发送时序图方式2和方式3输入:接收时,数据从右边移入输入移位寄存器,在起始位0移到最左边时,控制电路进行最后一次移位。当R=0
14、,且SM2=0(或接收到的第9位数据为)时,接收到的数据装入接收缓冲器SF和RB8(接收数据的第位),置R=,向CP请求中断。如果条件不满足,则数据丢失,且不置位RI,继续搜索RXD引脚的负跳变。接收时序图如图311所示。图-1 方式2或方式3的接收时序图(3)波特率的计算在串行通信中,收发双方对发送或接收数据的速率要有约定。通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定.串行口的四种工作方式对应三种波特率.由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。方式的波特率 = foc
15、/2方式2的波特率 (2SOD/4)fos 方式1的波特率 =(2SD/32)(T1溢出率)方式3的波特率 (2SMOD2)(T1溢出率)当作为波特率发生器时,最典型的用法是使T1工作在自动再装入的位定时器方式(即方式2,且TO的R=,以启动定时器)。这时溢出率取决于TH1中的计数值。计算公式如31所示: 1 溢出率 = fosc /12 (T1) (3)在单片机的应用中,常用的晶振频率为:12Hz和11.052z。所以,选用的波特率也相对固定。本设计根据要求选用工作方式1。4。单片机的设计(1) 硬件设计主要有单片机,七个按键,开关,以及一个与C机相连接的USB串口,其硬件图像如下图:(2)
16、 软件部分开始其单片机语言程序框图如下:继续不发数据暂停结束发送数据Num1,num2,num3,nun4全为零清零Num1+Num4+Num3+Num2+C?A?D?B?判断是否有按键按下初始化(串口设置)5.C的程序设计(1) 串口通信的串行端口类 SerialPo (11)SrlPot的主要属性属性说明BudRate获取或设置串行波特率。BtesTo获取接收缓冲区中数据的字节数。yteToWrit获取发送缓冲区中数据的字节数。DataBs获取或设置每个字节的标准数据位长度.Enoing获取或设置传输前后文本转换的字节编码。Ispn获取一个值,该值指示 SeriaPot 对象的打开或关闭状
17、态.NeLie获取或设置用于解释 ReadLine 和 WriLn方法调用结束的值。Prity获取或设置奇偶校验检查协议。ortame获取或设置通信端口,包括但不限于所有可用的 COM 端口。eadBuffri获取或设置 SalPort输入缓冲区的大小。Readimeut获取或设置读取操作未完成时发生超时之前的毫秒数。RceiveBesThrhd获取或设置DataReceivd 事件发生前内部输入缓冲区中的字节数。Site获取或设置 Componet 的Iite。(从 Cmponent继承。)StopBit获取或设置每个字节的标准停止位数。iteBufferSize获取或设置串行端口输出缓冲区
18、的大小。WrieTimeout获取或设置写入操作未完成时发生超时之前的毫秒数.(2)eiaPort的主要方法方法说明Ce关闭端口连接,将 Isen属性设置为alse,并释放内部tram对象.Dispoe已重载。释放rior对象使用的非托管资源.Equl 已重载。 确定两个 jet实例是否相等。 (从Objet 继承。)tPotNames获取当前计算机的串行端口名称数组。Opn打开一个新的串行端口连接.ead已重载。 从 SrilPo输入缓冲区中读取。RedBy从 SeialPot输入缓冲区中同步读取一个字节。RadChar从 eralPt 输入缓冲区中同步读取一个字符。ReadExiting在
19、编码的基础上,读取 SeralPor对象的流和输入缓冲区中所有立即可用的字节.RadLn一直读取到输入缓冲区中的 NeLie 值。ReaT一直读取到输入缓冲区中的指定valu 的字符串.oSting 返回包含 omponnt的名称的String(如果有)。不应重写此方法。 (从 Comnnt 继承.)Wrte已重载。 将数据写入串行端口输出缓冲区。WrieLin将指定的字符串和 Newine 值写入输出缓冲区。(3)SrialPrt的主要事件事件说明Daaeceived表示将处理 SeraPrt 对象的数据接收事件的方法。EorReceved表示处理SelPt对象的错误事件的方法.(2) C界
20、面串口设计开始(3) C#程序框图串口初始化不接收数据串口打开?显示图像Time事件触发接收数据三功能显示以及结果(图1)投票结果显示(图2)投票结果动态显示四.结论本设计利用了单片机串口通信编程和C#串口通信编程,让单片机和P机实现了通信。虽然是比较简单的#与单片机之间的串口通信,但是也大大加深了自己对课堂知识的理解,同时大大提高了自己的动手设计能力。这次设计也让我充分认识到C强大的功能,但也让我看到很多不足,界面完善不够好,程序编写较为简单,还没用到数据库等功能,这也大大的激发了我对C兴趣。最后,非常感谢唐老师,他让复杂枯燥的C#变得生动有趣,上他的课非常有意思,大大提高了我对的兴趣,同时
21、的加强了我的设计技能.参考文献1 张明锋.IC单片机入门与实践。北京:北京航空航天大学出版社,202 黄亮.基于T81单片机的串行通信程序设计J. 中国地质大学,单片机实用电子制作P233 金华 C网络编程技术教程M. 人民邮电出版社附件C#程序:usin Syste;snSyste。olecins。Genec;singSytem。CompeModel;usng ytem。Da;usng Sytem。rai;singSysem.Linq;using stm.Text;usi ysem.Wndows.rms;using Sytm。rawin.rwig2D;ng ste。I;usingSys。I.
22、Ports;namspae tuio pubic partial class Fom :orm /定义委托类型 lic deleate od mydelge(); int i=0; ta, b, c,; tring n, 2,n3, 4,nu; /bte n = new byt4; /=bte r = new bte4; plcForm1() InitilizeComponen(); prvat void btto1_lc(object sender, Eventgs e) f (!pIsOpe) /设置串口 spPrNae = exto1ext; /指定要使用的串口号 sp.BaudRae
23、=90; /设定波特率 s。Pa = System。IO.o.Pit。one; /设定奇偶验证协议 sDataBits =8; /设定字长 p.Stopits =SstemI.Pors。toits。One; /设定停止位 p.DtrEnale true; /数据终端准备就绪 sp。tEnble tu; /启用请求发送 speaTimeout 1000; /设置数据读取超时为秒 t sppen(); butt1.ext = 关闭串口; tch (cetion e) essgBo.Show(exMssae); els Close(); butto1.Tex 打开串口”; privat vod ux
24、ig(trng nu1,string num2,tng 3,string nu4) try a Convet。oInt32(num1); = Convert.ToIt32(num2); onvet。oInt32(nu3); = Convet.ToIt3(nu4); atch intsum= a+c+d; loataCovt.ToSnl(onvert。TSingl() 00 / Conert。Toinle(u)); loat 1 =ov.ToSingle(vert。oSingl(b) 10/ onrtoSingle(m)); floatc1ConvertTogle(onverToSige(c)
25、*10 onvet。oingle(um)); foat 1= Cnvet.ToSige(Conver.TSinge(d)* 10 / onrSinle(sum)); intwidth = 30, hgt=30; Bitap map= neBitp(idh, hegh); Graphic g = Grphi.FrmImge(map); try g。Cr(Colrhie); Bruh ruh1 =newSlidBrush(lor.hie); rush sh2 = ew SolBsh(Color.lack); rush brush3=e Solidrsh(olr。Red); Brs brus4= e
26、 SoidBrus(Color.Green); Brush brush5 =n olidrush(lor.Orang); Brush ush = new SoidBru(Color.Drkle); ntfot1= ewFt(”Cour Ne,16,FontStle.Bo); Font o2 = ew Font(”Courir w, 8); g。illRctagle(bruh1,0,0,wh, height); .DrawStrng(投票结果”,fnt1, rush2, new oit(9, 20); Ptp1 =newoint(70,50); oit p2new Point(230, 5);
27、gDraLin(new en(Clr。Black), p1,p); gDrawtring(:, fnt2,brush, nw Poin(3, 0); .DrawString(”B:, fot2, brush2, newPon(30, 110); g。awing(”C:, font, brush2, nw oint(30, 140); g。Drawting(D:”, font2, brus2, ew Pot(30, 170); g。Fllctane(bush,95, 80, a1,17); g.FlRetanl(brus4, 5, 10,1, 17); g.Fillectangl(brush5,
28、 95, 4,c1, 17); g.illRectane(brush6,95, 170, d, 17); g.rawRectangle(ne Pe(olorGre), 10, 210, 280, 80); g.DrwStrin(A: a。ToStrig() 票,fot2, rush2, nw Poit(15,220)); DaStin(”: + bTStrin()+ ”票”, fot2, bus2, newoint(150, 220)); g。DrwString(”C:” 。Toing()+ 票”, fot2,brush2,new Poit(15,260); g。DraSting(:” +d.
29、oSrig() + 票, fot, bsh2, int(0,260); itureBox1.mag = ; catc (Excpti ex) Messaex。Show(ex。Mssge); privateidDce(bjc seder,rialDaaReceivdEvtArgs e) /调用异步委托处理数据读取及显示的任务 thisBeginoke(nmdeegte(readsp)); void readsp() int c =sp。tesToea; byte = ne ted; p。Read(, cd); = Ending。UF8。Gtig(n); i+; if ( ) i 1; sic(i
30、) ce1: n n; beak; cs 2: = um; reak; cas 3: n3 num; break; ae:n4 = n; beak; private voidime1_ik(ojc sener, EvenArs e) uxian(n1, , n3, n4); 单片机程序:includefiear nsined chardine nt nsigne ntuhr num1,num,um3,m,emp,t;harnu4;uint;vod SdByt(char sc);vod it();ucharkysca();voi delay(char )uha a,; r(a;+) fr(b=;
31、b1;b+); void init() i=0; C0x4; MO=x2; T1=xfd; L=0fd; S1; R; EA=1; TI=0;void min()nit();while(1) eycan(); t=ni;endBte(t); i+; i(i3) ;oid SendBte(ucha sc)SBF=sc;while(!TI);I=;dely(200);ucha keysan()P2=0xe;temp=P2;emp=temp0xf;wil(mp!0x0)elay(10);mp=P;temp=emp0x0;hile(te!=xf0)tep=P3;sitch(temp)cae xe:1+
32、;break;case 0d:num+;reak;a 0be:nm3+;break;cae0x7:um4+;break;while(temp!=xf0)tem=P2;teptmp0x0; P3=0fd;temp=3;temp=temp&0xf0;ile(ep!xf0)ely(1);empP2;emptemp0xf;whie(temp!=xf)temp=P;witch(tem)cas xed: nm1=0;n2=0;m3=0;um=;break;case 0x:EA=;ak;cae 0xd:EA=1;brek;whie(tem!0x0)tempP2;temp=tep&0x0;numnm1;num
33、=m2;n2=um3;nu3=nu;retu num;课程设计报告课程单片机技术 题目串口通信多机通信系统系别年级07级专业电子科学与技术 班级学号学生姓名指导教师职称设计时间目录1 题设要求分析12 硬件电路的设计32.1 系统的组成32。2 系统的工作原理32。3 硬件电路原理图设计42。4 硬件电路的实现63 软件电路的设计83.1 通信协议的设计83.2 主机程序设计83.3 从机程序设计124 系统的调试与实现154。1 从机模块调试154.2 LED显示模块调试154.3电平转换模块功能调试154。4主机模块功能调试164.5整体设计功能调试16参考文献181 题设要求分析本小组的
34、试验题目如下:一、任务:设计实现多台单片机系统之间的串行通信二、基本要求(难度系数0.8):(1)设计一个主从式多机通信系统,包含1台主机和3台从机,主机和从机全部为单片机;(2)选择合适总线接口芯片,正确连接主机和从机;(3)编程实现分布式数据采集功能,主机可以获取各分机当前AD转换结果,并显示。三、发挥部分:(1)完善通信功能。(根据完成情况加分,上限+0。2)经过本小组成员对本课题认真讨论先做出如下分析:对课题分析后本小组认为本次实验的目的是就是应用单片的串口通信功能实现一个分布式采集系统.整个系统中包含一片主机和三片从机,主机的任务是实现对三片从机的AD转换结果的采集并在数码管上显示之.这样从硬件的角度上将整个系统分为两个模块主机模块和从机模块。主机模块中包含单片机模块、led数码管显示子模块和串口电平转换子模块,从机模块则包括单片机子模块、AD转换子模块和串口电平转换子模块。就本次试验而言硬件电路的设计难点在于串口电平转换芯片的选择及其连接,而软件的设计难点在于串口通信协议的制定及相关程序