C51单片机与PC串口通信的单片机部分程序
最近刚开始接触单片机程序,要求设计基于RS-232的微机与单片机通信的数据结构并通过借助于C51编程工具实现单片机部分的串口通信程序。不要求完成完整的单片机程序,只需能完...
最近刚开始接触单片机程序,要求设计基于RS-232的微机与单片机通信的数据结构并通过借助于C51编程工具实现单片机部分的串口通信程序。不要求完成完整的单片机程序,只需能完成与微机的双向通信即可。
调试工具是keilc+串口调试助手,还有proteus。由于条件有限,只能采用模拟调试的方式。找了很多源程序都没运行起来。
希望提供一个可运行的单片机部分的发送接受和中断程序供参考,只要能表达出基本的串口通信功能即可。不胜感谢! 展开
调试工具是keilc+串口调试助手,还有proteus。由于条件有限,只能采用模拟调试的方式。找了很多源程序都没运行起来。
希望提供一个可运行的单片机部分的发送接受和中断程序供参考,只要能表达出基本的串口通信功能即可。不胜感谢! 展开
4个回答
展开全部
下面这个程序没有什么实际价值,只用于演示串口程序的编写
注意波特率是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;
}
注意波特率是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; //返回按键状态值
}
//======声明======
#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设置。
试试检查你的虚拟串口设置、波特率设置还有proteus里的COMPIM设置。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询