PC与51单片机串口通信
串行通信是算机和外行通、外行控并取单单单单单单单单单单单单单单单单单单单单单由外采集到的数据的一个非常重要的手段。单单单单单单单单单单单单单单单单单单单单
由于其所用的少,成本低,起来方便易行,单单单单单单单单单单单单单单单单单单
因而得到广泛的用。单单单STC89C52RC有一个可程的全双工串行通单单单单单单单单单信接口,可以方便的单单PC机与其之的串行通信。单单单单单单单
一、单体
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
系中采用单单单单STC89C52RC/STC89C54RD+单单单单单单片机作下位机,PC机上位单单单机,二者通单CH340将PC的USB口成单单RS232的串行口接收或上数据。单单单单单片机部分的程序采用C单单单单单言程,用Keil uVision4单单单单后生HEX文件下到单单单片机内,从而数据收。单单单单单单单PC端采用一个串口助手,单单单单单sscom4.2,或MATLAB GUI单单单单数据的收。
二、具体方案
1、通信程序单单单单单单单单
本程序了通信方式是否合适,以便于下一单单单单单单单单单单单单单单单单单单单单单单单单单单增加程序的内容。步
,1,利用STC提供STC-ISP-V4.83单单单件MCU单单
MCU Type is: STC89C54RD+
MCU Firmware Version: 3.2C
Chinese:MCU 固件版本号: 3.2C
Double speed / 双倍速: 12T/单
速
振放大器增益单单单单单单: full gain
下次下单单 P1.0/P1.1 与下无单单单
内部展单单AUX-RAM: 允单单单(强烈推荐)
下次下用用程序将数据单单单单单单单单单单单Flash区擦除: NO
用件启内部看狗后单单单单单单单单单单单: 单单单单单位看狗
ALE pin 仍单 ALE
内部率单单单单:11.061806M
外部率单单单单:11.061806M
,2,串行口初始参数定单单
串行口工作方式方式单单单1,10位异收,,波特率步单单单单单单单9600bps,用定器单单1作波特率生器,用定器模式单单单单单单单单单单单2,其它程序及明。单单单单单单单单
1
,3,程序功能明单单
通串口助手,向片机送字符,送字符的末尾需加单单单单单单单单单单单单单单“单”单单单单单:,片机
单单单单单单“数据接收完,返回Wait command!”字符串。当片机接收一单单单单单单个字符,光二极管端引脚取反一次,所以其亮、的状改一次。单单单单单单单单单单单单单单单单单单单单单单单单单单单单单
例如:初始状。当送单单单单单单单“12:,取反三次,光二极管”单单单单单单单亮,返回“Wait command!”字符串,如,单单1,所示,,当送单单“123:,取反四”单次,光二极管状不,但返回单单单单单单单单单单单单单“Wait command!”字符串,如单,2,所示,。
单,1,a 单,1,b
单,2,a 单,2,b
,4,片机内运行的程序单单单单单单单单单
#include
sbit P1_2=P1^2; //接光二极管单单单单单
bit flag; //单单单单单单片机数据送志位
bit flag_inter; //单单单单片机数据接收完志位
2
unsigned char a;void SendData(char dat);//单送字符
void SendString(char *s);//单送字符串void main()
{
SCON=0x50; //串行通信方式1,接收允单
PCON=0x00; //单单倍
TMOD = 0x20; //单单单置定器T1单模式2,定方式单单单
TH1=TL1=0xFD; //波特率单9600,晶振11.0594MHz
TR1=1; //定器单单T1单单单始数
EA=1; //中断允单
ES=1; //串行口中断放单单
while(1)
{
if(flag_inter==1)
{
flag_inter=0; //单志位清0
SendString("Wait command!\n");
}
}
}
//串口接收送中断单单单单
void Uart_Isr() interrupt 4 using 1
{
if (RI)
{
RI=0; //接收中断志单单
a=SBUF;
P1_2=!P1_2; //数据送到P0口
if(a=='!')
{
flag_inter=1; //数据接收完,置单单单1
}
}
if(TI)
{
TI=0; //单单单送中断志
flag=0; //单志位清0
}
}
3
//向串口送字符单单单单
void SendData(char dat){
while(flag); //等待数据送单单
ACC=dat;
flag=1; //单志位置1
SBUF=ACC; //数据装入SBUF}
//向串口送字符串单单单单单
void SendString(char *s)
{
while(*s) //字符串送完否单单单单
{
SendData(*s++); //单单单单单单单单送字符,并指指向下一字符
}
}
4
2、利用串口助手串行口数据收单单单单单单单单单单单单单
本程序可以单单PC机与片机之数据双向、互单单单单单单单单单单单单单单
;注,由CH37X451电路板原理电可知CH452电管电电及电电控制芯片电四电接口数~CH452_DCLK=P1^7~CH452_DIN=P1^6~CH452_LOAD=P1^5~CH452_DOUT
=P3^3。,
,1,利用STC提供STC-ISP-V4.83单单单件MCU单单
MCU Type is: STC89C52RC
MCU Firmware Version: 3.2C
Chinese:MCU 固件版本号: 3.2C
Double speed / 双倍速: 12T/单
速
振放大器增益单单单单单单: full gain
下次下单单 P1.0/P1.1 与下无单单单
内部展单单AUX-RAM: 允单单单(强烈推荐)
下次下用用程序将数据单单单单单单单单单单单Flash区擦除: NO
用件启内部看狗后单单单单单单单单单单单: 单单单单单位看狗
ALE pin 仍单 ALE
内部率单单单单:24.011256M.
外部率单单单单:24.011256M.
,2,串行口初始参数定单单
串行口工作方式方式单单单1,10位异收,,波特率步单单单单单单单4800bps,用定器单单1作波特率生器,用定器模式单单单单单单单单单单单2,其它程序及明。单单单单单单单单
,3,程序功能明单单
通串口助手,向片机送字符,送字符的末尾需加单单单单单单单单单单单单单单“单”单单单单单:,片机
单单单单单单单单单单单数据接收完。当片机接收到PC机来的数据,先存入数,当到单单单单单单单单单单单单单单单单单单束志:,用示函数,从左至右,两个单“”单单单单单单单单单单单单单单单LED数管
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示一位字符的单单单单单单单单单ASCII单;注,电了电示出特殊字符~所以用ASCII电表示,。一次最多只能表示四个字符,当超四个,延一段,再示下面的字符。数单单单单单单单单单单单单单单单单单单单单单单单
管示束后,返回单单单单单单单单“Wait command!”字符串。当按下按,将按单单单单单单单单单单单单单的返回PC机。
例如:当在串口助手中送单单单单单单单“a=1,b=3,b>a!”单单单单单单,数管将依次单单单单单单单单示的十六制ASCII单如下:61H,a,、3dH(=)、31H(1)、2cH(,)、62H(b)、3dH(=)、33H(3)、2cH(,)、62H(b)、3EH(>)、61H(a)、21H(!),具体,单单单3,。当从左至右,从上到下依次按下单单上的三行按,返回到单单单单单单单单PC机,具体,单单单4,。
5
单,3,a 单,3,b
单,3,c 单,3,d
单,4,a 单,4,b6
,4,片机内运行的程序单单单单单单单单单
主程序如下:
#include
#include
#include
#include
bit flag; //单志位
bit flag_inter; //PC机送信息束志位单单单单单单单单单
unsigned char m=0; //数单testdata[a]unsigned char testdata[20]={0}; //存放PC机送到片机的信息单单单单单单单单单
//单单单单单单单单单单单单出命令子程序,定一无符号整型量存12字的命令字。单单单单单单void CH452_Write(unsigned int cmd)
{
unsigned char i;
#ifdef USE_KEY
DISABLE_INTERRUPT; //禁止中断单单单单,防止程中被单单单单单单CH452中断
//单单单单单单单单单入中断服程序中再次#endif
CH452_LOAD_CLR; //命令始单单,LOAD=0
for(i=0;i!=12;i++) //送入12位数据,低位在前
{
if (cmd&1) {CH452_DIN_SET;}
else {CH452_DIN_CLR;} // 单出位数据
CH452_DCLK_CLR;
cmd>>=1;
CH452_DCLK_SET; //上升沿有效
}
CH452_LOAD_SET; //加数据单单单,LOAD上升沿
DELAY_1US; //命令数据加周期不小于单单单单单单6US
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
#ifdef USE_KEY
ENABLE_INTERRUPT;
#endif
}
//单入命令子程序,MCU从CH452单单一个字
unsigned char CH452_Read(){
unsigned char i;
unsigned char cmd,keycode; //定命令字,和数据存器单单单单单单单单单单单#ifdef USE_KEY
DISABLE_INTERRUPT; //禁止中断单单单单,防止程中被单单单单单单CH452中
断
7
//单单单单单单单单单入中断服程序中再次#endif
cmd=0x07; //单单入451命令字
CH452_LOAD_CLR;
for(i=0;i!=4;i++)
{
if (cmd&1) {CH452_DIN_SET;}
else {CH452_DIN_CLR;} // 单出位数据
CH452_DCLK_CLR;
cmd>>=1; //往右移一位
CH452_DCLK_SET;//单单单单单单单单单生上升沿通知CH451单入位数据
}
CH452_LOAD_SET;//单单单单单单单生加上升沿通知CH451单理命令数
据
keycode=0; //清除keycode
for(i=0;i!=7;i++)
{
keycode<<=1; //数据移入keycode,高位在前,低位在后
keycode|=CH452_DOUT; //从高到低入单单451的数据
CH452_DCLK_CLR;//单单单单单单单单生下升沿通知CH451单出下一位
CH452_DCLK_SET;
}
CLEAR_INTER_FLAG; //清中断志单单#ifdef USE_KEY
ENABLE_INTERRUPT;
#endif
return(keycode); //反回单单}
//延函数单单单
void delayms(unsigned char i){unsigned intj;
do{for(j=0;j!=1000;j++)
{;}
}while(--i);
}
//串行通信初始置子函数单单单单单
void init(void)
{
SCON=0x50; //串行通信方式1,接收允单
PCON=0x00; //单单倍
TMOD = 0x20; //单单单置定器T1单模式2,定方式单单单
TH1=TL1=0xf3; //波特率单4800,晶振24MHz
TR1=1; //定器单单T1单单单始数
EA=1; //中断允单
ES=1; //串行口中断放单单
}
8
//LED单示函数
void Display(void)
{
unsigned char n=0;
unsigned char p;
unsigned char testdata1;
unsigned char testdata2;
unsigned char testdata3;
unsigned char testdata4;
unsigned char testdata5;
unsigned char testdata6;
unsigned char testdata7;
unsigned char testdata8;
CH452_Write(CH452_SYSON2);//两制方式,如果单单单单单单单SDA用做按中断单单单单
出,//那命令单单单单单单(0x04,0x23)
CH452_Write(CH452_BCD); // BCD单单,8个数管单单
while((4*n)<(m+1))
{
testdata1=testdata[0+4*n]%16;
testdata2=testdata[0+4*n]/16;
testdata3=testdata[1+4*n]%16;
testdata4=testdata[1+4*n]/16;
testdata5=testdata[2+4*n]%16;
testdata6=testdata[2+4*n]/16;
testdata7=testdata[3+4*n]%16;
testdata8=testdata[3+4*n]/16;
CH452_Write(CH452_DIG0 | testdata7); // 单示接收字符的ASCII单
CH452_Write(CH452_DIG1 | testdata8);
CH452_Write(CH452_DIG2 | testdata5);
CH452_Write(CH452_DIG3 | testdata6);
CH452_Write(CH452_DIG4 | testdata3);
CH452_Write(CH452_DIG5 | testdata4);
CH452_Write(CH452_DIG6 | testdata1);
CH452_Write(CH452_DIG7 | testdata2);
delayms(1000); //延单
delayms(1000);
delayms(1000);
delayms(1000);
n++;
}
for(p=0;p<21;p++) //数清零单单单
9
{
testdata[p]=0;
}
m=0;
}
//串口接收送中断单单单单
void Uart_Isr() interrupt 4 using 1
{
if(RI)
{
RI=0; //接收中断志单单
testdata[m]=SBUF;
if(testdata[m]=='!')
{
Display();
flag_inter=1;
}
else
{
m++;
}
}
if(TI)
{
TI=0; //单单单送中断志
flag=0; //单志位清零
}
}
//向串口送字符单单单单
void SendData(char data0)
{
while(flag); //等待数据送单单
ACC=data0;
flag=1; //单志位置1
SBUF=ACC; //数据装入SBUF}
//向串口送字符串单单单单单
void SendString(char *s)
{
while(*s) //字符串送完否单单单单
{
SendData(*s++); //单单单单单单单单送字符,并指指向下一字符
10
}
}
// INT1中断服程序单单单
void int1() interrupt 2 //using 1{
TI=0;
SBUF=CH452_Read(); //将按通串口单单单单单单单单PC机单单
while(!TI);
TI=0;
}
void main()
{
delayms(10); //延单
init(); //串口初始化函数
// 单置CH452按中断单单单
IE1=0; //外部中断1 中断求志单单单单
EX1=1; //外部中断1中断允单
while(1)
{
if(flag_inter==1)
{
flag_inter=0;
SendString("Wait command!\n");
}
}
}
附外加文件:单单单单
,1,CH452CMD.h
#define CH452_NOP0x0000// 空操作#define CH452_RESET 0x0201// 单位#define CH452_LEVEL0x0100// 加光柱单单单单#define CH452_CLR_BIT0x0180 // 段位清0#define CH452_SET_BIT0x01C0 // 段位置1#define CH452_SLEEP0x0202// 单单入睡眠状#define CH452_LEFTMOV 0x0300 //单单单单置移方式-左移#define CH452_LEFTCYC 0x0301 //单单单单置移方式-左循#define CH452_RIGHTMOV 0x0302 //单单单单置移方式-右移#define CH452_RIGHTCYC 0x0303 //单单单单置移方式-右循#define CH452_SELF_BCD0x0380 //自定单BCD单#define CH452_SYSOFF 0x0400 //单单单单示、#define CH452_SYSON1 0x0401 //单单示
#define CH452_SYSON2 0x0403//单单单单示、11
#define CH452_SYSON2W 0x0423//单单单单示、, 真正2单接口
#define CH452_DSP 0x0500//单单单单单单置默示方式#define CH452_BCD 0x0580//单置BCD单单方式#define CH452_TWINKLE 0x0600 //单单单单单置控制
#define CH452_GET_KEY0x0700 // 单单取按#define CH452_DIG0 0x0800//数管位单单单0单示#define CH452_DIG1 0x0900 //数管位单单单1单 示
#define CH452_DIG2 0x0a00 //数管位单单单2单示
#define CH452_DIG3 0x0b00 //数管位单单单3单示
#define CH452_DIG4 0x0c00 //数管位单单单4单示
#define CH452_DIG5 0x0d00//数管位单单单5单示#define CH452_DIG6 0x0e00//数管位单单单6单示#define CH452_DIG7 0x0f00 //数管位单单单7单示
,2,pin.h
/* 延单1uS子程序,主要用于2单接口,与片机速度有单单单单单单单 */#defineDELAY_1US{_nop_();_nop_();}// MCS51<=30MHz
/* 4单单单接口的接,与路有单单单单单单 */
sbit CH452_DCLK=P1^7; // 串行数据上升延激活单单单单单单单
sbit CH452_DIN=P1^6; // 串行数据出,接单单单单CH452的数据入单单sbit CH452_LOAD=P1^5; // 串行命令加,上升延激活单单单单单单单
sbit CH452_DOUT=P3^3; // INT1,中断和入,接单单单单单单单单单单单CH452的数据出单单/* 4单接口的位操作,与片机有单单单单单 */
#defineCH452_DCLK_SET{CH452_DCLK=1;}#defineCH452_DCLK_CLR{CH452_DCLK=0;}#defineCH452_DIN_SET{CH452_DIN=1;}#defineCH452_DIN_CLR{CH452_DIN=0;}#defineCH452_LOAD_SET{CH452_LOAD=1;}#defineCH452_LOAD_CLR{CH452_LOAD=0;}/* 与片机有单单单单单,与中断接方式有单单单单单单 */
#defineDISABLE_INTERRUPT{EX1=0;}#defineENABLE_INTERRUPT{EX1=1;}#defineCLEAR_INTER_FLAG{IE1=0;}12
3、MATLAB控制数据收单
,1,利用STC提供STC-ISP-V4.83单单单件MCU单单,同2,,2,串行口初始参数定,同单单单单2,
,3,片机内运行的程序,同单单单单单单单单单单单2,
以上部分皆与“2、利用串口助手串行口数据收单单单单单”内容相同只是用
MATLAB替代串口助手的功能。单单单单单单单单
,4,MATLAB数据收功能述单单单单单单单
先用MATLAB GUI画出所需窗口,如,单单5,所示,,并在系生成的单单单单程序中置串口通信参数及相函数。单单单单单单单单单单单单单单
;注,由于电学MATLAB天~口电置电电电。接收据口~只能电示接收没几窗数窗
到字符的ASCII电~电送据口在据前自电加控制字符“数窗会数LF”~ASCII电电0AH。电些不足都有待于电一步电。,学
单,5,
当要送数据,在数据送单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单窗口入所要送的数据,点送。同,需在所要送数据末尾加上单“”单单单单单单单单单单单单单单:,片机数据接收完,用LED数管示程单单单单单序,示送数据的单单单单单单单ASCII单“,然后返回Wait command!”字符串,PC机数据接收窗口示其单单单ASCII单单单单单单单单单单单单,,表示数据已接收且示。当片机按下按单单单单,返回,PC机数据接收窗口示的单单单单单ASCII单单,。点MATLAB收单单窗口的按,可以单单单单单单单单单单单单单此窗口。
13
例如:MATLAB数据送单单单单单单“窗口入6789 ABCD!”,LED数管依次示单单单单单单0AH(LF控制符)、36H,6,、37H,7,、38H,8,、39H,9,、20H,空格,、41H,A,、42H,B,、43H,C,、44H,D,、21H,!,,,单单单单6,。当按下最左的三个单单单单单@、H、x单单单,数据接收窗口依次示40H(@)、48H(H)、78H,x,,单单单,7,。
单,6,a 单,6,b
单,6,c 单,6,d
14
单,7,a 单,7,b
单,7,c 单,7,d
,5,MATLAB相程序单单单
function varargout = chuankoutongxingmatlab(varargin)gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', ...
@chuankoutongxingmatlab_OpeningFcn, ...
'gui_OutputFcn', ...
@chuankoutongxingmatlab_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});15
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});else
gui_mainfcn(gui_State, varargin{:});
end
% --- Executes just before chuankoutongxingmatlab is made visible.function chuankoutongxingmatlab_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
global data;
global port;
try
%单 置串口handles.s=serial('COM7','BaudRate',4800,'Parity','none',...
'DataBits',8,'StopBits',1);%建立串口单单象
port=handles.s;
set(handles.s,'OutputBufferSize',512);%单单单单单单单单置出冲区大小
set(handles.s,'InputBufferSize',1024);%单单单单单单单单置入冲区大小
set(handles.s,'BytesAvailableFcnMode','byte');%单置BytesAvailableFcnMode属性
set(handles.s,'BytesAvailableFcnCount',1);
set(handles.s,'BytesAvailableFcn',{@mycallback,handles});
%定单Bytes-Available事件回函数单单单
fopen(handles.s);
catch
%单单单单行出理
errmsg = lasterr;
errordlg(['不能打单单单串口: COM7',char(10),...
'单单单单单单单单单单单串口接或串口已打'],'串口打单单单');
rethrow(lasterror);
end
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line.function varargout = chuankoutongxingmatlab_OutputFcn...
(hObject, eventdata, handles) varargout{1} = handles.output;
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)delete(handles.figure1);%单单单单框
% --- Executes on button press in pushbutton1.
16
function pushbutton1_Callback(hObject, eventdata, handles)global port;
global data;
data=get(handles.edit2,'string');
fprintf(port,data);
function edit2_Callback(hObject, eventdata, handles)% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),...
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit1_Callback(hObject, eventdata, handles)% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),...
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function mycallback(obj,event,handles)%接收事件回函数单单单
global rcv;
global str;
if handles.s.BytesAvailable>0
rcv=fread(handles.s, handles.s.BytesAvailable,'uint8');%数据取单单
str=sprintf('%3X',rcv);%以大写十六制单单ASCII单单示,个每占三位
set(handles.edit1,'String',str);
end
% --- Executes during object deletion, before destroying properties.
function figure1_DeleteFcn(hObject, eventdata, handles)fclose(handles.s);%单单单单串口接
delete(handles.s);%单单单除串口象
clear all;%清除所有
17
18
三、小单
PC与电片机电的串口通信的科电电~要求电电电能电电电电的通信工作~电于未具研从体操作电相电电物的我电收电大。来很
首先~电51系列电片机的通用部分及具不同的电品差有了一定了解。通电电电体异
具电片机电品手~可得知其中通用及差部分~电电电目的可以有不同的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
~不体册异
同电片机也存在着自己有的电电。独
由于电MATLAB有了一点接~感到其功能十分强大~电电多电电电电和解电电便触决
捷。短短天的了解~电我电一步电打下了基电。同电~也电一步熟悉几学Keil uVision4
的部分功能。
本次电电中收电电多电电电电电解方法~电电程序电电有电电到能正电电所要功能电有电决没真很一段路。期电~需要不电电~一点一点出电电。而且~需要电不同情电行电电~直到断找况
没有电电位置。所以电次的电具电电的电电~电我电益匪~电我以后的电电电电多。接体浅会学很
下我电电电电相电知电~电电电电电做好准电。来会学
最后,感老单单单单单单单单单单单单单单单单单单单单单在此次科研中予我的巨大帮助:
19
四、参考文献
1 李朝青.单单单单片机原理及接口技,第3版,.北京:北京航天航空大学出版社,2005
2 单单涛等.MATLAB数据通信与控用程单单单单单单单单践.北京:子工出版单单单单单单单单社,20113 宏晶科技生的单单STC89C51RC/RD+系列单单单单单单单片机器件手册
4 南京沁恒单单单单单单单单单单单子有限任公司生的CH452数管及控制单单单单单单单单单单单芯片使用手册及CH37X451单单路板原理
20