单片机usb转串口的时灵时不灵的解答
写这篇博客,首先检讨一下自己,因为以前串口的程序,也和步进电机一样,时灵时不灵,我现在终于知道这是为什么了,因为51上有三个串口,一个公口,一个母口,一个usb转串口,这样的话,串口有3个了,我手头上有usb转串口线,也就是平时用来下程序的那根线,还有一个母口的线,今天我很纠结这两个的驱动,因为今天用usb转串口线,可以实现单片机和电脑的通信,但是用母口线,奇怪的是他并没有想象中的那种效果,更奇葩的是单片机下电它还能接收到数据
尼玛了这么久,还是看一下今天的程序,这个程序很简单,也就是上一次屡次不爽的程序,这里晒出来,还有串口小助手的截图也发出来,供以后学习之用
/*----------------------------------------------- 名称:串口通信 网站:www.doflye.net 编写:shifang 日期:2009.5 修改:无 内容:连接好串口或者usb转串口至电脑,下载该程序,打开电源 打开串口调试程序,将波特率设置为9600,无奇偶校验 晶振11.0592MHz,发送和接收使用的格式相同,如都使用 字符型格式,按复位重启程序,可以看到接收到 UART test,技术论坛:www.doflye.net 请在发送区输入任意信 然后在发送区发送任意信息,接收区返回同样信息,表明串口收发无误 ------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 /*------------------------------------------------ 函数声明 ------------------------------------------------*/ void SendStr(unsigned char *s); /*------------------------------------------------ 串口初始化 ------------------------------------------------*/ void InitUART (void) { SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收 TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装 TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz TR1 = 1; // TR1: timer 1 打开 EA = 1; //打开总中断 // ES = 1; //打开串口中断 } /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { InitUART(); SendStr("UART test,技术论坛:www.doflye.net 请在发送区输入任意信息"); ES = 1; //打开串口中断 while (1) { } } /*------------------------------------------------ 发送一个字节 ------------------------------------------------*/ void SendByte(unsigned char dat) { SBUF = dat; while(!TI); TI = 0; } /*------------------------------------------------ 发送一个字符串 ------------------------------------------------*/ void SendStr(unsigned char *s) { while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾 { SendByte(*s); s++; } } /*------------------------------------------------ 串口中断程序 ------------------------------------------------*/ void UART_SER (void) interrupt 4 //串行中断服务程序 { unsigned char Temp; //定义临时变量 if(RI) //判断是接收中断产生 { RI=0; //标志位清零 Temp=SBUF; //读入缓冲区的值 P1=Temp; //把值输出到P1口,用于观察 SBUF=Temp; //把接收到的值再发回电脑端 } if(TI) //如果是发送标志位,清零 TI=0; }
不知道母口那根线是怎么回事,以后调试一下,问题出来才总结
版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3467486.html