给大家看下最全串口实验
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h>
- sbit p1_0 = P1^0;
- //初始化串口 (设置串口,开启串口中断)
- void init_uart(void)
- {
- SCON = 0x50; // SCON: 方式 1, 8-bit, 允许接收数据
- TMOD |= 0x20; // TMOD: 设置定时器1工作在方式2, 8-bit 自动重装
- TH1 = 0xFD; // TH1: 初始值为0xFD 波特率:9600 晶振频率:11.0592MHz
- TL1 = 0x0;
- TR1 = 1; // TR1: 开启定时器1
- EA = 1; //打开总中断
- ES = 1; //打开串口中断
- }
-
- // 发送一个字节数据
- void uart_send_byte(unsigned char dat)
- {
- SBUF = dat; // 将数据送到发送缓冲寄存器SBUF,一位一位的发送
- while(!TI); // 等待发送完毕 (发送完毕TI硬件置1)
- TI = 0;// 将TI清零,表示可以发送下一字节数据。
- }
- // 发送字符串
- void uart_send_str(unsigned char *s)
- {
- while(*s != '\0')// '\0':字符串结束标志
- {
- uart_send_byte(*s);// 发送1个字节数据,1个字符占8位,1字节
- s++;// 指向下一个字符
- }
- }
- // 串口中断处理函数 (串口接收到数据,发送数据完毕都可以引起串口中断)
- void uart_interrupt(void) interrupt 4 //也叫串行中断服务程序
- {
- unsigned char recv_data;// 用来存放接收到的数据
- unsigned char send_data[] = "I received.\n";// 要发送的信息
-
- if(RI) //接收数据(1字节)完毕,RI会被硬件置1
- {
- RI = 0; // 将 接收中断标志位 清零(让串口可以继续接收数据)
- recv_data = SBUF; //读取接收到的数据,并存放到data
-
-
- if(recv_data == '1')//如果收到的字符是'0',就让灯灭
- {
- p1_0 = 0;// p1.0引脚低电平,LED灯亮
- }
- else
- {
- p1_0 = 1;// p1.0引脚高电平,LED灯灭
- }
- uart_send_str(send_data); //收到数据之后,发送字符串"I received."给对方
- }
- if(TI)// 发送数据(1字节)完毕
- {
- TI = 0;// 将 发送中断标志位 清零(让串口可以继续发送数据)
- }
- }
- void main(void)
- {
- init_uart();// 初始化串口
-
- while(1)// 主循环不做任何动作。(死循环)
- {}
- }
复制代码
所有资料51hei提供下载:
串口通信仿真实验.rar
(65.53 KB, 下载次数: 42)
|