功能描述:通过虚拟串口输入A、B、C、D控制灯泡L1、L2的亮灭,项目文件见附件下载,文件包
图1 仿真图
第一步点击vspd.exe安装虚拟串口连接软件
安装完成后打开如下图,选择试用就可以
点击pair
找两个com口连接起来,数字不要太大要不protues中的串口找不到,设置完了不要关闭软件 第二步:在protues中配置串口,打开protues文件,点击串口
设置如下 下一步点击com.exe配置PC串口 配置如下,其中端口根据你设置的去决定
配置结束,在protues中点运行 在串口中发送区输入字母ABCBEF,点击手动发送观察实验现象
单片机源程序如下:
/********************************************main.c********************************************/
#include <reg51.h>
sbit led1 = P1^0;
sbit led2 = P1^1;
//初始化串口 (设置串口,开启串口中断)
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 == 'A')//如果收到的字符是'0',就让灯灭
{
led1 = 0;// p1.0引脚低电平,LED灯亮
led2 =1 ;
uart_send_str("A");
}
else if(recv_data == 'B')
{
led1 = 1;// p1.0引脚高电平,LED灯灭
led2 = 0;
uart_send_str("B");
}
else if(recv_data == 'C')
{
led1 = 0;// p1.0引脚高电平,LED灯灭
led2 = 0;
uart_send_str("C");
}
else if(recv_data == 'D')
{
led1 = 1;// p1.0引脚高电平,LED灯灭
led2 = 1;
uart_send_str("D");
}
else uart_send_str("E");
}
if(TI)// 发送数据(1字节)完毕
{
TI = 0;// 将 发送中断标志位 清零(让串口可以继续发送数据)
}
}
void main(void)
{
init_uart();// 初始化串口
while(1)// 主循环不做任何动作。(死循环)
{}
}
Keil代码与Proteus仿真下载:
拓展练习6.7z
(5.72 MB, 下载次数: 42)
|