51单片机与PC串口通讯
目录
第1章需求分析 ............................................................................................................................ - 1 -
1.1课题名称 (1)
1.2任务 (1)
1.3要求 (1)
1.4设计思想 (1)
1.5课程设计环境 (1)
1.6设备运行环境 (2)
1.7我在本实验中完成的任务 (2)
第2章概要设计 ............................................................................................................................ - 2 -
2.1程序流程图 (2)
2.2设计方法及原理 (3)
第3章详细设计 ............................................................................................................................ - 3 -
3.1电路原理 (3)
3.1.1STC89C52芯片 ............................................................................................................. - 3 -3.2串口通信协议 (4)
3.3程序设计 (5)
3.3.1主程序模块 .................................................................................................................... - 5 -
3.3.2串口通讯模块 ................................................................................................................ - 6 -
3.3.3控制部分文件 ................................................................................................................ - 8 -
3.3.4公共部分模块 .............................................................................................................. - 11 -3.4电路搭建 (12)
3.4.1电路原理图 .................................................................................................................. - 12 -第4章上位机关键代码分析 ...................................................................................................... - 12 -
4.1打开串口操作 (12)
4.2后台线程处理串口程序 (15)
4.3程序运行界面 (18)
第5章课程设计总结与体会 ...................................................................................................... - 19 -第6章致谢 .................................................................................................................................. - 19 -参考文献........................................................................................................................................... - 19 -
第1章需求分析
1.1 课题名称
故障诊断数据采集通信系统设计与制作。
1.2 任务
1、进行协议分析,完成单片机硬件电路原理图设计,在面包板上搭建电路。
2、测试上位机与单片机的通讯状态,实现实验要求部分的功能。
1.3 要求
1、单片机能接收并识别上位机的查询请求。
2、单片机能够查询对应接口的状态,并返回接口状态给上位机。
3、能够通过按钮来控制单片机相应接口的状态,相应接口的状态通过LED灯的亮灭状态来表示。
1.4 设计思想
根据实验要求,设计数据采集电路,选择合适的元器件,按照原理图,并根据各个元器件的特性以及接口电路结构形式,在面包板上搭接实际电路,搭接完毕之后对电路做优化设计,使电路尽量简洁。
通过与上位机的连接测试,来优化单片机程序的代码,使上位机和下位机能够很协调的工作。
软件编程:使用C语言实现下位机的程序设计。
1.5 课程设计环境
1. Windows XP的PC机。
2. Keil uVision3集成开发环境。
3. 串口调试助手
3. 单片机最小系统开发板。
4. 面包板和外围器件
5. 万用表等辅助工具
1.6 设备运行环境
由STC89C52单片机和面包板搭建的电路板。
1.7 我在本实验中完成的任务
在和小组成员讨论之后,我们小组成员分工合作,我完成的工作是单片机串口的设置及接收上位机的串口数据,并对流数据进行分析。
第2章 概要设计
2.1 程序流程图
发送接口状态给上位
开始
初始化串口设置
初始化控制口
串口数据分析
查询接口状态
是否有控制按键按下
检查串口中是否有数据
返回查询要求
确定按下的按钮
改变按钮对应接口状态
Y
N
N Y
2.2 设计方法及原理
1、USB转串口模块将USB接口转化为串口后与单片机相连,用来实现单片机与PC机通过串口通讯。
2、初始化单片机串口的设置,使之与上位机的设置相符,具体为通信速率9600B/S,停止位1位,数据位8位。
3、本系统串口数据接收是采用的查询方式,单片机每次循环查询串口是否收到了数据。
4、上位机若连续查询接口状态2次都收不到回复,上位机可以判断与从机失去联系,所有接口状态都置为不正常状态
第3章详细设计
3.1 电路原理
3.1.1STC89C52芯片
1、芯片引脚
51系列的DIP封装的单片机共有40
个外部引脚,其中有P0,P1,P2,P3四组IO
口,详细如右图。
2、芯片串口工作原理
1、波特率选择
波特率(Boud Rate)就是在串口通
信中每秒能够发送的位数(bits/second)。
MSC-51串行端口在四种工作模式下有
不同的波特率计算方法。下面以工作模
式1为来说明串口通信波特率的选择。
在串行端口工作于模式1,其波特率
将由计时/计数器1来产生,通常设置定
时器工作于模式2(自动再加模式)。在
此模式下波特率计算公式为:
波特率=(1+SMOD)*晶振频率/(384*(256-TH1))
其中,SMOD——寄存器PCON的第7位,称为波特率倍增位;
TH1——定时器的重载值。
2、SBUF数据缓冲寄存器
这是一个可以直接寻址的串行口专用寄存器。SBUF包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都共同使用同一个寻址地址-99H。CPU在读SBUF 时会指到接收寄存器,在写时会指到发送寄存器。
3、SCON串行口控制寄存器
通常在芯片或设备中为了监视或控制接口状态,都会引用到接口控制寄存器。SCON就是51芯片的串行口控制寄存器。它的寻址地址是98H,是一个可以位寻址的寄存器,作用就是监视和控制51芯片串行口的工作状态。51芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON寄存器。它的各个位的具体定义如下:(MSB)(LSB)
SM0 SM1 SM2 REN TB8 RB8 TI RI 串行口控制寄存器SCON
SM0、SM1为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。看表串行口工作模式设置。
SM0 SM1 模式功能波特率
0 0 0 同步移位寄存器fosc/12
0 1 1 8位UART 可变
1 0
2 9位UART fosc/32或fosc/64
1 1 3 9位UART 可变
3.2 串口通信协议
通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。
主机通过轮询方式访问从机,通过发送从机地址呼叫从机,地址相符合的从机把数据发送给主机
通信格式:
主机发送数据格式:
起始字节地址字节结束字节
$ 从机地址#
1个1个1个
主机每隔5秒钟查询一遍
从机发送数据格式:校验为和校验
地址字节数据字节校验字节
1个1个1个
备注: 1、上述字节都表示只占一个字节空间,每次发送3个字节
从机地址分配:①号:0X01; ②号:0X02; ③号:0x03;
④号: 0X04; ⑤号:0X05 ; ⑥号:0X06;
⑦号:0X07; ⑧号: 0X08: ⑨号:0X09
3、数据字节
01010101表示检测到故障;01 55 56
10101010表示没有检测到故障
3.3 程序设计
3.3.1主程序模块
1、main.c
#include
#include
#include "uart.h"
#include "common.h"
#include "control.h"
UCHAR rstr[TX_PAYLOAD_WIDTH]={0};
void main() //接收
{
uchar t;
bool sta;
uchar key;
InitUart(); //串口初始化
InitControl(); //控制端口初始化
while(1) //主程序不断的对接收到的数据进行分析
{
if(RI==1) //检查一下串口中有没有数据(每次一个字节)
{
AppendByte(SBUF); //向协议窗口中增加一个数据
RI=0; //清除串口中断
t=ProtocolAnalysis(); //进行协议分析
if(t!=0)
{
sta=GetSta(t); //查询接口状态
SendSta(t,sta); //发送接口状态
}
UartSend("ENA",3);
}
//对按钮状态进行查询, 如果有按钮被按下,将对应接口状态改变,然后将对应接口状态发给上位机
key=GetKey();
if(key!=0) //有键盘按下
{
ChangeSta(key);
// 使用下面两句话接口状态改变之后会立刻通知上位机, 现在上位机采用查
询方式来了解接口的状态,故不需要这两句话
if(key==3)
{
sta=GetSta(key); //查询接口状态
SendSta(key,sta); //发送接口状态
}
}
}
}
3.3.2串口通讯模块
1、Uart.c
#include
#include
#include "uart.h"
uint m_nEndIndex; //下一个将要插入数据的下标
uchar m_wsBlock[WINDOW_SIZE]; //定义接收缓存区的大小
uchar m_wsTemp[WINDOW_SIZE]; //这是一个供数据交换的缓存区
void InitUart() //初始化串口工作模式,在使用串口之前必须被调用一次{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * Baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * Baudrate))); // 定时器1赋初值
SCON = 0x50; //mode1方式,启用接收
PCON = 0x00;
TR1 = 1; //启用定时器1
IE=0x00;
//接收数据缓存区初始化部分
memset(m_wsBlock,0,WINDOW_SIZE); //将窗口清零
m_nEndIndex=0;
}
//串口接收处理,采用的是中断处理方式,对于发送中断该函数不处理
//串口发送函数
void UartSend(UCHAR *Data, int Len) //Data为数据指针,len为要发送的数据长度
{
UCHAR c;
int i;
for(i=0;i { c=Data[i]; SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } } //第一个参数为接口编号,第二个参数为接口状态,为真接口状态为1,为假接口状态为0 void SendSta(uchar num,bool sta) { uchar buf[PROT_LEN]={0}; buf[0]=num; if(sta) buf[1]=0xAA; //没有故障 else buf[1]=0x55; //有故障 buf[2]=buf[0]^buf[1]; //按位异或 UartSend(buf,3); } // 用于向窗口中插入一个字符,只有这一个函数会修改窗口中的数据 void AppendByte(uchar ch) { if (WINDOW_SIZE<=0) return; if (m_nEndIndex>=WINDOW_SIZE) //说明窗口已近满了,需要将顶位最前面的字符溢出,后面的所有字符向前移动一位{ memcpy(m_wsTemp,m_wsBlock+1,WINDOW_SIZE-1); memcpy(m_wsBlock,m_wsTemp,WINDOW_SIZE-1); m_nEndIndex=WINDOW_SIZE-1; } m_wsBlock[m_nEndIndex]=ch; m_nEndIndex++; } // 用于协议分析, // 返回值为0说明协议分析没有分析到有效请求,不需要状态监测 // 为1 说明要对端口1监测 // 为2 说明要对端口1监测 // 为3 说明要对端口1监测 int ProtocolAnalysis() { uchar t; if (m_nEndIndex //接收的长度小于协议长度,直接返回0,不需要分析 return 0; if((m_wsBlock[0]=='$')&&(m_wsBlock[2]=='#')) { t=m_wsBlock[1]; if( (t>0x00)&&(t<0x04) ) return t; } return 0; } 2.Uart.h #ifndef _UART_H #define _UART_H #include "common.h" #define XTAL 11059200 // CUP 晶振频率#define baudrate 9600 #define Baudrate 9600L #define WINDOW_SIZE 3 //定义窗口数据缓存区大小 #define TX_PAYLOAD_WIDTH 3 //定义接受数据缓存区的长度 #define PROT_LEN 3 //协议长度 void InitUart(); //初始化串口工作模式,在使用串口之前必须被调用一次 void UartSend(char *Data, int Len);//串口发送.Data为数据指针,len为要发送的数据长度void SendSta(uchar num,bool sta); //第一个参数为接口编号,第二个参数为接口状态,为真接口状态为1,为假接口状态为0 void AppendByte(uchar ch); // 用于向窗口中插入一个字符,只有这一个函数会修改窗口中的数据 int ProtocolAnalysis(); // 用于协议分析, #endif 3.3.3控制部分文件 1、Control.c #include #include "control.h" sbit key1=P2^0; //按钮状态没有按下时为1 sbit key2=P2^1; sbit key3=P2^2; sbit sta1=P2^3; //"!sta0"为1表示正常状态,为0表示异常状态 sbit sta2=P2^4; sbit sta3=P2^5; void InitControl() //初始化控制 { key1=1; key2=1; key3=1; //开启三盏灯 sta1=0; sta2=0; sta3=0; } int GetSta(int t) //得到sta状态 { switch (t) { case 0x01: return !sta1;; case 0x02: return !sta2; case 0x03: return !sta3; default: return -1; } } int GetKey() //得到按钮的状态 { key1=1; if(key1==0) { wait(1); //延时10ms消抖 if(key1==0) //说明确实被按下 { while(key1==0); //等待知道按钮被按下 return 1; } } key2=1; if(key2==0) { wait(1); //延时10ms消抖 if(key2==0) //说明确实被按下 { while(key2==0); //等待知道按钮被按下 return 2; } } key3=1; if(key3==0) { wait(1); //延时10ms消抖 if(key3==0) //说明确实被按下 { while(key3==0); //等待知道按钮被按下 return 3; } } return 0; } void ChangeSta(int t) //改变接口的状态{ switch (t) { case 0x01: sta1=!sta1; break; case 0x02: sta2=!sta2; break; case 0x03: sta3=!sta3; break; default: break; } } 2.Control.h #ifndef _CONTROL_H #define _CONTROL_H #include "common.h" void InitControl(); //初始化控制 int GetSta(int t); //得到sta状态 int GetKey(); //得到按钮的状态 void ChangeSta(int t); //改变接口的状态 #endif 3.3.4公共部分模块 1、Common.c #include #include #include "common.h" //用于存放一些公共的函数和宏定义 void wait(int n) //延时函数n*10ms; { int i,j; for(i=0;i for(j=0;j<1681;j++); } 2、common.h #ifndef _COMMON_H #define _COMMON_H #define UCHAR unsigned char #define uchar unsigned char #define bool unsigned char #define UINT unsigned int #define uint unsigned int #define true 0x01 #define false 0x00 #define TRUE 0x01 #define FALSE 0x00 void wait(int n); //延时函数n*10ms #endif 3.4 电路搭建 3.4.1电路原理图 第4章上位机关键代码分析上位机采用的是Windows API编写的串口通讯程序 4.1 打开串口操作 BOOL CSerialPortEx::InitPort( CWnd* pPortOwner, UINT portnr, // 端口号 UINT baud, // 波特率 char parity, //检验位 UINT databits, //数据位 UINT stopbits, //停止位 DWORD dwCommEvents, UINT writebuffersize) // { assert(portnr > 0 && portnr < 17); assert(pPortOwner != NULL); if (m_bThreadAlive)//若当前线程或者,则先杀死该线程 { do { SetEvent(m_hShutdownEvent); } while (m_bThreadAlive); TRACE("Thread ended\n"); } // create events 创建事件 if (m_ov.hEvent != NULL) //事件对象已经存在 ResetEvent(m_ov.hEvent); //用ResetEvent来手动清除事件对象的通知m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //事件对象不存在,则创建.默认安全属性,人工重置对象,开始没有信号,匿名事件对象if (m_hWriteEvent != NULL) //同上 ResetEvent(m_hWriteEvent); m_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (m_hShutdownEvent != NULL) //同上 ResetEvent(m_hShutdownEvent); m_hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // initialize the event objects初始化事件监视对象 m_hEventArray[0] = m_hShutdownEvent; // highest priority m_hEventArray[1] = m_ov.hEvent; m_hEventArray[2] = m_hWriteEvent; //清空list缓存区 m_listBuf.clear(); // initialize critical section 初始化临界区 InitializeCriticalSection(&m_csCommunicationSync); //用来构建一个临界区 InitializeCriticalSection(&m_csListSync); // set buffersize for writing and save the owner m_pOwner = pPortOwner; if (m_szWriteBuffer != NULL) delete [] m_szWriteBuffer; //如果发送缓存区中有数据则释放缓存区m_szWriteBuffer =new BYTE[writebuffersize]; //开辟一个缓存区,长度默认为512个字节 m_nPortNr = portnr; //初始化端口号 m_nWriteBufferSize = writebuffersize; //初始化数据缓存区大小 m_dwCommEvents = dwCommEvents; //初始化串口上待监听的事件 BOOL bResult = FALSE; char *szPort = new char[50]; char *szBaud = new char[50]; EnterCriticalSection(&m_csCommunicationSync);//获得临界区对象的所有权 if (m_hComm != NULL) { CloseHandle(m_hComm); //如果串口处于打开状态就关闭它 m_hComm = NULL; } sprintf(szPort, "COM%d", portnr); //格式化串口号,并存放在szPort中 //这里有一个问题,就是1.5个停止位在SetCommState中如何设置 sprintf(szBaud, "baud=%d parity=%c data=%d stop=%d", baud, parity, databits, stopbits);//格式化波特率,奇偶检验,数据位,停止位 m_hComm = CreateFile(szPort, //串口名称字符串(COM1) GENERIC_READ | GENERIC_WRITE, //读写 0, //以独占方式打开 NULL, //未设置安全属性 OPEN_EXISTING, //串口设备必须设置该值 FILE_FLAG_OVERLAPPED, //使用异步IO 0); //串口设备这个参数必须设置为0 if (m_hComm == INV ALID_HANDLE_V ALUE) //如果打开失败 { // port not found delete [] szPort; delete [] szBaud; return FALSE; //返回FALSE } //打开成功设置下面的值 //总超时=时间系数×要求读/写的字符数+ 时间常量 m_CommTimeouts.ReadIntervalTimeout = 1000; // 读间隔超时 m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000; // 读时间系数 m_CommTimeouts.ReadTotalTimeoutConstant = 1000; // 读时间常量 m_CommTimeouts.WriteTotalTimeoutMultiplier = 1000; // 写时间系数 m_CommTimeouts.WriteTotalTimeoutConstant = 1000; // 写时间常量 // configure if (SetCommTimeouts(m_hComm, &m_CommTimeouts)) //设置超时 { if (SetCommMask(m_hComm, dwCommEvents))//指定串口上监视的事件集合 { if (GetCommState(m_hComm, &m_dcb)) { m_dcb.fRtsControl = RTS_CONTROL_ENABLE;// set RTS bit high! if (BuildCommDCB(szBaud, &m_dcb)) //用指定的字符串来填充DCB结构 { if (SetCommState(m_hComm, &m_dcb)) ; // normal operation... continue else ProcessErrorMessage("SetCommState()"); } else ProcessErrorMessage("BuildCommDCB()"); } else ProcessErrorMessage("GetCommState()"); } else ProcessErrorMessage("SetCommMask()"); } else ProcessErrorMessage("SetCommTimeouts()"); delete [] szPort; delete [] szBaud; PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT); LeaveCriticalSection(&m_csCommunicationSync); //离开临界区 TRACE("Initialisation for communicationport %d completed.\nUse Startmonitor to communicate.\n", portnr); return TRUE; } 4.2 后台线程处理串口程序 UINT CSerialPortEx::CommThread(LPVOID pParam) //串口监视线程的入口函数 { CSerialPortEx *port = (CSerialPortEx*)pParam; port->m_bThreadAlive = TRUE; // Misc. variables DWORD BytesTransfered = 0; DWORD Event = 0; DWORD CommEvent = 0; DWORD dwError = 0; COMSTAT comstat; BOOL bResult = TRUE; BOOL haveError=FALSE; if (port->m_hComm) // check if the port is opened //清空缓冲区 PurgeComm(port->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT); for (;;) { bResult = WaitCommEvent(port->m_hComm, &Event, &port->m_ov); //使用WaitCommEvent if (!bResult) { switch (dwError = GetLastError()) { case ERROR_IO_PENDING: { if(haveError) //说明可能会进入死循环 ResetEvent(port->m_hEventArray[1]); //手动将这个事件置为没有信号,防止死循环发生 TRACE("表示查询操作转到后台运行\n"); break; } case 87: { break; } default: { port->ProcessErrorMessage("WaitCommEvent()"); break; } } } else { bResult = ClearCommError(port->m_hComm, &dwError, &comstat); if (comstat.cbInQue == 0) //确定串口中无数据,重新开始循环 continue; } // end if bResult // 主监视函数,该函数将阻塞本线程直至等待的某一事件发生 TRACE("串口线程正在等待\n"); Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE);//使用这个函数监视m_hWriteEvent,m_hShutdownEvent,m_ov.hEvent这三个事件 TRACE("串口线程等待结束\n"); switch (Event) { case 0: //关闭 { port->m_bThreadAlive = FALSE; ::PostMessage(port->m_pOwner->m_hWnd,WM_COMM_THREADEND,(WPARAM) 0,(LPARAM)port->m_nPortNr); AfxEndThread(100); //这个函数彻底杀死线程 break; } case 1: // read event { GetCommMask(port->m_hComm, &CommEvent); if (CommEvent & EV_CTS) ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_CTS_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); if (CommEvent & EV_RXFLAG) ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_RXFLAG_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); if (CommEvent & EV_BREAK) ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_BREAK_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); if (CommEvent & EV_ERR) ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_ERR_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); if (CommEvent & EV_RING) ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_RING_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); if (CommEvent & EV_RXCHAR) { // Receive character event from port. if(!port->m_bBlockRead) //字符读取 port->ReceiveChar(port, comstat); //读串口 else //块读取 { //进行块读取 int readlen=0; port->ReadBlock(port,readlen,comstat); if(readlen!=0) //表示串口线肯定没有发生错误 haveError=FALSE; else //发生了错误 haveError=TRUE; } } break; } case 2: // write event { // Write character event from port port->WriteChar(port); //写串口 break; } } } // close forever loop return 0; } 4.3 程序运行界面 第5章课程设计总结与体会 本次微机原理与接口的实验课中,我们小组成员紧密的团结在一起,密切讨论,合理的规 划好了整个程序流程,合理的分配了任务.在较短的时间内将程序完成了.在与上位机的通讯 过程中我们也遇到了很多问题,特别是最开始上位机的告诉发送数据导致下位机没办法及时接收,导致丢失数据.在和上位机组成员的讨论和合作下,通过改变了上位机发送数据的方式,最终我们完成了任务。通过本次微机原理与接口实验课,增强了我们的动手能了,提高了我们的单片机应用能力,加强了我们的团队合作意识。 第6章致谢 参考文献 [1] 张义和王敏男许宏昌余春长编著《例说51单片机》人民邮电出版社 [2] 谭思亮邹超群等编著《Visual C++ 串口通讯工程开始实例导航》 目录 第1章需求分析 ............................................................................................................................ - 1 - 1.1课题名称 (1) 1.2任务 (1) 1.3要求 (1) 1.4设计思想 (1) 1.5课程设计环境 (1) 1.6设备运行环境 (2) 1.7我在本实验中完成的任务 (2) 第2章概要设计 ............................................................................................................................ - 2 - 2.1程序流程图 (2) 2.2设计方法及原理 (3) 第3章详细设计 ............................................................................................................................ - 3 - 3.1电路原理 (3) 3.1.1STC89C52芯片 ............................................................................................................. - 3 -3.2串口通信协议 (4) 3.3程序设计 (5) 3.3.1主程序模块 .................................................................................................................... - 5 - 3.3.2串口通讯模块 ................................................................................................................ - 6 - 3.3.3控制部分文件 ................................................................................................................ - 8 - 3.3.4公共部分模块 .............................................................................................................. - 11 -3.4电路搭建 (12) 3.4.1电路原理图 .................................................................................................................. - 12 -第4章上位机关键代码分析 ...................................................................................................... - 12 - 4.1打开串口操作 (12) 4.2后台线程处理串口程序 (15) 4.3程序运行界面 (18) 第5章课程设计总结与体会 ...................................................................................................... - 19 -第6章致谢 .................................................................................................................................. - 19 -参考文献........................................................................................................................................... - 19 - //以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。51只是一个学习的基础平台,你懂得。 //程序在关键的位置添加了注释。 /****************************************************************************** * * 实验名: 串口实验 * 使用的IO : P2 * 实验效果: 将接收到发送回电脑上面。 * 注意: ******************************************************************************* / #include 51单片机与PC串口间通讯设计与分析 摘要:51单片机是一种集CPU,RAM,FLASH ROM,I/O接口和定时中断系统于一体的微型计算机。只要有外加电源和晶体振荡器就可以独立完成对数字信号的算术运算,逻辑控制,串行通信等功能。由于单片机具有体积小,重量轻,功耗低,功能强,价格低,可靠性好等诸多优点,因而在仪器仪表,家用电器,数据采集等一些嵌入式控制领域被广泛应用。 当需要处理较复杂数据或需要对多个采集数据进行综合处理以及需要进行集散控制时,单片机的算术运算和逻辑运算能力显的不足,这时往往需要借助计算机系统。将单片机采集的数据通过串行口传给PC机,由PC机高级语言或数据库语言进行处理,或者实现PC 机对远程单片机进行控制。因此,实现单片机与PC机之间的远程通信更具有实际意义。 关键词:单片机、PC机、发送数据、接收数据串行通信 目录 摘要------------------------------------------------------------------(1)1、绪论---------------------------------------------------------------------------(3) 1.1单片机的发展阶段-------------------------------------------------(3) 1.2单片机的发展趋势-------------------------------------------------(3) 1.3单片机的应用模式-------------------------------------------------(4) 1.4单片机与PC串口间通讯设计的应用--------------------------(5) 2、系统设计-------------------------------------------------------------------(6) 2.1设计思路-------------------------------------------------------------(6) 2.2系统组成-------------------------------------------------------------(6) 3、单元硬件电路设计-------------------------------------------------------(7) 3.1硬件的实现过程-----------------------------------------------------(7) 3.1.1 RS-232C总线标准-------------------------------------------(8) 3.2 RS-232接口电路----------------------------------------------------(9) 3.2.1 MAX-232接口电路------------------------------------------(9) 3.3 51单片机与PC机串行通信电路-----------------------------(11) 4、软件设计------------------------------------------------------------------(12) 4.1 软件设计和硬件设计的关系-----------------------------------(12) 4.2 程序设计-----------------------------------------------------------(13) 4.3程序运行后的结果------------------------------------------------(17) 5、结论-----------------------------------------------------------------------(18) 6、参看文献------------------------------------------------------------------(19) 《专业综合实习报告》 专业:电子信息工程 年级:2013级 指导教师: 学生: 目录 一:实验项目名称 二:前言 三:项目内容及要求 四:串口通信原理 五:设计思路 5.1虚拟串口的设置 5.2下位机电路和程序设计 5.3串口通信仿真 六:电路原理框图 七:相关硬件及配套软件 7.1 AT89C51器件简介 7.2 COMPIN简介 7.3 MAX232器件简介 7.4友善串口调试助手 7.5 虚拟串口软件Virtual Serial Port Driver 6.9八:程序设计 九:proteus仿真调试 十:总结 十一:参考文献 一:实验项目名称: 基于51单片机的单片机与PC机通信 二:前言 在国内外,以PC机作为上位机,单片机作为下位机的控制系统中,PC机通常以软件界面进行人机交互,以串行通信方式与单片机进行积极交互,而单片机系统根据被控对象配置相应的前向,后向信息通道,工作时作为主控机测对象,作为被控机接受PC机监督,指挥,定期或受命向上位机提供对象及本身的工作状态信息。 目前,随着集成电路集成度的增加,电子计算机向微型化和超微型化方向发展,微型计算机已成为导弹,智能机器人,人类宇宙和太空和太空奥妙复杂系统不可缺少的智能部件。在一些工业控制中,经常需要以多台单片机作为下位机执行对被控对象的直接控制,以一台PC机为上位机完成复杂的数据处理,组成一种以集中管理、分散控制为特点的集散控制系统。 为了提高系统管理的先进性和安全性,计算机工业自动控制和监测系统越来越多地采用集总分算系统。较为常见的形式是由一台做管理用的上位主计算机(主机)和一台直接参与控制检测的下位机(单片机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。主机的作用一是要向从机发送各种命令及参数:二是要及时收集、整理和分析从机发回的数据,供进一步的决策和报表。从机被动地接受、执行主机发来的命令,并且根据主机的要求向主机回传相应烦人实时数据,报告其运行状态。 用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时,系统的更改和扩充极为容易。MCS-51系列单片机,由于内部带有一个可用于异步通讯的全双工的穿行通讯接口,阴齿可以很方便的构成一个主从式系统。 串口是计算机上一种非常通用的设备通讯协议,大多数计算机包容两个基于RS232的串口。串口同时也是仪器仪表设备通过用的通讯协议,很多GPIB兼容的设备也带有RS-232口。同时串口通讯协议也可以用于获取远程采集设备数据。所以,深入的理解学习和研究串口通信相关知识是非常必要的。此次毕业设计选题为“PC机与MCS-51单片机的串口通讯”,使用51单片机来实现一个主从式 第七章MCS-51单片机串行接口 第一节串行通信的基本概念 (一)学习要求 1.掌握串行通信的基本概念。 2. 掌握异步通信和同步通信的区别。 (二)内容提要 一:基本概念及分类 串行通信是将数据的各位一位一位地依次传送。适合于计算机之间、计算机与外部设备之间的远距离通信。 串行通信从传输方式分为: 单工方式、半双工方式、全双工方式。 从接收方式来说,串行通信有两种方式: 异步通信方式、同步通信方式。 二:串行口的功能 MCS-51单片机中的异步通信串行接口能方便地与其他计算机或传送信息的外围设备(如串行打印机、CPU终端等)实现双机、多机通信。 串行口有4种工作方式,见表7-1。方式0并不用于通信,而是通过外接移位寄存器芯片实现扩展并行I/O接口的功能。该方式又称为移位寄存器方式。方式1、方式2、方式3都是异步通信方式。方式1是8位异步通信接口。一帧信息由10位组成,其格式见图7-2a。方式1用于双机串行通信。方式2、方式3都是9位异步通信接口、一帧信息中包括9位数据,1位起始位,1位停止位,其格式见图7-2b。方式2、方式3的区别在于波特率不同,方式2、方式3主要用于多机通信,也可用于双机通信。 表7-1 (三)习题与思考题 1、什么是并行通信?什么是串行通信?各有何优缺点? 答:并行通信指数据的各位同时传输的通信方式,串行通信是指各位数据逐位顺序传输的通信方式。 2、什么是异步通信?什么是同步通信?各有何优缺点? 3、什么是波特率?某异步串行通信接口每分钟传送1800个字符,每个字符由11位组成,请计算出传送波特率。 第二节MCS-51串行接口的组成 (一)学习要求 引言 人类社会已经进入信息化时代,信息社会的发展离不开电子产品的进步。单片机的出现使人类实现利用编程来代替复杂的硬件搭建电路,它靠程序运行,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性! 单片机应用的主要领域非常广,智能化家用电器、办公自动化设备商业营销设备、工业自动化控制、智能化仪表、智能化通信产品、汽车电子产品、航空航天系统和国防军事、尖端武器等领域。 单片机应用的意义不仅在于它的广阔围及所带来的经济效益,更重要的意义在于,单片机的应用从根本上改变了控制系统传统的设计思想和设计方法。以前采用硬件电路实现的大部分控制功能,正在用单片机通过软件方法来实现。以前自动控制中的PID调节,现在可以用单片机实现具有智能化的数字计算控制、模糊控制和自适应控制。这种以软件取代硬件并能提高系统性能的控制技术称为微控技术。随着单片机应用的推广,微控制技术将不断发展完善。 电路的集成化不仅对硬件电路的设计相关,与电路的布局同样相关。印刷版的出现使得电路产品更加规,体积更小。Protel99se是一款专业的绘制电路及印刷版的软件,近年来的不断升级使得其功能更加完善,出现了Altium Designer 、Protel DXP等升级版本。 实验单片机与PC机串口通信(C51编程)实验 要求: 1、掌握串行口的控制与状态寄存器SCON 2、掌握特殊功能寄存器PCON 3、掌握串行口的工作方式及其设置 4、掌握串行口的波特率(bondrate)选择 任务: 1、实现PC机发送一个字符给单片机,单片机接收到后即在个位、十位数码管上进行显示,同时将其回发给PC机。要求:单片机收到PC机发来的信号后用串口中断方式处理,而单片机回发给PC机时用查询方式。 采用软件仿真的方式完成,用串口调试助手和KEIL C,或串口调试助手和PROTEUS分别仿真。 需要用到以下软件:KEIL,VSPDXP5(虚拟串口软件),串口调试助手,Proteus。 (1)虚拟串口软件、串口调试助手和KEIL C的联调 首先在KEIL里编译写好的程序。 打开VSPD,界面如下图所示:(注明:这个软件用来进行串口的虚拟实现。在其网站上可以下载,但使用期为2周)。 左边栏最上面的是电脑自带的物理串口。点右边的addpair,可以添加成对的串口。一对串口已经虚拟互联了,如果添加的是COM3、COM4,用COM3发送数据,COM4就可以接收数据,反过来也可以。 接下来的一步很关键。把KEIL和虚拟出来的串口绑定。现在把COM3和KEIL绑定。在KEIL中进入DEBUG模式。在最下面的COMMAND命令行,输入 modecom39600,0,8,1 %分别设置com3的波特率、奇偶校验 位、数据位、停止位 assigncom3 (以上参数设置注意要和所编程序中设置一致!) 打开串口调试助手 可以看到虚拟出来的串口COM3、COM4,选择COM4,设置为波特率9600,无校验位、8位数据位,1位停止位(和COM3、程序里的设置一样)。打开COM4。 现在就可以开始调试串口发送接收程序了。可以通过KEIL发送数据,在串口调试助手中就可以显示出来。也可以通过串口调试助手发送数据,在KEIL中接收。 实验实现PC机发送一个字符给单片机,单片机接收到后将其回发给PC机。在调试助手上(模拟PC)发送数据,单片机收到后将收到的结果回送到调试助手上。 2、以下在Proteus和串口调试助手实现的结果: 将编译好的HEX程序加载到Proteus中,注意这里需要加上串口模块,用来进行串行通信参数的设置。 点击串口,可以对串口进行设置: 用串口调试助手发送数据,即可看到仿真结果。 实验参考程序源文件在exp2-comm文件夹中。 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机与下位单片机异步串行通信的通信协议 机电高等专科学校2015-2016学年第1学期通信实训报告 系别:电子通信工程系 班级: xxxxxx 学号: 13xxxxxxxxx : xxxxxxx 2015年12月 基于51单片机的双机串行通信 摘要:串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。在通信过程中,使用通信协议进行通信。 关键字:通信双机 一、总体设计 1设计目的 1.通过设计相关模块充分熟悉51单片机的最小系统的组成和原理; 2.通过软件仿真熟悉keil和proteus的配合使用; 3.通过软件编程熟悉51的C51编程规; 4.通过实际的硬件电路搭设提高实际动手能力。 2.设计要求: 两片单片机之间进行串行通信,A机将0x06发送给B机,在B机的数码管上静态显示1,B机将0~f动态循环发送到A机,并在其数码管上显示。 3.设计方案: 软件部分,通过通信协议进行发送接收,A机先送0x06(B机数码管显示1)给B机(B机静态显示),当从机接收到后,向B机发送代表0-f的数码管编码数组。B收到0x06后就把数码表TAB[16]中的数据送给从机。 二、硬件设计 1.51单片机串行通信功能 计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。 51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下: 51单片机与串口通信(含代码) 串口调试 1. 发送:向总线上发命令 2. 接收:从总线接收命令,并分析是地址还是数据。 3. 定时发送:从内存中取数并向主机发送. 经过调试,以上功能基本实现,目前可以通过上位机对单片机进行实时控制。 程序如下: //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 #i nclude PCON=0x00; ES=1; TMOD=0x21; //定时器工作于方式2,自动装载方式TH0=(65536-1000)%256; TL0=(65536-1000)/256; TL1=0xfd; TH1=0xfd; ET0=1; TR0=1; TR1=1; // TI=0; EA=1; // TI=1; RAMDATA=0x1F45; } void serial () interrupt 4 using 3 { if(RI) { RI=0; ch=SBUF; TI=1; //置SBUF空 switch(ch) { case 0x01 :printf("A"); TI=0;break; case 0x02 :printf("B"); TI=0;break; case 0x03 :printf("C"); TI=0;break; case 0x04 :printf("D"); TI=0;break; default :printf("fg"); TI=0;break; } } 实验六串行口通信实验 一、实验内容 实验板上有RS-232接口,将该接口与PC机的串口连接,可以实现单片机与PC机的串行通信,进行双向数据传输。本实验要求当PC机向实验板发送的数字在实验板上显示,按实验板键盘输入的数字在PC机上显示,并用串口助手工具软件进行调试。 二、实验目的 掌握单片机串行口工作原理,单片机串行口与PC机的通信工作原理及编程方法。 三、实验原理 51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通信。进行串行通讯信要满足一定的条件,比如电脑的串口是RS232电平(-5~-15V为1,+5~+15V为0),而单片机的串口是TTL电平(大于+2.4V为1,小于- 0.7V为0),两者之间必须有一个电平转换电路实现RS232电平与TTL电平的相互转换。 为了能够在PC机上看到单片机发出的数据,我们必须借助一个Windows软件进行观察,这里我们可以使用免费的串口调试程序SSCOM32或Windows的超级终端。 单片机串行接口有两个控制寄存器:SCON和PCON。串行口工作在方式0时,可通过外接移位寄存器实现串并行转换。在这种方式下,数据为8位,只能从RXD端输入输出,TXD端用于输出移位同步时钟信号,其波特率固定为振荡频率的1/12。由软件置位串行控制寄存器(SCON)的REN位后才能启动,串行接收,在CPU将数据写入SBUF寄存器后,立即启动发送。待8位数据输完后,硬件将SCON寄存器的T1位置1,必须由软件清零。 单片机与PC机通信时,其硬件接口技术主要是电平转换、控制接口设计和远近通信接口的不同处理技术。在DOS操作环境下,要实现单片机与微机的通信,只要直接对微机接口的通信芯片8250进行口地址操作即可。WINDOWS的环境下,由于系统硬件的无关性,不再允许用户直接操作串口地址。如果用户要进行串行通信,可以调用WINDOWS的API 应用程序接口函数,但其使用较为复杂,可以使用KEILC的通信控件解决这一问题。 四、实验电路 [参考学习板说明书P27] 河南机电高等专科学校2015-2016学年第1学期通信实训报告 系别:电子通信工程系 班级:xxxxxx 学号:13xxxxxxxxx 姓名:xxxxxxx 2015年12月 基于51单片机的双机串行通信 摘要:串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。在通信过程中,使用通信协议进行通信。 关键字:通信双机 一、总体设计 1设计目的 1.通过设计相关模块充分熟悉51单片机的最小系统的组成和原理; 2.通过软件仿真熟悉keil和proteus的配合使用; 3.通过软件编程熟悉51的C51编程规范; 4.通过实际的硬件电路搭设提高实际动手能力。 2.设计要求: 两片单片机之间进行串行通信,A机将0x06发送给B机,在B机的数码管上静态显示1,B机将0~f动态循环发送到A机,并在其数码管上显示。 3.设计方案: 软件部分,通过通信协议进行发送接收,A机先送0x06(B机数码管显示1)给B机(B机静态显示),当从机接收到后,向B机发送代表0-f的数码管编码数组。B收到0x06后就把数码表TAB[16]中的数据送给从机。 二、硬件设计 1.51单片机串行通信功能 计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。 51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下: 图1.AT89C51(52) (1)数据缓冲器(SBUF) 接受或发送的数据都要先送到SBUF缓存。有两个,一个缓存,另一个接受, C51单片机和电脑串口通信电路图与源码 51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 串口通讯的硬件电路如上图所示 在制作电路前我们先来看看要用的MAX232,这里我们不去具体讨论它,只要知道它是TTL和RS232电平相互转换的芯片和基本的引脚接线功能就行了。通常我会用两个小功率晶体管加少量的电路去替换MAX232,可以省一点,效果也不错,下图就是MAX232的基本接线图。 按图7-3加上MAX232就可以了。这大热天的拿烙铁焊焊,还真的是热气迫人来呀:P串口座用DB9的母头,这样就可以用买来的PC串口延长线进行和电脑相连接,也可以直接接到电脑com口上。 为了能够在电脑端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里我们利用一个免费的电脑串口调试软件。本串口软件在本网站可以找到 软件界面如上图,我们先要设置一下串口通讯的参数,将波特率调整为4800,勾选十六进制显示。串口选择为COM1,当然将网站提供的51单片机实验板的串口也要和电脑的COM1连接,将烧写有以下程序的单片 #include 基于51单片机串行通信的无线发射极和接收机设计---- 1 概述 1.1 课题的目的、背景和意义 最近几年来,由于无线接入技术需求日益增大,以及数据交换业务(如因特 网、电子邮件、数据文件传输等)不断增加,无线通信和无线网络均呈现出指数增 加的趋势。有力的推动力无线通信向高速通信方向发展。然而,工业、农业、车载 电子系统、家用网络、医疗传感器和伺服执行机构等无线通信还未涉足或者刚刚涉 足的领域,这些领域对数据吞吐量的要求很低,功率消耗也比现有标准提供的功率 消耗低。此外,为了促使简单方便的,可以随意使用的无线装置大量涌现,需要在 未来个人活动空间内布置大量的无线接入点,因而低廉的价格将起到关键作用。为 降低元件的价格,以便这些装置批量生产,所以发展了一个关于这种网络的标准方案。Zigbee就是在这一标准下一种新兴的短距离、低功耗、低数据传输的无线网 络技术,它是一种介于无线标记技术和蓝牙之间的技术方案。 对于这种短距离、低功耗、低数据传输无线技术,它不仅在工业、农业、军 事、环境、医疗等传统领域有着巨大的应用价值,未来应用中还可以涉及人类日常 生活和社会生产活动的所有领域。由于各方面的制约,这种技术的大规模商业应用 还有待时日,但已经显示出了非凡的应用价值,相信随着相关技术的发展和推进, 一定会得到更广泛应用。 1.2国内外无线技术相关现状及Zigbee现状 无线通信从固定方式发展为移动方式,移动通信发展至今大约经历了五个阶段: 第一阶段为20年代初至50年代初,主要用于舰船及军有,采用短波频及电子 管技术,至该阶段末期出现才出现150MHVHF单工汽车公用移动电话系统MTS。 单片机技术与应用 实验报告 实验名称:单片机串行口与PC机通讯实验班级:11062811 学号:11061118 姓名:吕琳涛 指导老师:谷雨 2013年5月27日 1.实验要求 利用8031单片机串行口,实现与PC机通讯。 本实验实现以下功能,将从实验机键盘上键入的数字,字母显示到PC机显示器上,将PC机键盘输入的字符0-F(必须为大写字母)显示到实验机的数码管上。 2. 实验目的 1.掌握串行口工作方式的程序设计,掌握单片机通讯的编制。 2.了解实现串行通讯的硬环境,数据格式的协议,数据交换的协议。 3.了解PC机通讯的基本要求。 3.程序说明: 在本次实验中,我们可以SCON = 0x50;对应的解释为我们在初始化串口接口控制寄存器SCON用于确定串口通道工作方式的选择、接收和发送控制及其串口的状态标志。TMOD = 0x20;表示我们在程序中用于设定定时和计数器的工作方式。TH1 = 0xfd;TL1 = 0xfd;用于对低八位和高八位进行初始化,也就是进行赋值。TR1 = 1;表明我们设定的计数器开始进行计数。ES = 1;是对串行接口中断的中断控制进行设定。EA = 1;是51单片机中断系统的总允许控制端。 s = SBUF;s = s+1;SBUF = s;这三个语句是对我们实验要求的主体部分的代码编写。也就是获取数据,对数据进行自加1然后通过串口返回到我们pc机上。我们知道接受RI = 1单片机没有自动复位的功能,也就是我们需要人为地进行赋值。T1也是这样的。 至此,程序编写完成,放入软件中进行编译和下载。 2.上机调试说明 将程序编写成功后,我们就上机进行调试。 下载成功后,通过键盘我们将我们想要的数据输入pc机里,等待pc 与单片机进行串口通信,单片机进行加一处理之后然后传到pc机里,显示到电脑屏幕上。 至此实验仿真过程结束。 3.写出源程序清单及执行结果。 源程序: #include //****************************************************************// // DHT 使用范例 //单片机 AT89S5 或 STC89C5 RC // 功能 串口发送温湿度数据波特率 9600 //硬件连接 P .0口为通讯口连接DHT ,DHT 地电源和地连接单片机地 电源和地 单片机串口加MAX 3 连接电脑 // 公司 济南联诚创发科技有限公司 //****************************************************************// #include 51单片机与PC串口通讯
51单片机串口调试实验(C语言)
51单片机与PC串口间通讯设计与分析
51单片机与PC机通信资料
MCS-51单片机串行接口
基于51单片机的串口通讯系统课程设计论文
实验单片机与PC机串口通信
汇编语言实现串口通信(PC和单片机间)教学文案
基于51单片机的双机串行通信
51单片机与串口通信(含代码)
串行口通信实验 单片机实验报告
基于51单片机的双机串行通信
C51单片机和电脑串口通信电路图
51单片机usart通信程序(有CRC校验)
基于51单片机串行通信的无线发射极和接收机设计
单片机实验(简单的串口通信)
【最新编排】基于51单片机的DHT11串口通讯