1、功能描述

1.单片机与PC机通过RS232相连,编写一个异步串行口通信程序,实现单片机与PC机上的串口助手之间的通信。具体功能如下:

①PC机向单片机发送命令打开或关闭指定LED灯

②PC机向单片机发送命令启动或停止蜂鸣器播放音乐

③PC机向单片机发送字符并显示在1602液晶显示器上,也可发命令删除字符、换行、清除显示

④在单片机一端,点击矩阵按键,并将按键序号发送给PC机

2、PROTEUS中设计的电路图

3、源代码

#include<reg52.h>
#include<intrins.h>
#include <stdio.h>
sbit LCDEN=P3^4;
sbit RS=P3^5;
sbit RW=P3^6;
sbit BF=P1^7;
sbit FM=P3^2;unsigned char code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,142,159,0};
//生日快乐歌节拍表,节拍决定每个音符的演奏长短
unsigned char code SONG_LONG[]=
{9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};unsigned char code keyval[]="0123456789ABCDEF"; //按键对应的符号
unsigned char code keycode[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};    //按键键值编码void delay(unsigned int t)   //延时t毫秒
{int i,j;for(i=0;i<=t;i++)for(j=0;j<=110;j++);
}void  send(unsigned char s)     //发送函数,将8个灯的状态(0/1),以字符串的形式发送给上位机,先发最高位
{unsigned char i,t;for(i=0;i<8;i++){  s<<=1;t=CY;SBUF='0'+ t; //发送灯的状态给上位机while(!TI);//等待发送完TI=0;//清除发送结束标志  }
}unsigned char DectectBusyBit(void)//状态判断函数(忙/闲?)
{   bit result;P1 = 0xff;  //读状态前先置高电平,防止误判RS = 0;delay(5);RW = 1;LCDEN = 1;delay(5);result=BF; //若LCM忙,则反复测试,在此处原地踏步;当LCM闲时,才往下继续LCDEN = 0;return result;
}void WrComLCD(unsigned char ComVal)//写命令函数
{while(DectectBusyBit()==1);         //先检测LCM是否空闲RS = 0;delay(1);RW = 0;LCDEN = 1;P1 = ComVal;delay(1);LCDEN = 0;
}void WrDatLCD(unsigned char DatVal)//写数据函数
{
while(DectectBusyBit()==1); RS = 1;delay(1);RW = 0;LCDEN = 1;P1 = DatVal;delay(1);LCDEN = 0;
}void LCD_Init(void)//1602初始化函数
{ WrComLCD(0x38);     // 功能设定:16*2行、5*7点阵、8位数据接口WrComLCD(0x38);WrComLCD(0x38);
//多次重复设定功能指令,因为LCD启动后并不知道使用的是4位数据接口还是8位的,所以开始时总是默认为4位WrComLCD(0x01);    // 清屏 WrComLCD(0x06);    // 光标自增、屏幕不动  delay(1);       // 延时,等待上面的指令生效,下面再显示,防止出现乱码WrComLCD(0x0e);    // 开显示、开光标,闪烁
}unsigned char keypad4_4()//按键扫描函数:要去抖,若有按键按下,返回对应的按键值(0-15),没有按键按下返回16
{
unsigned char i,row,temp;
unsigned char key=16;//按键号,初值设置为16,目的是:没有按键按下时返回16;//若不设初值(默认值为0),没有按键按下时,将返回0,会误认为0被按下
row=0xef; //从第一列开始
for(i=0;i<4;i++)
{P2=0xff;  P2=row;    //第i列信号,对应列为低,其他全为高row=_crol_(row,1);      //生成下一列信号temp=P2; //读入扫描信号temp=temp&0x0f; //屏蔽高4位列信号,只保留低4位行信号 if(temp!=0x0f)//有按键被按下,因为第i列某行有按键按下,则低4位中有一位为低  {  delay(10);  //延时去抖temp=P2;  temp=temp&0x0f;  if(temp!=0x0f)   //再次确认有按键被按下{  switch(temp)  //根据低4位行信号,判断哪个按键被按下{  case 0x0e:key=0+i;break; //第i列第1行按键被按下 case 0x0d:key=4+i;break; //第i列第2行按键被按下  case 0x0b:key=8+i;break; //第i列第3行按键被按下case 0x07:key=12+i;      //第i列第4行按键被按下 }do{temp=P2;       //再次扫描按键temp=temp&0x0f;  }while(temp!=0x0f); //等待按键释放   }  }
}
return(key);//扫面结束,返回按键值
}void matrix(){unsigned char y,i=0;//while(1){y=keypad4_4();if(y<16){SBUF=keyval[y];  //发送灯的状态给上位机while(!TI);//等待发送完TI=0;//清除发送结束标志//    i++;      }
//  if(i==10) break;
//  }
}//播放函数
void PlayMusic()
{unsigned int i=0,j,k;while(SONG_LONG[i]!=0||SONG_TONE[i]!=0){   //播放各个音符,SONG_LONG为拍子长度for(j=0;j<SONG_LONG[i]*20;j++){FM=~FM;//SONG_TONE延时表决定了每个音符的频率for(k=0;k<SONG_TONE[i]/3;k++);}delay(50);i++;        }
}void main (void)
{ unsigned char t,led=0xff;        //灯初始状态全灭unsigned int a=1;FM=0;SCON=0x50;//串行口方式1PCON=0x00;//T1初始化,TMOD=0x20;//T1设为方式2TH1=0xFD;//选9600波特,fosc=11.0592MHzTR1=1;//启动T1P0=led;send(led); //发送初始状态给上位机 LCD_Init();    //初始化1602WrComLCD(0x80); //位置为第一行第一个while(1){matrix();if(RI)//接收上位机数据{   RI=0;//清接收标志t=SBUF;   //接收上位机发来的数据if(t!='d' && t!='l' && t!='c')  WrDatLCD(t);if(t=='s')      //‘s’为上位机同步请求符,send(led);//直接将发送显示状态给上位机if(t=='d'){    //'d'为1602显示屏删除一个字符WrComLCD(0x10); WrDatLCD(' '); delay(5);  WrComLCD(0x10);}if(t=='l'){    //'l'为1602显示屏换行if(a==1){WrComLCD(0xC0); a=0;}else {WrComLCD(0x80);a=1;}}if(t=='c'){    // 'c'为1602显示屏清屏WrComLCD(0x01);      //清屏WrComLCD(0x80);}if(t=='f'){PlayMusic();}if(t>='0' && t<='7'){         //接收上位机按键t=t-'0';// 获取上位机按键码led=led^(1<<t);//按键对应位取反P0=led; //更新单片机显示send(led); //发送显示状态给上位机}   }}
}

4、实验效果

由于不能上传视频,所以我将效果视频上传至优酷,请点击观看------->效果视频展示

问题咨询及项目源码请加群:

QQ群

名称:IT项目交流群

群号:245022761

【C51单片机】PC机控制单片机(仿真)相关推荐

  1. 串行口实验 编写程序利用PC机控制单片机实验板上的数码管设备工作

    编写程序利用PC机控制单片机实验板上的数码管设备工作 在pc上输入fe,第一个数码管显示1. 在pc上输入fa第五个数码管显示5 程序: #include<reg51.h> #define ...

  2. 【C51单片机】PC机控制单片机

    单片机与PC机通过RS232相连,编写一个异步串行口通信程序,实现单片机与PC机上的串口助手之间的通信.具体要求如下: ①PC机向单片机发送命令打开或关闭指定LED灯 ②PC机向单片机发送命令启动或停 ...

  3. PC 机与单片机通信(RS232 协议)

    PC 机与单片机通信(RS232 协议) 1.单片机串口通信的应用 2.PC控制单片机IO口输出 3.单片机控制实训指导及综合应用实例 4.单片机给计算机发送数据 文章目录 PC 机与单片机通信(RS ...

  4. rs232pc通信软件源码c语言,PC机与单片机通信(RS232 协议)程序

    这有PC 机与单片机通信(RS232 协议)的资料希望对大家有用 [C语言源程序] #include"reg52.h" //包函8051 内部资源的定义 unsigned char ...

  5. 如何用python控制单片机通信_如何实现pc机对单片机的控制

    个人电脑控制单片机,主要通过以下步骤: 1)建立个人电脑和单片机的通信连接 普通的单片机通常有UART.SPI.IIC.USB等通信模块. 和电脑通信最常用的是UART,可以有两种方式和电脑建立连接( ...

  6. VC++6.0上实现PC机与单片机串口通信的PC端上位机软件

    1.简介 我做这个的主要原因是选了一个PC和单片机的全双工串口通信作为课设题目,单片机端是用汇编语言编程且要预先下载到板子里,关于这个这里我就不多说,主要说说怎么实现PC端的上位机软件.早知道要写软件 ...

  7. 电脑控制单片机LED

    PC控制单片机LED 电脑通过串口控制单片机LED亮灭 设计所需:Keil MDK5 软件 STM32单片机一块 文章目录 PC控制单片机LED 前言 一.功能要求 二.通讯方法 1.查询法 2.中断 ...

  8. 单片机与PC机一样都是计算机,51单片机与PC机通信资料

    <51单片机与PC机通信资料>由会员分享,可在线阅读,更多相关<51单片机与PC机通信资料(14页珍藏版)>请在人人文库网上搜索. 1.专业综合实习报告专 业: 电子信息工程 ...

  9. 微型计算机温度控制系统,单片机实现PC机温度控制系统方案

    描述 与传统的系统相比,该电路结构简单,测温精度高,温度控制误差小,并在不同时间常数下均可达到技术指标.文章同时给出了用串口调试精灵将PID控制器的输出和温度采样值显示在PC机上,以方便温度的监控的实 ...

最新文章

  1. 大家都能读懂的IT生活枕边书
  2. GDCM:gdcm::Defs的测试程序
  3. 我的软件工程课程目标
  4. Hello world cpp之旅 - 字符串(1)
  5. HDU1231 最大连续子序列【最大子段和】
  6. C# 使用同余代换简化多个大数相乘取模运算
  7. 【LeetCode】【字符串】题号:*14. 最长公共前缀
  8. 最大团问题回溯法求解
  9. 主机安全加固终端安全管理
  10. 联想笔记本windows10,点击蓝牙显示无法连接
  11. Docker安装Yapi
  12. 义乌义川机器人_义乌人文
  13. 正则表达式之数字验证
  14. php msf 环境要求,4.6 配置 · php-msf PHP微服务框架文档 · 看云
  15. 多个containers 共用一个pvc_长兴PVC废料回收一斤多少钱,ps废料回收
  16. CentOS命令行改色。
  17. c语言用二维数组查找负数,[抄道题] 在二维数组中找某数
  18. 【028】仿猫眼、淘票票的电影后台管理和售票系统系统(含后台管理)(含源码、数据库、运行教程)
  19. 如何清除木马--104种木马手工清除方法
  20. matlab实现Kmeans聚类

热门文章

  1. Android逆向-Xposed Hook基础 游戏
  2. ac自动机 匹配最长前缀_Aho Corasick自动机结合DoubleArrayTrie极速多模式匹配
  3. 绿姿明星慈善签售会,因为爱生日更精彩
  4. 图像如何存储在计算机中?
  5. VC++之MFC从零开始实现windows系统任务管理器(一、windows任务管理器界面的制作)
  6. 查找字符串中指定字符的位置c语言,C语言中查找字符在字符串中出现的位置的方法...
  7. Car-eye 智能车联网管理云平台报警业务处理
  8. KEIL MDK简介,如何安装KEIL MDK下载程序
  9. 说说工程量清单计价招标的必要性
  10. ReactiveCocoa实战: 模仿 花瓣,重写 LeanCloud Rest Api的iOS REST Client.