单片机到PC机数据传送实验程序(汇编)
单片机数据传送实验报告
竭诚为您提供优质文档/双击可除单片机数据传送实验报告篇一:单片机数据传送实验报告实验名称:数据传送实验实验类型:设计性实验姓名:袁志生时间:04.17第五六节课一、实验目的与要求实验目的:1、掌握单片机的汇编指令系统及汇编语言程序设计方法。
2、掌握单片机的存储器体系结构。
3、熟悉keil软件的功能和使用方法。
4、掌握单片机应用程序的调试方法。
实验要求:1、实现单片机内部RAm之间,外部RAm之间以及内部RAm与外部RAm之间的数据传送。
2、利用Keil软件编辑、汇编、调试、运行实验程序并记录实验数据。
二、设计要求1、编写程序将00h~0Fh16个数据分别送到单片机内部RAm30h~3Fh单元中。
2、编写程序将片内RAm30h~3Fh的内容传送至片内RAm40~4Fh单元中。
3、编写程序将片内RAm40h~4Fh单元中的内容传送到外部RAm4800h~480Fh单元中。
4、编写程序将片外4800h~480Fh单元内容送到外部RAm5800h~580Fh单元中。
5、编写程序将片外RAm5800h~580Fh单元内容传送回片内RAm50h~5Fh单元中。
三、实验程序流程框图和程序清单.程序清单:oRg0000hsTART:moVR0,#30hmoVDpTR,#Qw1moVR5,#0Loop:Qw1:Qw2:Loop1:Loop2:Loop3:R7,#16A,R5A,@A+DpTR@R0,AR0IncR5R7,LoopQw200h,01h,02 h,03h,04h,05h,06h,07h08h,09h,0Ah,0bh,0ch,0Dh,0eh,0F hR0,#30hR1,#40hmoVR5,#16A,@R0@R1,AR0R1R5,Loop1R1,#4 0hmoVDpTR,#4800hR5,#16A,@R1@DpTR,AR1DpTRR5,Loop2moV sp,#60h11h,#48h10h,#58hR2,#00hDpL,R210h11hDphmoVxA, @DpTRmoVmoVmoVcmoVIncDJnZLJmpDbDbmoVmoVmoVmoVIncInc DJnZmoVmoVmoVmoVxIncIncDJnZmoVmoVmoVmoVpushpushpop popmoVxInccJnemoVmoVmoVLoop4:moVxmoVIncIncDJnZenD四,实验小结Dph@DpTR,AR2R2,#10h,Loop3R1,#50hDpTR,#5800hR5,#16A, @DpTR@R1,AR1DpTRR5,Loop41通过本次实验熟悉了keil软件的功能和使用方法.2掌握单片机的数据传送类和循环类汇编指令系统,学会了各种数据传送形式的程序设计方法.3掌握了单片机的调试方法。
单片机与PC的串行通讯 项目实现程序
实现单片机的串行通讯的汇编语言程序如下:ORG 0000AJMP MAINORG 0100HMAIN: MOV SP, #06HMOV SCON,#50H //8位UART(1 START ,8 DA TA ,1 STOP),允许接受MOV TMOD,#20H //T1工作方式2MOV TH1, #0FDHMOV TL1, #0FDHSETB TR1KEY: MOV A, #0FFHMOV P0, AMOV A, P0JNB ACC.0, KEY0JNB ACC.1, KEY1AJMP MAINKEY0: MOV P1, #0FFHK0: JB RI,KK //是否接收到数据,有则跳至KKSJMP K0KK: MOV A,SBUF //将接收到的数据保存到累加器MOV P1,A //输出至P1CLR RI //清除RISJMP K0RETKEY1: MOV P2, #0FFHK01: JB RI,KK1 //是否接收到数据,有则跳至KKSJMP K01KK1: MOV A,SBUF //将接收到的数据保存到累加器MOV P2,A //输出至P2CLR RI //清除RISJMP K0RETEND首先是PC机事件过程与程序Dim hand As Boolean'等待回应时间到标志位,为FALSE时时间没有到,TRUE时时间到Private Sub cancel_Click ()Unload MeEndEnd SubPrivate Sub send_Click ()'变量定义Dim strsend$, strbit$Dim intsend% '发送的字符长度Dim writebuff As V ariant '写输出缓冲区Dim readbuff$ '读输入缓冲区数据strsend = txtsend.Textintsend = Len(strsend)If intsend = 0 ThenMsgBox "请输入数字字符!", , "错误"Exit SubEnd If'数据完整性验证For i = 1 To intsend Step 1strbit = Mid(strsend, i, 1)Select Case strbitCase Is < "0", Is > "9"MsgBox "输入的数据中存在非数字字符!" & vbCrLf & "请重新输入!", vbRetryCancel, "错误"txtsend.Text = ""Exit SubEnd SelectNext iOn Error GoTo comrserror'串行通信口参数设置mPort = 1 '使用Com1做为串行通信口MSComm.Settings = "9600,n,8,1" '串口属性设置MSComm.InputLen = 1 '每次从接收缓冲区读取一个字符MSComm.InputMode = comInputModeText '以字符形式从缓冲区中接受字符MSComm.InBufferCount = 0 '清除输入缓冲区MSComm.OutBufferCount = 0 '清除输出缓冲区MSComm.PortOpen = True '打开通行端口txtport.Text = "COM" & mPorttxtmsg.Text = "串口COM" & mPort & "打开成功!波特率=9600bps"'发送握手信号handle:hand = False '开始发送握手信号时回应标志位为FALSEwritebuff = Chr$(&HFF) '准备握手信号&HffhMSComm.Output = writebuff '发送握手信号Timer.Enabled = True '启动应答定时器DoDoEventsIf hand ThenGoTo handle '定时时间到未收到回应信号重发握手信号End IfLoop Until MSComm.InBufferCount '等待回应'收到对方的回应Timer.Enabled = False'读取并判断是否为规定的联络信号readbuff = MSComm.InputIf Asc(readbuff) = 255 Thenwritebuff = Chr$(intsend)MSComm.Output = writebuff '收到正确的回应,发送字符个数和数据writebuff = strsendMSComm.Output = writebuffMSComm.PortOpen = False '发送完数据关闭端口Exit SubElseGoTo handleEnd Ifcomrserror:End SubPrivate Sub Timer_Timer()Timer.Enabled = Falsehand = True '定时间到关闭定时器,设置标志位End SubPrivate Sub txtsend_Click()txtsend.Text = ""End Sub然后是单片机的源程序datanum equ 20h ;存放接收到的数据个数dataadd equ 30h ;接收到的数据存放的地址org 0000hljmp mainorg 000bhljmp t0_intorg 0100h;主程序main: mov sp,#0fh ;从0fh开始设置堆栈mov tmod,#22h ;T0、T1工作于自动重装载方式mov th1,#0fdhmov tl1,#0fdhsetb tr1 ;晶振频率11.059Mhz,波特率设置为9600mov scon,#50h ;设置串行口工作于方式一mov 50h,#40mov 51h,#100mov th0,#6mov tl0,#6 ;1s定时初始化setb tr0 ;开定时器T0setb et0 ;开定时器T0中断setb ea ;开总中断mov datanum,#0 ;初始时接收数据的个数为0 display: mov r7,#6mov r0,#40hcl_next: mov @r0,#0inc r0djnz r7,cl_next ;数据显示区初始化display0: mov r0,#45h ;r0执行待输出的数据地址处mov r7,#6 ;扫描次数mov r6,#0feh ;r6存放数码管的位码,显示初始化display1: mov p0,r6 ;P0口输出位码mov p2,@r0 ;P2口输出段码dec r0 ;r0指向下一个待输出的段码mov a,r6rl a ;位码左移mov r6,ajbc ri,handle ;display_jmp: djnz r7,display1 ;显示未结束继续本次显示sjmp display0handle: mov r5,sbuf ;接收握手信号cjne r5,#0ffh,display_jmp ;非规定的握手信号mov sbuf,#0ffh ;应答握手信号jnb ti,$ ;等待发送结束clr tijnb ri,$ ;等待接受串行传输的字符个数clr rimov a,sbuf ;接收字符个数jz display_jmp ;没有收到数据mov datanum,a ;保存新数据的个数data_ti: setb f0mov r1,#dataadddata_get: jnb ri,$clr rimov @r1,sbuf ;将数据存入数据区inc r1djnz acc,data_get ;接收下一个字符lcall asctoduan ;调用Ascii码转段码程序ljmp display;Ascii码转换成段码子程序asctoduan: mov r1,#dataadd ;r1指向待转换的数据mov r2,datanum ;r2放转换个数mov dptr,#duanma ;dptr指向段码表loop: mov a,@r1 ;取转换数据clr c ;清除借位位subb a,#48movc a,@a+dptr ;取数据的段码mov @r1,ainc r1djnz r2,loop ;数据未转换完,继续setb rs0 ;选用寄存器组一mov r0,#dataaddmov r2,datanum;setb f0 ;新数据送入显示缓冲区clr rs0 ;ret;定时器T0中断子程序,实现数据动态显示t0_int: djnz 51h,intout ;内层循环未结束退出中断程序djnz 50h,intout0 ;外层循环未结束退出中断程序;定时1s时间到执行移位显示操作setb rs0 ;选用工作寄存器组一mov 0fh,40h ;40h单元暂存mov 40h,41hmov 41h,42hmov 42h,43hmov 43h,44hmov 44h,45h ;显示缓冲区数据左移一位jb f0,datamove ;f0=1允许移动数据,否则不允许mov 45h,0fh ;原40h单元数据放入45h中sjmp intout1 ;退出中断程序,为下次左移做准备;将数据区中的数据移动到显示缓冲区的45h单元datamove: mov 45h,@r0 ;将R0指向的数据区中的数据传送到显示缓冲区inc r0 ;r0指向下一个待移动的数据djnz r2,intout1 ;没有全部移入,退出为下次移动做准备mov r3,datanumcjne r3,#6,datamove0 ;不等于6时判定大于还是小于6 datamove1: clr f0 ;等于6时不允许sjmp intout1datamove0: jc datamove1 ;小于6不允许mov r0,#dataadd ;大于6时允许再移mov r2,datanumintout1: clr rs0 ;选用工作寄存器组0mov 50h,#40intout0: mov 51h,#100intout: reti;段码表duanma: db 3fh,06h,5bh,4fh,66h,6dh ;0,1,2,3,4,5db 7dh,07h,7fh,6fh,77h,7ch ;6,7,8,9,A,Bdb 58h,5eh,7bh,71h,00h,40h ;C,D,E,F,(空格),-end最后是6.2中提到的测试程序:mov 30h,#3fhmov 31h,#06hmov 32h,#5bhmov 33h,#4fhmov 34h,#66hmov 35h,#6dhmov 36h,#7dhmov 37h,#07hmov 38h,#7fhmov 39h,#6fhmov 3ah,#77hmov 3bh,#7chmov 3ch,#58hmov 3dh,#5ehmov 3eh,#7bhmov 3fh,#71hmov 08h,#dataaddmov datanum,#3mov 0ah,datanum setb f0。
实验6 单片机与PC机间的串行通信
实验6 单片机与PC机间的串行通信一、实验目的1、掌握电平转换器件RS-232的使用方法;2、掌握Proteus VSM虚拟终端(VITUAL TERMINAL)的使用;3、掌握单片机与PC机间的串行通信软硬件设计方法。
二、实验内容实现利用虚拟终端仿真单片机与PC机间的串行通信。
PC机先发送从键盘输入的数据,单片机接收后回发给PC机。
单片机同时将收到的30~39H间的数据转换成0~9的数字显示,其他字符的数据直接显示为其ASCII码。
单片机和PC机进行通信时,要求使用的波特率、传送的位数等相同。
要能够进行数据传送也必须首先测试双方是否可以可靠通信。
可在PC机和单片机上各编制非常短小的程序,具体可分成PC机串行口发送接收程序、单片机串行口发送程序和单片机串行口发送接收程序。
这三个程序能运行通过,即可证明串行口工作正常。
PC机串行口发送接收程序设置串行口为波特率9600、8位数据、1位停止位、无奇偶校验的简单设置。
从键盘接收的字符可从串行口发送出去,从串行口接收的字符在屏幕上显示。
通过让串行口发送线和接收线短接可测试微机串行口,通过让串行口和单片机系统相接,使用此程序可进一步测试单片机的串行通信状况。
具体程序用BASIC编制,简单易懂。
直接输入即可运行。
程序RS232.三、实验电路原理图图7-1 单片机与PC机间电路原理图四、实验步骤1、在PROTEUS中画好电路原理图。
2、串口模型属性设置串口模型属性设置为:波特率―4800;数据位―8;奇偶校验―无;停止位-1,如图7-2所示。
图7-2 串口模型属性设置3、虚拟终端属性设置PCT代表计算机发送数据,PCR用来监视PC接收到的数据,它们的属性设置完全一样,如图7-3所示。
SCMT和SCMR分别是单片机的数据发送和接收终端,用来监视单片机发送和接收的数据,它们的属性设置也完全一样,如图7-4所示。
单片机和PC机双方的波特率、数据位、停止位和检验位等要确保和串口模型的设置一样,并且同单片机程序中串口的设置一致。
单片机串行口与及PC机通讯实验实验报告
单片机系统设计及应用实验报告第次实验实验名称:单片机串行口与PC机通讯实验专业:姓名:学号:同组人员:学号:实验地点:实验时间:2016.12.15评定成绩:审阅教师:目录实验目的 (1)实验内容及要求 (4)实验原理及程序设计流程图 (5)调试过程及相关记录 (6)正确源代码 (6)实验心得 (7)一.实验目的(1)掌握串行口工作方式的程序设计,掌握单片机通讯的编制;(2)了解实现串行通讯的硬环境,数据格式的协议,数据交换的协议;(3)了解PC机通讯的基本要求。
二.实验内容及要求利用8051单片机串行口,实现与PC机通讯。
本实验实现以下功能,将从实验板键盘上键入的字符或数字显示到PC机显示器上,再将PC机所接收的字符发送回单片机,并在实验板的LED上显示出来。
三.实验原理89C51内部有一个可编程全双工串行通信接口。
该部件不仅能同时进行数据的发送和接收,也可作为一个同步移位寄存器使用。
本实验LED显示是在方式0下,串行口作为同步移位寄存器使用。
此时SM2、RB8、TB8均应设置为0。
发送数据:TI=0时,执行“MOV SBUF,A”启动发送,8位数据由低位到高位从RXD引脚送出,TXD发送同步脉冲。
发送完后,由硬件置位TI。
方式0的波特率为fosc/12,即一个机器周期发送或接收一位数据。
与PC通讯是方式1:一帧10位的异步串行通信方式,包括1个起始位,8个数据位和一个停止位。
当TI=0时,执行“MOV SBUF,A”指令后开始发送。
发送时的定时信号由定时器T1送来的溢出信号经过16分频或32分频得到的。
在接收到第9位数据(即停止位)时,必须同时满足以下两个条件:RI=0和SM2=0或接收到的停止位为“1”,才把接收到的数据存入SBUF中,停止位送RB8,同时置位RI。
在方式1下,SM2应设定为0。
四.实验流程图四.调试过程及相关数据记录(1)编写单片机发送和接收程序,并进行汇编调试。
运行PC机通讯软件“commtest.exe”,将单片机和PC机的波特率均设定为1200。
单片机与pc机通信
单片机与pc机通信下面是一个单片机与PC机通信的程序,pc机程序用c语言来编写,单片机程序用汇编语言来编写如果有什么问题请来本人建立的电子论坛讨论1. PC机编程PC采用Toubr C 进行编写。
程序如下:#include;#defineport0x3f8/*利用串口1进行通信*/int ch[15];main (){ int a; int i,j; int b[6]={88,15,38,26,20,0}; char c; clrscr(); outportb(port+3,0x80);/*准备设置波特率*/ outportb(port,0x0C);/*波特率设置为9 600 bps*/outportb(port+1,0x00); outportb(port+3,0x03);/*8位数据位,奇偶检验,1位停止位*/outportb(port+1,0x00);/*关中断*/ inportb(port+5);/*读一次线路状态寄存器,使其复位*/ {printf("\t\tsend data or receive data: (s or r?)\n\n\n");c=getchar();switch(c){case ’s’:case ’S’:{while(!(inportb(port+5)&0x20));/*发送保持器满则等待*/outportb(port,0x01);/*否则发送数据01通知单片机准备接收*/ for(i=0;i<6;i++)/*共发送6个数据*/{a=b[i];while(!(inportb(port+5)&0x20))delay(100);/*发送保持器满,等待*/outportb(port,a);/*发送a*/printf("%d\n",a);/*显示a*/while(!(inport(port+5)&1)); /*接收单片机送回的数据*/ch[i]=inport(port);/*保存*/}delay(10);for(j=0;j<8;j++)/*显示接收的回送数据*/printf("\n%d\n",ch[j]);getch();break;}case’r’:/*接收数据*/case’R’:{while(!(inportb(port+5)&0x20)); outportb(port,0x02);/*发送数据02通知单片机发送数据*/ for(j=0;j<9;j++)/*共接收9个数据*/{while(!(inportb(port+5)&1));ch[j]=inportb(port);}for(j=0;j<9;j++)printf("\n %d\n",ch[j]);getch();break;}}}}2. 单片机与PC机通信之单片机程序LIST P=16F876#INCLUDEP16F876.INCCBLOCK 0X24COUNTTEMPENDCORG0X0000NOPSTARTGOTOMAINORG0X020MAINMOVLW0X30;将RAM单元初始化 MOVWFFSRBCFSTATUS,RP0MOVLW0X22MOVWFCOUNTINTRAMMOVFCOUNT,0MOVWFINDFINCFCOUNT,1INCFFSR,1BTFSSFSR,7GOTOINTRAMBANKSELTXSTA;波特率设置为9 600 bps MOVLW0X19MOVWFSPBRG;异步高速方式MOVLW0X04MOVWFTXSTABCFSTATUS,RP0MOVLW0X80;串行口使能MOVWFRCSTAMOVLW0X30MOVWFFSRRCSTA,CREN;接收允许BSFSTATUS,RP0BSFTXSTA,TXEN;发送允许BCFSTATUS,RP0WAIT BTFSSPIR1,RCIF;接收PC机命令 GOTOWAITMOVFRCREG,0MOVWFTEMPMOVWFINDFINCFDECFSZTEMP;接收到的数据为1,则接收 GOTOTXW;否则发送数据MOVLW0X06MOVWFTEMPWAIT1BTFSSPIR1,RCIF;接收一个数据GOTOWAIT1MOVFRCREG,0MOVWFCOUNTMOVWFTXREGLOOPTXBTFSSPIR1,TXIF;将接收到的数据送回PC机 GOTOLOOPTXMOVFCOUNT,0MOVWFINDFINCFFSRDECFSZTEMPGOTOWAIT1GOTOOVER;处理完毕TXWMOVLW0X09;向PC机发送9个数据MOVWFTEMPMOVLW0X30MOVWFFSRTXW0MOVFINDF,0MOVWFTXREGINCFFSRTXW1BTFSSPIR1,TXIF GOTOTXW1DECFSZTEMPGOTOTXW0OVERBCFRCSTA,CREN;通信任务完成,关接受和发送允许BSFSTATUS,RP0BCFTXSTA,TXENBCFSTATUS,RP0CALLLED;调用显示子程序,将发送(或接收)的数据显示出来END;程序完。
单片机数据传送
*p50=*p4800; p50=p50+1; p4800=p4800+1; }}
//B3
四、汇编语言及注释
92: ?C_STARTUP: LJMP STARTUP1
93:
94:
RSEG ?C_C51STARTUP
95:
96: STARTUP1:
97:
98: IF IDATALEN <> 0
0x4F
0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B 0x4C 0x4D 0x4E 0x4F 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50
P50
0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50
P4800
0x004800 0x004800 0x004800 0x004800 0x004800 0x004800 0x004800 0x004800 0x004800 0x004800 0x004800 0x004800 0x004800 0x004800 0x004800
C:0x007A BB0106 CJNE
C:0x007D 8982 MOV
C:0x007F 8A83 MOV
C:0x0081 F0
MOVX
C:0x0082 22
RET
C:0x0083 5002 JNC
C:0x0085 F7
单片机数据区传送程序设计
单片机数据区传送程序设计一、实验目的1.进一步掌握汇编语言程序设计和调试方法。
2.了解单片机RAM中的数据操作。
二、实验内容1.要求:编写程序把R2、R3源RAM区首地址内的R6、R7字节数据传送到R4、R5目的地址的RAM区。
2.框图如下,文件名为:X X X X S2班级学号三、实验步骤1.打开电源,PC机开机正常工作后,启动Keil C集成开发环境。
2.新建工程,新建文件、保存并添加到工程中。
3. 在编辑器中编写程序,完成功能要求。
在R2、R3中输入源地址(例如:0000H),R4、R5中输入目的地址(例如2000H),R6、R7中输入字节数(例如:1FFFH)。
3.查看RAM 区0000~1FFFH和2000~3FFFH内容,也可自己重新赋值。
4.编译程序,运行程序,首先单步,然后用自动单步,最后用连续运行方式。
5.记录下运行结果,检查0000~1FFFH中内容是否和2000~3FFFH内容完全一致。
四、要求1.写出自己编写的程序,并写出原理性注释。
2.将检查程序运行的结果,分析一下是否正确。
五、思考题如果使0000~1000H中内容与2000~3000H内容完全一致,如何来改写程序?六、参考程序参考程序1:ORG 0000HLJMP MAIN...ORG 0100HMAIN: MOV R2,#00HMOV R3,#00HMOV R4,#20HMOV R5,#00HMOV R6,#1FHMOV R7,#0FFHSE22: MOV DPL,R3MOV DPH,R2 ;建立源程序首址MOVX A,@DPTR ;取数MOV DPL,R5MOV DPH,R4 ;目的地首址MOVX @DPTR,A ;传送CJNE R3,#OFFH,LO42INC R2LO42: INC R3 ;源地址加1CJNE R5,#0FFH,L043INC R4LO43: INC R5 ;目的地址加1CJNE R7,#00H,LO44CJNE R6,#00H,LO45 ;字节数减1SJMP $NOPLO44: DEC R7SJMP SE22LO45: DEC R7DEC R6SJMP SE22 ;未完继续END参考程序2:ORG 0000HLJMP MAIN...ORG 0100HMAIN: MOV R2,#00HMOV R3,#00HMOV R4,#20HMOV R5,#00HMOV R6,#1FHMOV R7,#0FFHSE22: MOV DPL,R3MOV DPH,R2 ;建立源程序首址MOVX A,@DPTR ;取数INC DPTRMOV R2,DPHMOV R3,DPLMOV DPL,R5MOV DPH,R4 ;目的地首址MOVX @DPTR,A ;传送INC DPTRMOV R4,DPHMOV R5,DPLDEC R7CJNE R7,#00H,SE22CJNE R6,#00H,LO45 ;字节数减1SJMP $NOPLO45: DEC R6SJMP SE22 ;未完继续END。
毕业论文PC机与单片机之间的串行通讯、数据的发送和接收
【摘要】本文以MCS-51单片机为例,详细介绍了PC机与单片机之间的串行通讯、数据的发送和接收。
在Windows98下利用VB的串行通讯控件可实现PC机与单片机之间的通讯。
其数据的发送和接收采用红外线通信方式,其优点是:省去了有线通信信号线的直接连接,使用简单,移动方便,微机与单片机无直接连接,属完全隔离状态,两者间不会因为电平的不同而造成数据传输的失误,抗干扰能力强。
本设计主要应用AT89C51作为控制核心,并与LED数码显示管、双向可控硅、红外发射与接收相结合的系统,充分发挥了单片机的性能。
其优点硬件电路简单,软件功能完善,控制系统可靠,性价比较高等特点,具有一定的使用和参考价值。
】【关键字关键字】MSC-51(单片机),红外,RS-232,电平转换器,串行通信半双工】Abstract】【AbstractThis text take one-chip computer MCS-51for example,introduce a serial communication,data’s sending and receiving.Under the Windows98we make use of a communication control of VB to achieve the communication of the machine of PC and one-chip computer. Its data’s sending and receiving adopts the method of the infrared ray communication,its advantage is that it exclude the direct link of signal line of with-wired communication,and usage are simple,and move is convenience etc.The tiny machine have no direct conjunction with single a machine,belonging to the complete insulation appearance,can't result in the error that data deliver both because give or get an electric shock even and different,the antijam ability is strong.This design is a system that it applies AT89C51as control core and combine the LED figures manifestation tube,MAX232CPE level changer,infrared’s sending and receiving.The system completely exerts the function of one-chip computer.Its advantage is that the hardware circuit is simple;the software function is perfect;the control system is dependable;the rate of price and function is high etc.So the system has certainly consult value.】【KeywordKeyword】MSC-51(One-chip computer),infrared,RS-232,Level changer,serial communication,half duplex目录前言3第一章系统分析4 1.1系统功能的概述5 1.2系统要求及主要内容5 1.3系统技术指标5第二章系统总体设计6 2.1硬件设计思路6 2.2软件设计思路7第三章7 3.1单片机模块设计8 3.2红外通信(发射与接收)电路的设计14 3.3PC机模块的设计第四章20 4.1单片机串行口通信21 4.2PC机串口通信24第五章软件设计25 5.1单片机通信程序设计25 5.2PC机通信程序设计29第六章系统调试30 6.1硬件调试30 6.2软件调试31 6.3综合调试33 6.4故障分析及解决方案33 6.5结论与经验34结束语35附录36附录1电路原理图36附录2程序流程图38附录3程序清单41附录4元器件清单44附录5英文资料45附录6中文翻译52参考文献56前言单片机的英文名称是Micro Controller unit,缩写为MCU,又称为微控制器,它是一种面向控制的大规模集成电路芯片。
汇编语言实现串口通信(PC和单片机间)
8.用C语言或汇编语言实现串口通信(PC和单片机间)上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。
由于PC 机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC 机作为上位机,单片机作为下位机,二者通过RS-232或者RS-485接收、发送数据和传送指令。
单片机可单独处理数据和控制任务,同时也将数据传送给PC机,由PC机对这些数据进行处理或显示1 硬件电路的设计MCS-51单片机有一个全双工的串行通讯口UART,利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。
所以单片机和PC机之间可以方便地进行串口通讯。
单片机串口有3条引线:TXD(发送数据),RXD(接收数据)和GND(信号地)。
因此在通信距离较短时可采用零MODEM方式,简单三连线结构。
IBM-PC机有两个标准的RS-232串行口,其电平采用的是EIA电平,而MCS-51单片机的串行通信是由TXD(发送数据)和RXD(接收数据)来进行全双工通信的,它们的电平是TTL电平;为了PC机与MCS-51机之间能可靠地进行串行通信,需要用电平转换芯片,可以采用MAXIM公司生产的专用芯片MAX232进行转换。
电路如图1所示。
硬件连接时,可从MAX232中的2路发送器和接收器中任选一路,只要注意发送与接收的引脚对应关系即可。
接口电路如图3.5所示。
总体设计按照整体设计思路方案绘制原理图如下所示:2 系统软件设计软件设计分上位机软件设计和下位机软件设计。
这两部分虽然在不同的机器上编写和运行,但它们要做的工作是对应的:一个发送,另一个接收。
为了保证数据通信的可靠性,要制定通信协议,然后各自根据协议分别编制程序。
现约定通信协议如下:PC机和单片机都可以发送和接收。
上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。
采用RS-232串口异步通信,1上位PC机与下位单片机异步串行通信的通信协议其中,单片机号代表现场第几台单片机,占用1个字节,发送两次的目的是为了防止干扰;命令码则代表上位机向下位机发布的工作命令,它也占用1个字节,发送两次的目的也是为了防止干扰。
单片机双机串行通信多数据传输汇编语言编程实现
• 178•串口是单片机与其他单片机或计算机系统进行异步串行通信的标准I/O 接口,在系统设计中应用非常广泛。
以教学中使用的CPU 字长是8位的51单片机为例,实现双机间多数据串行传输,在多数据发送时为每个数据增加特征值,接收的时候通过特征值判断接收的数据,此方法最多可以实现双机间16个数据的传送,适用于5-8个通道的数据采集系统。
将此设计思想应用在0-999s 的秒表系统设计中,系统运行稳定,实现预期效果。
单片机串口是异步串行通信,发送方发送数据并不考虑接收方什么时候接收,如果是传送1个数据比较好处理,串口无论工作在查询方式下还是中断方式下,接收方的CPU 只要检测RI =1,就可以接收数据。
如果发送方发送的是多个数据,接收方接收的是发送方发送的多个数据的哪一个?发送方发送的多个数据是动态变化的,尽管发送方发送多个数据的顺序在编程中是固定不变的,但是串口通信是异步的,接收方接收时,无法知道此次接收的数据是发送方发送的哪一个数据,所以接收方必须有能力判断接收到的是哪一个数据才能真正实现异步串行通信多数据的正确传送。
1 发送数据的加密原理及编程实现要想让接收方有能力判断接收的数据是哪一个数据,可以对要发送的数据做加密处理,数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性。
本设计借用数据加密的思想,对要发送的数据采用增加特征值的加密处理方法,乙机接收数据后,通过解密获取特征值,就可以知道接收的是哪一个数据了。
特征值的选取要视发送数据的范围,本文以发送压缩BCD 码说明数据加密的原理及编程实现。
1.1 发送数据的加密原理压缩BCD 码是用4位二进制表示1位十进制,由于设计中使用的单片机CPU 的字长是8位的,所以一次可以处理1个字节数据,用字节表示1位BCD 码的时候,高4位一定是“0”,低4位是”0-9”中的1个数字,这样用高4位的“0”就可以实现对数据加密处理。
C8051F单片机和PC机串口通讯程序
C8051F单片机和PC机串口通讯程序//------------------------------------------------------------------//串口编程--接收PC发过来的字符串,回发字符串.发送期间中断控制LED灯闪烁//采用外部晶振22.1184MHz 使用定时器1,方式2产生波特率,SMOD = 0或者1//定时器初值X=256-SYSCLK*(SMOD+1)/(BAUDRATE*384)////程序编写: 郭郭//编程时间: 2005,12,30//最后修改: 2005,12,31//------------------------------------------------------------------#include <C8051F020.h>sfr16 TMR3RL = 0x92; //定时器3重装载寄存器sfr16 TMR3 = 0x94; //定时器3计数器#define uchar unsigned char#define uint unsigned int//------------------------------------------------------------------//参数设置区//------------------------------------------------------------------#define BAUDRATE 4800 //波特率bps#define CLKOUT 22118400 //外部晶振,修改也要修改OSCXCN#define SMODVAL 0 //SMOD的值,修改请也修改PCONVAL#define PCONVAL 0x00 //PCON的值,=0x00时SMOD0=0; =0x80时SMOD0=1#define TXVAL (256-CLKOUT*(SMODVAL+1)/BAUDRATE/384) //定时器初值#define MAX_LEN 10 //每次接收/发送字符串的长度//------------------------------------------------------------------//全局变量//------------------------------------------------------------------sbit LED = P1^6; //LED '1'亮 '0'灭bit readFlag = 0; //读标志uchar readCounts = 0; //已经读取的字符个数,与MAX_LEN比较uchar idata trdata[MAX_LEN]; //要接收/发送的字符串//------------------------------------------------------------------//子函数声明//------------------------------------------------------------------void SYSCLK_Init(void); //系统时钟初始化void PORT_Init(void); //端口初始化void UART0_Init(void); //串口UART0初始化void Send_Char(uchar ch); //发送单个字符void Send_String(uchar * str, uint len); //发送一个字符串void UART0_ISR(); //串口中断服务程序,接收字符void Timer3_Init(uint counts); //定时器3初始化void Timer3_ISR(void); //定时器3中断服务程序//------------------------------------------------------------------//主函数//------------------------------------------------------------------void main(void){WDTCN = 0xde; //禁止看门狗WDTCN = 0xad;SYSCLK_Init(); //时钟初始化PORT_Init(); //端口初始化UART0_Init(); //串口初始化Timer3_Init(CLKOUT/12/10); //定时器初始化EA = 1; //开全局中断while(1){if(readFlag) //已经读取{readFlag = 0; //清零Send_String(trdata,MAX_LEN); //发送字符串}}}//------------------------------------------------------------------//子函数具体实现//------------------------------------------------------------------//系统时钟初始化void SYSCLK_Init(void){uint i;OSCXCN = 0x67; /采用外部晶振22.1184MHz,不分频. 选型OSCXCN=0110,0111for(i=0;i<256;i++); //等待>1mswhile(!(OSCXCN&0x80)); //查询直到XTLVLD=1,晶振稳定OSCICN = 0x88;//切换到外部振荡器,允许时钟失效监测器. OSCICN=1000,1000}//端口初始化void PORT_Init(void){XBR0 = 0x04; //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100XBR1 = 0x00;XBR2 = 0x40; //交叉开关使能P0MDOUT |= 0x03; //P0.0为推拉方式输出,即TX0,RX0所在的端口 0000,0011P1MDOUT |=0x40; //P1.6为推拉方式输出,即LED所在的端口0100,0000}//串口初始化void UART0_Init(void){SCON0 = 0x50; //选择串口方式1,波特率可变SCON0=0101,0000TMOD = 0x20; //选择T1,方式2,自动再装入8位计数器TH1 = (int)TXVAL;//T1初值,根据波特率,时钟等计算. 0xF4,bps=4800bpsTL1 = (int)TXVAL;ES0 = 1; //UART0中断开启TR1 = 1; //启动定时器T1PCON |= PCONVAL; //PCON=0x00,SMOD = 0 ; PCON=0x80,SMOD=1TI0 = 1; //声明TX0就绪,可以发送TR0 = 1;}//定时器初始化void Timer3_Init(uint counts){TMR3CN = 0x00; //禁止定时器T3,清TF3,采用SYSCLK/12为时基TMR3RL = -counts; //初始化重装载值TMR3 = 0xffff; //设置为立即重装载EIE2 |= 0x01; //T3中断开启TMR3CN |= 0x04; //启动T3}//发送单个字符void Send_Char(uchar ch){SBUF0 = ch; //送入缓冲区while(TI0 == 0); //等待发送完毕TI0 = 0; //软件清零}//发送字符串,调用Send_Char() len字符串长度void Send_String(uchar * str,uint len){uint k = 0;do{Send_Char(*(str + k));k++;} while(k < len);}//定时器3中断服务程序void Timer3_ISR(void) interrupt 14 using 0{TMR3CN &= ~(0x80); //清TF3LED = ~LED;}//UART0中断服务程序. 接收字符void UART0_ISR(void) interrupt 4 using 1{uchar rxch;if(RI0) //中断标志 RI0=1 数据完整接收{RI0 = 0; //软件清零rxch = SBUF0; //读缓冲if(readCounts>=MAX_LEN){readCounts = 0;readFlag = 1;}trdata[readCounts] = rxch; //存入数组,供发送readCounts++;}}//-------------------------------------------------------------//程序结束//--------------------------------------------------------------。
PC机与单片机的通信实验
智能电子版电子报/2002年/11月/03日/第012版/PC机与单片机的通信实验江西王强喜欢单片机的朋友可不要错过这个实验 PC机与单片机通信实验。
单片机本身就是一个CPU,它能够执行和处理指令,假若想再用PC机去控制它,可以从这个实验开始。
PC机与单片机的通信,一般都是用串行口。
其波特率和数据位由自己设定(请参照汇编语言实现串行口通信)。
硬件电路如附图所示。
芯片MC1488和M C1489的作用是通过电平转换使得RS-232的逻辑电平与一般微处理器单片机的逻辑电平一致。
PC机汇编语言收发程序如下:STACK SEGM ENT PARASTACK STACKDB256DUP(0)STACK ENDSDATA SEGM ENTDATA ENDSCODE SEGM ENT PARAPUBLIC CODEASSUM E CS:CODE,DS:DATAPUSH DSM OV AX,0PUSH AXM OV AX,DATAM OV DX,AXASSUM E DS:DATAM OV DX,3FB H;初始串口M OV AL,80HOUT DX,ALM OV DX,3F8HM OV AL,60HOU T DX,ALMOV DX,3F9HMOV AL,0OU T DX,ALMOV DX,3FBHMOV AL,0B HOU T DX,ALMOV DX,3F9HMOV AL,0OU T DX,ALSEN:M OV DX,3FDHIN AL,DXMOV AH,1;从键盘接收一个字符INT21HMOV DX,3F8H;发送OU T DX,ALMOV AH,2INT21HMOV AH,4CHiINT21HCODE ENDS单片机接收程序:MOV TM OD,#20HMOV TL1,#0F4HMOV TH1,#0F4HMOV SCON,#50HMOV PCON,#00HSET B TR1;初始化并设波特率WAIT:JNB T1,WAIT;开始接收CLR RIMOV DPTR,#0FF21H;送LED显示地址M OV A,#01HM OV@DPT R,AM OV A,SBUFM OV DPTR,#CODE M OV A,@A+DPTRMOV DPT R,#0FF22HMOVX@DPTR,A;接收数据送显示SJMP WAITCODE DB0C0H,!!;LED代码表根据数码管为共阳/共阴确定。
实验单片机与PC机串口通信.
实验单片机与PC机串口通信(C51编程)实验要求:1、掌握串行口的控制与状态寄存器SCON2、掌握特殊功能寄存器PCON3、掌握串行口的工作方式及其设置4、掌握串行口的波特率(bond rate)选择任务:1、实现PC机发送一个字符给单片机,单片机接收到后即在个位、十位数码管上进行显示,同时将其回发给PC机。
要求:单片机收到PC机发来的信号后用串口中断方式处理,而单片机回发给PC机时用查询方式。
采用软件仿真的方式完成,用串口调试助手和KEIL C,或串口调试助手和PROTEUS分别仿真。
需要用到以下软件:KEIL,VSPD XP5(virtual serial ports driver xp5.1虚拟串口软件),串口调试助手,Proteus。
(1)虚拟串口软件、串口调试助手和KEIL C的联调首先在KEIL里编译写好的程序。
打开VSPD,界面如下图所示:(注明:这个软件用来进行串口的虚拟实现。
在其网站上可以下载,但使用期为2周)。
左边栏最上面的是电脑自带的物理串口。
点右边的add pair,可以添加成对的串口。
一对串口已经虚拟互联了,如果添加的是COM3、COM4,用COM3发送数据,COM4就可以接收数据,反过来也可以。
接下来的一步很关键。
把KEIL和虚拟出来的串口绑定。
现在把COM3和KEIL绑定。
在KEIL 中进入DEBUG模式。
在最下面的COMMAND命令行,输入(以上参数设置注意要和所编程序中设置一致!)打开串口调试助手可以看到虚拟出来的串口COM3、COM4,选择COM4,设置为波特率9600,无校验位、8位数据位,1位停止位(和COM3、程序里的设置一样)。
打开COM4。
现在就可以开始调试串口发送接收程序了。
可以通过KEIL发送数据,在串口调试助手中就可以显示出来。
也可以通过串口调试助手发送数据,在KEIL中接收。
实验实现PC机发送一个字符给单片机,单片机接收到后将其回发给PC机。
单片机与pc机之间的通信例程
单片机与PC机之间的通信例程1. 引言单片机与PC机之间的通信是嵌入式系统开发中非常重要的一部分。
通过单片机与PC机之间的通信,可以实现数据传输、命令控制等功能。
本文将介绍单片机与PC 机之间通信的基本原理以及编写通信例程的步骤。
2. 单片机与PC机通信原理单片机与PC机之间的通信可以通过串口(UART)或者USB接口实现。
串口是一种常见且简单的通信方式,适用于低速数据传输。
USB接口则具有更高的传输速率和更复杂的协议,适用于高速数据传输和复杂的控制。
2.1 串口通信原理串口通信使用两根线(TXD和RXD)进行数据传输。
发送端将数据通过TXD线发送到接收端,接收端通过RXD线接收数据。
发送端和接收端需要使用相同的波特率(Baud rate)进行通信,波特率决定了每秒钟传输的位数。
2.2 USB通信原理USB通信使用四根线进行数据传输:VCC(供电)、GND(地线)、D+、D-(数据线)。
USB接口还包括一个复杂的协议,如USB1.1、USB2.0、USB3.0等。
3. 编写通信例程的步骤编写单片机与PC机之间的通信例程,需要以下步骤:3.1 确定通信方式首先需要确定使用串口通信还是USB通信。
根据实际需求选择合适的通信方式。
3.2 配置硬件根据选择的通信方式,配置单片机和PC机的硬件接口。
如果使用串口通信,需要连接TXD和RXD线;如果使用USB通信,需要连接VCC、GND、D+、D-线。
3.3 编写单片机程序根据单片机的型号和开发环境,编写单片机程序。
程序中需要包含对串口或USB接口的初始化配置以及数据传输或命令控制的代码。
3.4 编写PC机程序在PC机上编写相应的程序,用于与单片机进行通信。
根据选择的通信方式,编写串口或USB接口相关的代码。
在使用串口通信时可以使用Python中的serial库进行串口读写操作。
3.5 测试与调试将编写好的单片机程序烧录到单片机中,并运行PC机程序。
通过监视器或调试工具查看数据传输情况,并进行必要的调试。
单片机与电脑通讯
单片机与电脑通讯1.实验目的与效果:学习单片机串口通讯原理以及相关编程。
实现单片机发送信息到电脑上和接收电脑发来的信息。
(RS232串口通信协议请查看相关的单片机教程,教程里都有详细介绍)2.原理图:RS232通讯原理图3.实验板上操作:1) 将实验板上的晶振换成11.0592M那个,(一定要换成这个晶振)。
(有配送)2)用实验板配备的串口延长线将电脑的串口移实验板上的串口连接起来。
把数码管位选开关拨到ON上(请看实物图1)。
3)把液晶那边的拨码开关全部拨到OFF,也就是不要拨到ON上(看实物图2)4)打开串口调试助手2.1,设置如下图:(看好哦)4)按一下SW1,单片机将每隔一定时间向电脑发送信息:00~FF;在按一下SW1就停止发送,再按一下又开始发送。
5)在串口调试助手2.1里的数据写入ff,然后点击“手动发送”,看看实验板上的数码管是不是显示255。
同样道理在数据发送区输入小于FF的数,在数码管将显示该数的十进制值。
如果串口通讯不成功或者出错请查看晶振是否对了?串口调试助手2.1上的波特率设置对了没有?4.实验板上连接图:实物图1:实物图2:5.C语言程序://MCU: AT89S51//晶振:11.0592M (一定要用这个晶振)#include"AT89X51.H"#include "absacc.h"#include "stdio.h"#include "stdlib.h"unsigned char code numcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//数字0~9及"-"共阳数码管代码unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char dispbuff[8]={0,0,0,0,0,0,0,0};unsigned char disp_bit_count;unsigned char disp_count;unsigned char send_allow=1;unsigned int send_count; /*定时器计数变量*/unsigned char zhi=0;unsigned char r_char;/********1ms延时子程序***********/delay_nms(unsigned int n){unsigned int i;unsigned char j;for(i=0;i<n;i++)for(j=0;j<120;j++); //空操作}void main(void){// 以下是设置中断和定时器PT0=1;ET0=1;ES=1; //开串口接收中断IT0=1;IT1=1;TMOD=0X20;// 定时器0为产生1ms的中断,定时器1为9600bit/s 的波特率发生器TH0=-1000/256;TL0=-1000%256;TL1=0xfd; //波特率发生TH1=0xfd;SCON=0xd8;PCON=0X00;//波特率不加倍// 开定时器TR1=1;TR0=1;TI=1;EA=1;while(1){if(P2_0==0){delay_nms(2);if(P2_0==0){//按键SW1按下,停止发送,再按一下继续发送send_allow^=1;while(P2_0==0);}}}}// 定时器0的中断服务程序,向串口发送姿态数据。
单片机汇编实验五2:单片机与PC机串行通信实验
单片机汇编实验五-2:单片机与PC机串行通信实验实验要求:AT89S52串行通信口工作在方式1,8位UART方式,允许接收,9600bps。
在PC机上运行串口调试软件。
编程实现:AT89S52内部定时器1,按方式1工作,每1秒钟内部RAM30H单元内容加1,并通过串行通信口送PC机显示。
//This is the fifth_2 program of homework//This is made by WQData:2013/3/4/ORG 0000HAJMP MAINORG 0023H//0023H 串口中断程序的入口地址AJMP TransferORG 000BH//000BH 计时器程序T0入口地址AJMP WT0MAIN:MOV TMOD,#21H//定时器的工作方式寄存器MOV TH0,#4CH//定时器0MOV TL0,#00H//定时器0MOV R3,#40//R3做一个计数器SETB EA//开总中断SETB ET0//允许计时器SETB TR0//开启计时器0MOV TH1,#0FDHMOV SCON,#50H;传口工作方式1,允许中断接受 SJMP $ORG 0100HWT0:MOV TH0,#4CH //计时器0置数MOV TL0,#00HDJNZ R3,RETN//1秒钟到来了MOV R3,#50SETB ES//打开串口中断SETB TR1//打开定时器1MOV R1,#30HMOV @R1,#89HMOV R1,#030HMOV A,@R1MOV SBUF,A//将内存中的数据传送给计算机RETN:RETI//中断子程序的返回指令Transfer:JNB TI,$CLR TIMOV P1,A RETIEND。
串口通讯-单片机向电脑发送数据
#include<reg52.h>unsigned char data1[]={"have a nice day!"}; //这是要发送的数据,它将//显示在电脑的串口调试助手上bit sent_over;//定义一个本次字符是否已经发送完毕的标志位void serial_timer1_init() //串口及定时器1的初始化函数{SCON=0x40;//串口工作方式1,只发送不接收数据PCON=0x00;//不倍增ES=1;//开串口中断EA=1;//开总中断TMOD=0x20;//定时器工作方式2,8位自动重装TH1=0xfd;//初值为0xfd,波特率9600TL1=0xfd;TR1=1;//开定时器1}void serial_ISR() interrupt 4//串口中断服务例程,每发送完一个字符{//就会中断一次TI=0;//TI=0,为下一次发送字符数据作准备sent_over=1;//本次字符已经发送完毕,标志位置1}//使下一次发送字符能够进行void main(){serial_timer1_init();sent_over=1;//置为1,使第一次发送字符能够进行while(1){static unsigned char i=0;//定义一个静态局部变量,便于在data1中取出字符if(sent_over==1)//如果为1,说明本次字符已经发送完毕,可以进行{//下个字符发送了SBUF=data1[i];//发送字符sent_over=0;//清0,等字符发送完毕,在中断里再重新置1if(data1[i]!='\0')//如果整个字符数组还没发送完,就继续发送i++;else while(1);//如果整个字符数组发送完了,就使单片机停下来}}}。