精品基于串口通信的步进电机调速系统设计-定 - 图文 下载本文

内蒙古科技大学毕业设计说明书(毕业论文)

附录B

PCB板的布线

PCB的模型

40

内蒙古科技大学毕业设计说明书(毕业论文)

附录C

源程序

//采用串行通信方式传送数据,偶校验,一位结束位,传输的数据传输速率为9600bit/s。每个数据帧包含10Byte信息,1Byte作为帧起始标志,8Byte数据,1Byte的校验和。//-----------------------函数声明,变量定义-------------------------------------------------------- #include

#define COUNT 10 // 定义接收缓冲区大小 unsigned char buffer[COUNT]; //定义接收缓冲区 unsigned char point; //定义接收数据个数指示变量 void UART_init(); //串口初始化函数 void COM_send(void); //串口接收函数 unsigned char CLU_checkdata(void); //计算校验位函数

//-------------------------------------------------------------------------------------------------- // 函数名称: UART_init()串口初始化函数

// 函数功能: 在系统时钟为12MHZ时,设定串口波特率为9600bit/s // 串口接收中断允许,发送中断禁止 //初始化串行口和波特率发生器

//-------------------------------------------------------------------------------------------------- void UART_init() {

SCON =0x58; //选择串口工作方式,打开接收允许

TMOD =0x21; //定时器1工作在方式2,定时器0工作在方式1 TH1 =0xfd; //实现波特率9600(系统时钟12MHZ) TR1 =1; //启动定时器T1 ET1 =0;

ES=1; //允许串行口中断 PS=1; //设计串行口中断优先级 EA =1; //单片机中断允许 }

//--------------------------------------------------------------------------------------------------

41

内蒙古科技大学毕业设计说明书(毕业论文)

// 函数名称: com_interrup()串口接收中断处理函数

// 函数功能: 接收包括起始位':'在内的十位数据到数据缓冲区

//-------------------------------------------------------------------------------------------------- com_interrupt(void) interrupt 4 using 3 {

unsigned char RECEIVR_buffer;

if(RI) //处理接收中断 {

RI=0; //清除中断标志位

RECEIVR_buffer=SBUF; //接收串口数据

if(point==0) //如果还没有接收到起始位 {

if(RECEIVR_buffer==':') //判断是否起始标志位 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)

42

内蒙古科技大学毕业设计说明书(毕业论文)

{

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 {

43

//连续发送十位数

内蒙古科技大学毕业设计说明书(毕业论文)

UART_init(); //初始化串口

if(point==10) //判断数据是否接收完成 checkdata=CLU_checkdata; //调用求校验和函数 if(checkdata==buffer[9]) //判断校验和是否正确 COM_send(); //正确则调用发送程序 point=0; } while(1); }

44