⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs-232.txt

📁 void UART_init() { //初始化串行口和波特率发生器 SCON =0x58 //选择串口工作方式
💻 TXT
字号:
//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg51.h>
#define COUNT 10 // 定义接收缓冲区大小 
unsigned char buffer[COUNT]; //定义接收缓冲区
unsigned char point;  //定义接收数据个数指示变量
void UART_init();     //串口初始化函数
void COM_send(void);  //串口接收函数
unsigned char CLU_checkdata(void);//计算校验位函数
//--------------------------------------------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
//  串口接收中断允许,发送中断禁止
//--------------------------------------------------------------------------------------------------
void UART_init()
{
//初始化串行口和波特率发生器 
SCON =0x58;     //选择串口工作方式,打开接收允许
TMOD =0x21;     //定时器1工作在方式2,定时器0工作在方式1
TH1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)
TR1 =1;    //启动定时器T1
ET1 =0; 
ES=1; //允许串行口中断
PS=1; //设计串行口中断优先级
EA =1;     //单片机中断允许
}
//--------------------------------------------------------------------------------------------------
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收包括起始位'S'在内的十位数据到数据缓冲区
//--------------------------------------------------------------------------------------------------
com_interrupt(void) interrupt 4 using 3
{
  unsigned char RECEIVR_buffer;
  if(RI)  //处理接收中断
  {
RI=0;  //清除中断标志位
  RECEIVR_buffer=SBUF;  //接收串口数据
if(point==0)  //如果还没有接收到起始位
   {
   if(RECEIVR_buffer=='S')  //判断是否起始标志位
   point++;     //是准备接收下一位
  else
  point=0;     //不是,继续等待起始位
   } 
else if(point>0&&point<10)     //判断是否接收够十位数据
  buffer[point++]=RECEIVR_buffer;  //不够,把接收到的数据放入接收缓存区
else point=0;         //缓冲区已满,清除缓存区内数据重新接收
}
If(TI)    //处理发送中断
 {
TI=0;
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: COM_send()串口发送函数
// 函数功能: 把数据缓冲区的十位数据发送出去
//--------------------------------------------------------------------------------------------------
void COM_send(void)
{
for(point=0;point<=10,TI=1;point++) //连续发送十位数据
   //把缓存区的数据都发送到串口
  {
   SBUF=buffer[point];
   TI=0;
   }
}
//--------------------------------------------------------------------------------------------------
// 函数名称: CLU_checkdata()计算校验位函数
// 输入变量: 无
// 输出变量: checkdata,包括起始位在内的前九位数据的校验和
// 函数功能: 计算校验和
//--------------------------------------------------------------------------------------------------
unsigned char CLU_checkdata(void)
{ //计算校验位
 unsigned char checkdata=0;
for(point=0;point<9,TI=1;point++)
  {
   checkdata=checkdata|buffer[point];
   }
   return(checkdata);
 }
//--------------------------------------------------------------------------------------------------
// 函数名称: 主函数
// 函数功能: 调度个子函数,完成通信过程
//--------------------------------------------------------------------------------------------------
 void main(void)
 {
 unsigned char checkdata;
 do
 {
  UART_init();  //初始化串口
  if(point==10)  //判断数据是否接收完成
  checkdata=CLU_checkdata;    //调用求校验和函数
  if(checkdata==buffer[9])   //判断校验和是否正确
  COM_send();
     //正确则调用发送程序
  point=0;
  }
  while(1);
 }


//---------------------------------------SComm控件的常用属性和方法-----------------------------   

Commport;设置或返回串口号。

SettingS:以字符串的形式设置或返回串口通信参数。

Portopen:设置或返回串口状态。

InputMode:设置或返回接收数据的类型。

Inputlen:设置或返回一次从接收缓冲区中读取字节数。

InBufferSize:设置或返回接收缓冲区的大小,缺省值为l 024字节。

InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。

Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。

OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。

OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。

Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。

设置好这些属性和方法,程序很容易就可以编出来了,其中要注意的是串口的波特串设置,OnComm事件的程序编写。    

程序的设计是这样的,计算机向单片机发送一个’S’,表示通信开始。然后紧接着又发送9个字符,其中最后一个字符是前面9个字符(包括’S’)的校验和。单片机正确接收到10个字符后,把10个字符从新又送回来。

//---------------------------------------初始化串口设计-----------------------------   

Private Sub Form_Load()

Comm1.Setting="9600,n,8,1,"  ’设置波特率和发送字符格式

Comm1.CommPort=1    ’设置通讯串口

Comm1.InputLen=0    ’设置或返回一次从接收缓冲区中读取字节数,0表示一次读取所有数据

Comm1.InBuffersize=512

Comm1.InBufferCount=0

Comm1.OutBufferCount=0

Comm1.Rthreshold=1

Comm1.PortOpen=True

End Sub ’打开串口

//--------------------------------------给单片机发送’S’,开始通信-----------------------------   

Private Sub Command1_C1ick()

 Timer1.Enabled=True

 End Sub

 Private Sub Command2_C1ick()

 Varbuffet=“S”    

 Comm1.Ouput=varbuffe

 Timer2.Enabled=True

 End Sub

Private Sub Form_Unload(Cancel As Integer)

Comm1.PortOpen=False

End Sub

//---------------------------------------向单片机发送数据-----------------------------   

Private Sub Timer2_ Timer()

Outputsignal=Str(Text2.text) '向单片机发送数据

Temp(1)=Cbyte(outputsignal)

Varbuffer=temp

Comml.Output=varbuffer

Timer2.Enabled=False

End Sub

//---------------------------------------接收单片机发送的数据,并显示-----------------------------   

Private Sub Comm1_OnComm()

 Select Case Comm1.CommEvent    '设置oncomm事件,读取片机内存的值

 Case comEvReceive

 Inputsignal=comm1.Input

 Text1.Text=Asc(Inputsignal)    '单片机内存的值用textbox显示出

 Case Else

 End select

 End Sub

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -