C51单片机与PC串口通信的单片机部分程序

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-06-02
求一个C51单片机与PC机串口通信的程序

#include
unsigned char flag,a;
void main()
{

TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
while(1)
{
/* if(RI==1)
{
RI=0;
P1=SBUF;
}*/
if(flag==1)
{
ES=0;
flag=0;
SBUF='1';//28;
while(!TI);
TI=0;
SBUF='2';//28;
while(!TI);
TI=0;
SBUF='3';//28;
while(!TI);
SBUF='4';//28;
while(!TI);
TI=0;
ES=1;
}
}
}

void ser() interrupt 4
{
RI=0;
// P1=SBUF;
a=SBUF;
flag=1;
}

要求用什么语言?
------------------------------
网友“星心晨梦”的回答,是可以满足题目要求的。
我实验了,是成功的,没有任何错误。
楼主应该检查自己的电路、串口设置等等。
------------------------------
网友“星心晨梦”的回答,篇幅稍稍长了一些。
缩减一半就可以正常工作了,可读性更好一些。
建议看看下面的。
------------------------------
#include
#include
#define uchar unsigned char
#define uint unsigned int
//---------------------------------------------------
uchar idata trdata1[] = {
'W','E','L','C','O','M','E',' ','T','O',' ','C','H','I','N','A','!',0x0d,0x0a,0x00};
uchar idata trdata2[] = {
'M','Y',' ','N','A','M','E',' ','I','S',' ','L','I','M','I','N','G',0x0d,0x0a,0x00};
uchar idata trdata3[] = {
'Y','I','N','G','Y','O','N','G','K','E','X','U','E','X','U','E','Y','U','A','N',0x0d,0x0a,0x00};
uchar RxBuf[5], Rx_p, Rx_i, TX_p, Tx_i;
//---------------------------------------------------
void UART_Init(void) //串口初始化
{
PCON = 0x00;
SCON = 0x50; //串口工作方式为1,允许接收.
TMOD = 0x20; // T1 定时方式2
TH1 = 0xfd; //波特率 9600bps @ fosc = 11.0592MHz
TL1 = 0xfd;
TR1 = 1; //启动T1
ES = 1; //开串口中断.
EA = 1; //开总中断.
}
//---------------------------------------------------
void main()
{
UART_Init();
Rx_p = 0;
Rx_p = 2;
while(1) {
if (Rx_p != 0) {
TX_p = Rx_p;//字符串1 2 3
Tx_i = 0; //字符指针.
Rx_p = 0; //清零.
Rx_i = 0;
TI = 1; //启动发送中断.
} }
}
//---------------------------------------------------
void Uart_INT(void) interrupt 4 //串口中断函数
{
uchar Tcv = 0;
if(RI) { //接收?.
RI = 0; //标志位清零.
RxBuf[Rx_i] = SBUF;
if((RxBuf[Rx_i - 1] == 'g') && (RxBuf[Rx_i] == 'o')) Rx_p = 1;
if((RxBuf[Rx_i - 2] == 'w') && (RxBuf[Rx_i - 1] == 'h') && (RxBuf[Rx_i] == 'o')) Rx_p = 2;
if((RxBuf[Rx_i - 3] == 'h') && (RxBuf[Rx_i - 2] == 'o') && (RxBuf[Rx_i - 1] == 'm') && (RxBuf[Rx_i] == 'e')) Rx_p = 3;
P1 = Rx_p; //在P1显示收到的信息.
Rx_i++;
Rx_i %= 5;
}
else {
TI = 0;
if (TX_p == 1) Tcv = trdata1[Tx_i]; //取来待发字符.
if (TX_p == 2) Tcv = trdata2[Tx_i];
if (TX_p == 3) Tcv = trdata3[Tx_i];
if (Tcv != 0) {SBUF = Tcv; Tx_i++;} //不是0就发送.
}
}
//---------------------------------------------------

下面这个程序没有什么实际价值,只用于演示串口程序的编写

注意波特率是9600
功能:电脑通过串口给单片机发一个字节,单片机收到后又给电脑发回去

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

uint temp;
bit flag;
void init_ser1();
main()
{
init_ser1();
while(1)
{
if(RI==1)
{
P1=SBUF;
RI=0;
}
if(flag==1)
{
ES=0;//暂时关闭接收
flag=0;
SBUF=temp;
while(!TI);//等待发送完毕
TI=0;
ES=1;
}
}
}
/****************************************
中断
****************************************/
void sel() interrupt 4
{
RI=0;
P1=SBUF;
temp=SBUF;
flag=1;
}
/****************************************
初始化
****************************************/
void init_ser1()
{

REN=1;
SM0=0;
SM1=1;
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
EA=1;
TR1=1;
ES=1;
}

/*单片机向计算机发送数据*/
//======声明======
#include<reg52.h>
unsigned char Read_Keyboard();
void RS232_SendData(unsigned char Sdata);
//======延迟函数======
void delay(unsigned int t)
{
for(;t>0;t--); //延迟循环
}
//======UART初始化函数=====
void RS232_Init()
{
SCON=0x50; //0101 0000 UART工作模式1,REN=1(本位为串行接收启用位1:开始接收 0:停止接收)
TMOD=0x20; //0010 0000 Timer1 工作模式2
PCON=0x80; //SMOD1=1
TH1=0xfa; //波特率9600 bps at 11.0592MHZ
TL1=0xfa; //波特率9600 bps at 11.0592MHZ
TR1=1;
}
//======主函数============
void main()
{
unsigned char Keyboard_Status=0xff; //定义按键
RS232_Init(); // 初始化UART
while(1)
{
Keyboard_Status=Read_Keyboard()|0xf0; //读取按键值(屏蔽高4位)
//************主程序部分***********//
switch(Keyboard_Status)
{
case ~0x01:RS232_SendData('A');break;
case ~0x02:RS232_SendData('B');break;
case ~0x04:RS232_SendData('C');break;
case ~0x08:RS232_SendData('D');break;
default:RS232_SendData('X');break;
}
}
}
//===========发送数据函数========
void RS232_SendData(unsigned char Sdata)
{
SBUF=Sdata; //发送数据
while(TI==0); //等待发送结束
TI=0; //清除发送结束标志
}
//========读取按键函数==========
unsigned char Read_Keyboard()
{
unsigned char Keys_Value; //定义按键变量
unsigned char Keys_Temp;
do
{
P1=0xff; //P2口置高,准备读取按键状态
Keys_Temp=P1; //读取按键状态
delay(150); //消抖延时
P1=0xff; //P2口置高,准备读取按键状态
Keys_Value=P1; //读取按键状态
}
while(Keys_Value!=Keys_Temp); //如果读状态不一致,则重复读取键值
return Keys_Value; //返回按键状态值
}

你的C51是什么C51噢? 一般的STC89c51,Atmelc51这些串口程序都不用设计到协议的,只要设置好相应的波特率等数据就能通过串口助手进行基本的收发了

你找了很多程序都 没运行起来,估计不是程序问题了
试试检查你的虚拟串口设置、波特率设置还有proteus里的COMPIM设置。

  • 89C51系列单片机串口通信的四种方式极其特点
    答:均为异步通信方式.89C51单片机与89C51通过什么器件进行串口通信连接 串口可以一对多,主从方式,串口有一位用作识别码,主机先要发送接受数据的从机地址,只有地址相符,从机才能使能接受,然后主机发送 求助C51单片机串口通信的问题! 把:if(a==1) 改为:if(a==0x31) 试试。
  • 51单片机与PC进行串口通信,用串口调试工具显示数据没数据。。。_百度知...
    答:首先检测你的硬件电路。方法是,拔掉你的单片机,把RXD和TXD脚短路。然后在串口调试助手里面,选任意波特率发送任意字符,如果收到的是发送的内容,则能肯定MAX232和RS-232之间连接正确。接下来就要检查你的程序了 最容易出问题的就是波特率了。如果你用12M的晶振,那么,最好设置波特率为1200 或 2400。
  • 51单片机与PC机之间的硬件如何串口连接
    答:单片机通过TXD和RXD两条线 连接MAX232芯片后,转换电平,连接PC串口,一般是2、3脚,5脚是地线。一共三根线。单片机的TXD接电脑的RXD,单片机的RXD接电脑的TXD。地线接地线。VB中要用MSCOMM控件,设置相同的波特率,起始、结束位、校验位,数据位等。VB的MSCOMM控件设置好端口号,然后PORTOPEN= true 就...
  • 求51单片机与PC机串口通信硬件专家!!!
    答:1。串口RS232连接是否有问题,9 芯接插件 的连接问题,(一般只要连接 2 、3 、5 脚)2。供电电源 输出电流 是否能 达到你需要的 供电能力,一般4个数码管 有 300 mA 足够了。3。STC 单片机、串口通信 与 下载程序 的硬件 可以用一样的,图片用的 USB转串口 线,单片机上 用 rs232 、只要...
  • 51单片机与PC机之间的硬件如何串口连接?
    答:大可以没有单片机,没有MAX232,没有串行接口这些硬件就可以实现学习并掌握单片机与微机之间的串口通信。proteus可以仿真单片机,也是主流软件。如今的笔记本电脑几乎都没有保留串口,而用USB接口取而代之,不过没关系,有了虚拟串口和串口调试助手,这些都解决了。你可以搜索一下虚拟串口,真的很不错的。
  • 电脑上RS232跟单片机怎么连接
    答:因此,单片机系统与电脑的RS-232接口通信,必须把单片机的信号电平(TTL电平)转换成计算机的RS-232C电平(或者反过来把计算机的RS-232C电平转换成单片机的TTL电平),才能成功通讯。本方案使用电平转换芯片MAX232芯片来实现电平转换(连接图中间的芯片)。4 (51)单片机使用RXD和TXD引脚执行串口数据输入/输出...
  • 51系列双串口的单片机有哪些,两个串口要接232与PC通信,求推荐
    答:新唐的77e58双串口单片机,建议选arm m0的处理器,一般都是2个以上串口,而且价格比较便宜。处理速度比单片机快,也是未来的趋势。
  • 51单片机与PC串口通信程序,求指导
    答:至于你的初始化,我实在不高兴查资料比对了。就麻烦你自己再检查检查是不是初始化正确了。我还是不小心查了下,我认为TMOD应该设置成0x21,呃,貌似你没错,但是最好直接赋值,像你上面那样可能不会错但是不保险。总之就按你下面那个初始化程序应该就行,而且你不是说你的单片机只发不收么(见你对...
  • 51单片机实战:与计算机异步串行通信
    答:电平之前在文章 《51单片机实战:液晶显示器のLCD1602》 中介绍过,那里只说了TTL,本例中由于要和计算机打交道,所以多了一种电平:RS-232C 在单片机中是TTL,电脑那边传出和接收都是RS232,所以两种电平需要作转换。当当当!它就是干这活的。举个栗子,比如单片机从T1IN输入TTL电平,转换好的RS232...
  • 51单片机与PC机串行通信
    答:做双方通信,你要确定以下内容:1、电路是否正常工作 2、波特率、起始位、停止位是否一致 3、用上位机小软件时,是否选择是字符发送接收还是十六进制数发送接收。串口中断程序中,不要加入太多程序,建议:串口中断程序中,写,判断是接收中断还是发送中断,是发送中断,执行空语句,是接收中断,接收到什么...