注册安全工程师难吗,迅速上排名网站优化,汕头网站建设制作方案,怎么将网站做成html51单片机串口通讯原理及程序源码-----day8 1.定义单片机为TTL电平#xff1a;高 5V 低 0V RS232电平#xff1a; 计算机的串口高 -12V 低12V 所以计算机与单片机之间通讯时需要加电平转换芯片CH340T 、 MAX232。 2.通信分类#xff1a; #xff08;1#xff09;并行通信通…51单片机串口通讯原理及程序源码-----day8 1.定义单片机为TTL电平高 5V 低 0V RS232电平 计算机的串口高 -12V 低12V 所以计算机与单片机之间通讯时需要加电平转换芯片CH340T 、 MAX232。 2.通信分类 1并行通信通常是将数据字节的各位用多条数据线同时进行传送 。 并行通信控制简单、 传输速度快 由于传输线较多 长距离传送时成本高且接收方的各位同时接收存在困难 2串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送。串行通信的特点 传输线少 长距离传送时成本低 且可以利用电话网等现成的设备 但数据的传送控制比并行通信复杂。 异步通信的特点 不要求收发双方时钟的严格一致 实现容易 设备开销较小 但每个字符要附加23位用于起止位 各帧之间还有间隔 因此传输效率不高。 2.UART的四种模式 模式0 模式1 以TXD为例 平时没数据时TXD为高电平 来了数据 一位起始位0 八位数据位 一个字节 一位停止位1。 模式2和3 原理和模式1一样 只是添加了一位奇偶校验位 防止通信出错 。奇校验在D7后补充一位0或者1根据前面1的个数来补充如果是奇校验且D0-D7之间1的个数为偶数则补1如果是偶校验且D0-D7之间个数为奇数则补1.
3.单位 波特率 位/字符× 字符/秒 位/秒。 波特率 就是发送一位数据的速率 即发送一个数据的持续时间 1/baud; 常用串口波特率 300、 600、 1200、 2400、 4800、 9600、19200 ……115200 SBUF:串口数据缓冲寄存器 发送数据时 只要将数据送入SBUF 则单片机自动发送数据接收数据时 自动将数据接收至SBUF。 SCON串口控制寄存器 SM1与SM2为模式0时波特率为时钟频率/12比特率固定。 模式2与模式3时9位数据多一位奇偶校验位。 模式1为串口常用模式。 SM2 使能模式2和3中的多机通信功能。 通常不使用。 REN 使能串口接收。 由软件置1 则允许串口接收数据 由软件清零 则禁止串口接收数据。 TB8,RB8 方式2和方式3中的校验位 分为四种方式A.偶校验;B.奇校验;C.强制为0;D.强制为1 。 TI 发送中断标志 在发送停止位时由硬件置1。必须通过软件才能清零。 RI 接收中断标志 接收停止位的中间时刻由硬件置1 必须通过软件清零。 定时器TMOD 模式2 自动装载8位计数器。 主要应用在串口波特率发生器。 SMOD:波特率选择位。当用软件置位SMOD即SMOD1则使串行通信方式1、2、3的波特率加倍SMOD0则各工作方式的波特率不加倍。复位时SMOD0。 一般选择不加倍所以SMOD为0SYSclk是单片机时钟也就是晶振的频率11.0592MHz运算时要转化为基本单位Hz即11059200Hz 定时器工作模式是8位自动重装载TH1和TL1赋的初值一样。 定时器1使用自动重装模式 即模式2。 TH1 TL1 256 - 11059200/(12 * 32 *9600) TH1TL10xFD; 实现步骤 1、 将定时器1置为自动重装模式。 2、 将串口设置为方式1。 3、 根据公式计算出定时器1的初值。 4、 打开定时器1 打开串口允许接受。 发送字符
uint8 Buf[]how are you!\n;void delay(uint16 n)
{while (n--);
}/** UART初始化* 波特率9600
*/
void UART_init(void)
{SCON 0x50; // 10位uart允许串行接受TMOD 0x20; // 定时器1工作在方式2自动重装TH1 0xFD;TL1 0xFD;TR1 1;
}/** UART 发送一字节
*/
void UART_send_byte(uint8 dat)
{SBUF dat;while (TI 0);TI 0;
}/** UART 发送字符串
*/
void UART_send_string(uint8 *buf)
{while (*buf ! \0){UART_send_byte(*buf);}
}void main()
{UART_init(); while (1){UART_send_string(Buf);delay(20000);}}
void main()
{unsigned char i;EA 1; //使能总中断ConfigTimer0(1); //配置T0定时1msConfigUART(9600); //配置波特率为9600while (1){ //将接收字节在数码管上以十六进制形式显示出来disbuf[0] ucDataOneTab[RxdByte 4];disbuf[1] ucDataOneTab[RxdByte 0x0F];for (i 0; i 8; i ){SendData(disbuf[i], ucDataTwoTab[i]); Delay1ms(1);} }
}
/* 串口配置函数baud-通信波特率 */
void ConfigUART(unsigned int baud)
{SCON 0x50; //配置串口为模式1TMOD 0x0F; //清零T1的控制位TMOD | 0x20; //配置T1为模式2TH1 256 - (11059200/12/32)/baud; //计算T1重载值TL1 TH1; //初值等于重载值ET1 0; //禁止T1中断ES 1; //使能串口中断TR1 1; //启动T1
}
/* UART中断服务函数 */
void InterruptUART() interrupt 4
{if (RI) //接收到字节{RI 0; //手动清零接收中断标志位RxdByte SBUF; //接收到的数据保存到接收字节变量中SBUF (RxdByte0x04)(RxdByte0x0f); //接收到的数据的高位低位相加返回//用以提示用户输入的信息是否已正确接收}if (TI) //字节发送完毕{TI 0; //手动清零发送中断标志位}
}超级简单不扩展了。。。。 ASCII表