/**单片机接收主机的数据,然后将数据传送到P2口,*当按下K1=P1.4 时, 单片机发送字符串 给主机 */ #include#include unsigned char key_s, key_v, tmp;char code str1[] = "123 ";char code str2[] = "abc ";char code str3[] = "666 ";void send_str();bit scan_key();void proc_key();void delayms(unsigned char ms);void send_char(unsigned char txd);sbit K1 = P1^4;main(){ SCON=0X50; //设置为工作方式1 TMOD=0X20; //设置计数器工作方式2 PCON=0X80; //波特率加倍 TH1=0XF3; //计数器初始值设置,注意波特率是4800的 TL1=0XF3; TR1 = 1; //启动定时器1 IE = 0x0; //禁止任何中断 while(1) { if(scan_key()) // 扫描按键 { delayms(10); // 延时去抖动 if(scan_key()) // 再次扫描 { key_v = key_s; // 保存键值 proc_key(); // 键处理 } } if(RI) // 是否有数据到来 { RI = 0; tmp = SBUF; // 暂存接收到的数据 P2 = tmp; // 数据传送到P0口 send_char(tmp); // 回传接收到的数据 } }}bit scan_key(){ key_s = 0x00; key_s |= K1; return(key_s ^ key_v);}void proc_key(){ if((key_v & 0x01) == 0) { // K1按下 send_str(); // 传送字串"welcome!... }}void send_char(unsigned char txd){ SBUF = txd; while(!TI); // 等特数据传送 TI = 0; // 清除数据传送标志}void send_str(){ unsigned char i = 0; while(str1[i] != '\0') { SBUF = str1[i]; while(!TI); // 等特数据传送 TI = 0; // 清除数据传送标志 i++; // 下一个字符 } i = 0; while(str2[i] != '\0') { SBUF = str2[i]; while(!TI); // 等特数据传送 TI = 0; // 清除数据传送标志 i++; // 下一个字符 } i = 0; while(str3[i] != '\0') { SBUF = str3[i]; while(!TI); // 等特数据传送 TI = 0; // 清除数据传送标志 i++; // 下一个字符 }}void delayms(unsigned char ms){ unsigned char i; while(ms--) { for(i = 0; i < 120; i++); }}