天津职业技术师范大学2010届本科生毕业设计(论文)
SBUF = len; // 发送长度 while(!TI); TI = 0; /* 发送数据 */ for(i=0; i void delay10ms(unsigned int count) { unsigned int i, k; unsigned char j; unsigned int tmp; tmp = (int)((100*_MHZ_)/12); for(i=0; i #endif (2)从机部分 #include #include #define __MAX_LEN_ 64 // 数据最大长度 #define _MHZ_ 11 // 设置单片机使用的晶振频率(11.0592MHz) /* 以下为程序协议中使用的握手信号 */ #define __SUCC_ 0x0f // 数据传送成功 天津职业技术师范大学2010届本科生毕业设计(论文) #define __ERR_ 0xf0 // 数据传送错误 void init_serial(); // 串口初始化 unsigned char recv_data(unsigned char *buf); // 接收数据 void main() { char buf[__MAX_LEN_]; unsigned char i = 0; unsigned char tmp = 0xff; unsigned char addr; // 保存本机地址 /* 从P1口读取本机地址 */ P1 = 0xff; addr = P1; /* 串口初始化 */ init_serial(); // 初始化串口 EA = 0; // 关闭所有中断 /* 进入设备应答阶段 */ while(1) { SM2 = 1; // 只接收地址帧 /* 如果接收到的地址帧不是本机地址,则继续等待 */ tmp = addr-1; while(tmp != addr) { RI = 0; while(!RI); tmp = SBUF; if(tmp=0x00) { recv data (*buf); // 如果是广播地址,则直接接收数据 } RI = 0; } /* 发送应答信号,并做好接收数据的准备 */ TI = 0; TB8 = 0; SBUF = addr; while(!TI); TI = 0; SM2 = 0; // 允许接收数据信息 /* 数据接收 */ 天津职业技术师范大学2010届本科生毕业设计(论文) tmp = 0xff; while(tmp == 0xff) // 如果数据校验失败则重新接收数据 { tmp = recv_data(buf); // 校验失败返回0xff,检测到地址帧则返回0xfe,接收成功则返回0 } if(tmp == 0xfe) // 在数据接收过程中,如果发现地址帧,则重新开始整个接收过程 continue; } } /* 初始化串口 */ void init_serial() { TMOD = 0x20; //定时器T1使用工作方式2 TH1 = 250; // 设置初值 TL1 = 250; TR1 = 1; // 开始计时 PCON = 0x80; // SMOD = 1 SCON = 0xd0; //工作方式3,9位数据位,波特率9600bps,允许接收 } unsigned char recv_data(unsigned char *buf) { unsigned char len; // 该字节用于保存数据长度 unsigned char ecc; // 该字节用于保存校验字节 unsigned char i,tmp; /* 接收数据长度 */ RI = 0; while(!RI); if(RB8 == 1) // 若当前接收为地址帧则返回0xfe return 0xfe; len = SBUF; RI = 0; /* 使用len的值为校验字节ecc赋初值 */ ecc = len; /* 接收数据 */ for(i=0; i 天津职业技术师范大学2010届本科生毕业设计(论文) ecc = ecc^(*buf); // 进行字节校验 RI = 0; buf++; } *buf = 0; // 表示数据结束 /* 接收校验字节 */ while(!RI); if(RB8 == 1) // 若当前接收为地址帧则返回0xfe return 0xfe; tmp = SBUF; RI = 0; /* 进行数据校验 */ ecc = tmp^ecc; if(ecc != 0) // 校验失败 { *(buf-len) = 0; // 清空数据缓冲区 TI = 0; // 发送校验失败信号 TB8 = 0; SBUF = __ERR_; while(!TI); TI = 0; return 0xff; // 返回0xff表示校验错误 } TI = 0; // 校验成功 TB8 = 0; SBUF = __SUCC_; while(!TI); TI = 0; return 0; // 校验成功,返回0 } #endif B光照度调节程序 (1) 主机部分 #include #include #define uchar unsigned char #define uint unsigned int sbit P2_6=P2^6 天津职业技术师范大学2010届本科生毕业设计(论文) void init_serialcomm(void) { SCON=0x50; TMOD=0x20; PCON=0x80; TH1=250; TL1=250; TR1=1; } Void send_addr( unsigned char *buf) { /* 发送从机地址 */ TI = 0; TB8 = 1; // 发送地址帧 SBUF = addr; while(!TI); TI = 0; If(tmp=ox00) { Send data(buf); // 如果是广播地址,直接发送数据 } /* 接收从机应答 */ RI = 0; while(!RI); tmp = SBUF; RI = 0; } void send_data(unsigned char *buf) { unsigned char len; // 保存数据长度 unsigned char ecc; // 保存校验字节 len = strlen(buf); // 计算要发送数据的长度 ecc = len; // 开始进行校验字节计算 /* 发送数据长度 */ TI = 0; TB8 = 0; // 发送数据帧 SBUF = len; // 发送长度 while(!TI); TI = 0; /* 发送数据 */ for(i=0; i 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库用单片机实现光照度的PID调节(5)在线全文阅读。
相关推荐: