本文利用Proteus仿真51单片机与电脑端上位机的UART串口通讯,可以实现上位机发送数字来控制LED灯的点亮,如果不是数值1-8蜂鸣器就会报警,顺便将发送的数值进行回传。其中的Proteus 8.15安装教程可以参考:http://t.csdnimg.cn/KRIov。
1. 电路连接
1.1 整体电路连接
其中的时钟和复位电路可以不需要连接也可以使用。其中51单片机的RXD需要和COMPIM的RXT相连接,TXD与TXD连接。
1.2 元器件载入
在侧边栏找到元件图标,在搜索栏输入AT89得到51芯片,其他元器件的名字为:10WATT10R-电阻,02013A0R5CAT2A-电容,BUTTON-按键,BUZZER-蜂鸣器,COMPIM-计算机接口,CRYSTAY-晶振,LED-灯,PNP-三极管。
虚拟终端在侧边栏的虚拟仪器模式里面的VIRTUAL TERMINAL。
1.3 设置51单片机程序和频率
在程序文件中选择keil编译的.hex文件,设置频率的时候要注意单位。因为通信使用9600的波特率,所以设置频率为11.0592MHz,如果加了外部晶振也不要忘记设置频率。
1.3 设置虚拟终端和计算机接口的终端
双击虚拟终端配置波特率为9600,设置数据位数为8位,截止位1位,计算机接口也要进行配置。
2. 程序部分
本文的程序将放在末尾,需要自取,不要忘记点赞哦。
2.1 串口初始化
配置波特率率为9600,允许串口中断。
//设置波特率9600
SCON=0x50; //设定串口工作方式
PCON=0x00; //波特率不倍增
TMOD=0x20; //定时器1工作于8位自动重载模式, 用于产生波特率
EA=1;
ES = 1; //允许串口中断
TL1=0xfd;
TH1=0xfd; //波特率9600
TR1=1;
2.2 发送数据
u8 UART_Receive_Data()
{
u8 temp;
while(!RI);//等待串口接收到数据(RI被置1)
temp=SBUF;
RI=0;//清空接收中断标志位,为下次接收做准备
return temp;
}
2.3 串口中断程序
void serial() interrupt 4
{
ES = 0; //关闭串行中断
RI = 0; //清除串行接受标志位
buf = SBUF; //从串口缓冲区取得数据
UART_Send_Data(SBUF);//将数据发回电脑
switch(buf)
{
case 0x31: P1=0xfe;beep=1;break; //接受到1,第一个LED亮
case 0x32: P1=0xfd;beep=1;break; //接受到2,第二个LED亮
case 0x33: P1=0xfb;beep=1;break; //接受到3,第三个LED亮
case 0x34: P1=0xf7;beep=1;break; //接受到4,第四个LED亮
case 0x35: P1=0xef;beep=1;break; //接受到5,第五个LED亮
case 0x36: P1=0xdf;beep=1;break; //接受到6,第六个LED亮
case 0x37: P1=0xbf;beep=1;break; //接受到7,第七个LED亮
case 0x38: P1=0x7f;beep=1;break; //接受到8,第八个LED亮
default: beep=0;P1=0xff;break; //接受到其它数据,蜂鸣器响
}
ES = 1; //允许串口中断
}
3. 虚拟串口驱动
使用Virtual Serial Port Driver 6.9来配置虚拟串口,将Proteus里面的计算机接口和你的电脑进行连接。因为我已经添加了COM1和COM2两个虚拟端口,所以添加那里自动变成了COM5和COM6,而前面的COM3和COM4是电脑自带的端口。可以看到Virtual ports下面的COM2有一个后缀[9600-N-8-1],那是因为我打开了串口调试助手连接COM2后就会自动显示。
配置Proteus里面的计算机接口连接COM1。
4. 实验结果
当我们使用串口调试助手发送数字2时,第二个LED亮起,并且回传了一个数值2。
需要自取,感谢记得点赞关注哦。
虚拟串口Virtual Serial Port Driver:
链接:https://pan.baidu.com/s/1Q4TezCDK2ETzAN0-gAt7cA?pwd=1025 提取码:1025
代码和电路图:
链接:https://pan.baidu.com/s/1h9EUfjAO0wf6xSiTmbTTKA?pwd=1025 提取码:1025