找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

用串口给单片机传数据(最简单)

[复制链接]
admin 发表于 2012-9-2 13:15:01 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
/*******************************************************************************
* 标题: RS485串口通信试验(接受与发送) *
* *
* 1.通过本例程了解串口的基本原理及使用 ,理解并掌握对串口进行初始化 *
* *
* 2.请使用串口调试助手(Baud 4800、数据位8、停止位1、效验位无)做为上位机(发送)数据和(接受)数据,
* 请在字符串输入框中输入字符和数字(HEX),按发送按钮。观看接受窗显示情况.也可以用自动循环发送。
*
* 3.试验RS485需要用RS232转485的转换头。RS485的A对应串口头的9针 B对应4针.接法大家可以参考原理图。
* *
* 请学员认真消化本例程,学会用C语言操作串口和485的实现 *
********************************************************************************/
#include <REG52.H>
#include <stdio.h>
sbit RS485E=P3^7; //定义485的使能脚
sbit LED0 = P2^0 ; //定义P2.0的管脚为LED0
sbit LED1 = P2^1 ; //定义P2.1的管脚为LED1
sbit LED2 = P2^2 ; //定义P2.0的管脚为LED0
sbit LED3 = P2^3 ; //定义P2.1的管脚为LED1
sbit LED4 = P2^4 ; //定义P2.0的管脚为LED0
sbit LED5 = P2^5 ; //定义P2.1的管脚为LED1
sbit LED6 = P2^6 ; //定义P2.0的管脚为LED0
sbit LED7 = P2^7 ; //定义P2.1的管脚为LED1
bit SendFlag;
unsigned int ReData,SenData;
/**************************************
延时程序
**************************************/
void delay(unsigned char i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void setl()
{
LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;
}
void main (void) {

SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80;
//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无 (11.0592)
TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断

// IE = 0x0;


setl();
while(1)
{
if (SendFlag==1) // max485(半双工通信) RE/DE定义 RE=0为接受状态 DE=1为发送状态(参考MAX485芯片管脚)
{
RS485E=1; // RS5485E=0为接收状态 RS5485E=1为发送状态
SBUF=SenData; //发送数据

delay(50);
}
else
{
RS485E=0; //接收状态
}

}

}
/****************************************************
串口中断程序
******************************************************/
void ser_int (void) interrupt 4 using 1
{
if(TI == 1)
{
TI = 0;
SendFlag = 0;
}
if(RI == 1) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
ReData = SBUF-48; //SUBF接受/发送缓冲器
switch(ReData)
{
case 0x01: LED0= 1;break;
case 0x02: LED1= 1;break;
case 0x03: LED2= 1;break;
case 0x04: LED3= 1;break;
case 0x05: LED4= 1;break;
case 0x06: LED5= 1;break;
case 0x07: LED6= 1;break;
case 0x08: LED7= 1;break;
default:setl();
}
SenData=ReData+48;
SendFlag = 1;

}
}

//------------------------------------------------------------------------------------------------
/*
这样我们用com口给单片机发1则p2端口上第一个灯灭,发送2则p2上第二个灯灭,..............发送8则p2口上第8个灯灭,如果发送的不是1-8则全部灯亮
我刚学单片机,在这里班门弄斧了。今后向大家好好学习。

*/
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-25 01:01 , Processed in 0.062923 second(s), 11 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表