注意点1.注意引用stdio.h头文件然后进行重定向这样可以使用printf直接打印数据不在需要用字节或指针之类的去发送实测非常好用强烈推荐2.关于void panduan()函数一定要放在中断里面进行如果放在while里面会导致丢失字节然后进而产生一系列的错误ps搜索了一下有资料解释是波特率为9600时进入串口中断约为1ms左右这样会使得在while里面判断的时候进入到中断里面然后把jsdate变量的值给顶掉最终导致数据解算失败3.关于xx*10(jsdate-0);为什么减去0,这是因为这里是用文本模式发送的数字不是实际的数字对应ASCll码值具体0-9对应的值可以询问一下ai4.关于void panduan()函数讲解首先检测到(设置flag1进入到x坐标的解算当在flag1时检测到,说明x坐标解算完成然后将flag置为2进行y坐标的解算当在flag2时检测到)说明数据发送完成然后进行printf打印数据这里面其实就是状态机的一种体现只是将switch语句变更为if语句但是本质上区别不大5.最后这是一个可执行的代码直接全部复制放到main.c就可以进行使用(代码若有bug欢迎一起讨论)#include STC15F2K60S2.H #include stdio.h //0-9 unsigned char duanma[10]{ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 }; //数码管缓存 unsigned char smg_buf[8]{ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }; //串口接收数据 unsigned char jsdate0; unsigned char flag0; //坐标x--y unsigned int x0,y0; //锁存器 void xuanze(unsigned char n) { P2(P20x1f)|(n5); } //数码管 void smgxs() { static unsigned char i; xuanze(7); P00xff; xuanze(6); P00x01i; xuanze(7); P0smg_buf[i]; xuanze(0); i(i1)%8; } void smgfz() { smg_buf[0]0xc7; smg_buf[1]x99?duanma[x/100%10]:0xff; smg_buf[2]x9?duanma[x/10%10]:0xff; smg_buf[3]duanma[x%10]; smg_buf[4]0xbf; smg_buf[5]y99?duanma[y/100%10]:0xff; smg_buf[6]y9?duanma[y/10%10]:0xff; smg_buf[7]duanma[y%10]; } //定时器 void Timer2Init(void) //1毫秒12.000MHz { AUXR | 0x04; //定时器时钟1T模式 T2L 0x20; //设置定时初始值 T2H 0xD1; //设置定时初始值 AUXR | 0x10; //定时器2开始计时 IE2 | 0x04; EA 1; } void dsq2() interrupt 12 { smgxs(); } // void panduan() { if(jsdate() { x0; y0; flag1; } if(flag1) { if((jsdate0)(jsdate9)) { xx*10(jsdate-0); } else if(jsdate,) { flag2; } } if(flag2) { if((jsdate0)(jsdate9)) { yy*10(jsdate-0); } else if(jsdate)) { printf(Got it\r\n); flag0; } } if(jsdate?) { printf(Idle\r\n); } if(jsdate#) { printf((%d,%d)\r\n,x,y); } } //串口 void UartInit(void) //9600bps12.000MHz { SCON 0x50; //8位数据,可变波特率 AUXR 0xBF; //定时器时钟12T模式 AUXR 0xFE; //串口1选择定时器1为波特率发生器 TMOD 0x0F; //设置定时器模式 TL1 0xE6; //设置定时初始值 TH1 0xFF; //设置定时初始值 ET1 0; //禁止定时器%d中断 TR1 1; //定时器1开始计时 ES 1; } char putchar (char a) { SBUFa; while(TI0); TI0; return (a); } void ck() interrupt 4 { if(RI1) { jsdateSBUF; panduan(); RI0; } } //主函数 void main() { Timer2Init(); UartInit(); while(1) { smgfz(); } }