单片机和微机通信的电气标准要一致,微机串口一般是RS232电气标准,所以要加电平转换芯片,大多用MAX232,一般单片机实验板上都提供这样的标准串口。
要分别编写上位机和下位机软件程序,单片机程序参照例程、教科书进行编写;上位机微机可采用VB,组态软件,Labview等软件编写,一般若是简单的通信,上位机程序编写很简单,例如VB中学会使用mscomm控件,有VB最基础知识的一天就能学会。
大可以没有单片机,没有MAX232,没有串行接口这些硬件就可以实现学习并掌握单片机与微机之间的串口通信。proteus可以仿真单片机,也是主流软件。
如今的笔记本电脑几乎都没有保留串口,而用USB接口取而代之,不过没关系,有了虚拟串口和串口调试助手,这些都解决了。你可以搜索一下虚拟串口,真的很不错的。
要求用什么语言?------------------------------
网友“星心晨梦”的回答,是可以满足题目要求的。
我实验了,是成功的,没有任何错误。
楼主应该检查自己的电路、串口设置等等。
------------------------------
网友“星心晨梦”的回答,篇幅稍稍长了一些。
缩减一半就可以正常工作了,可读性更好一些。
建议看看下面的。
------------------------------
#include <AT89X51.h>
#include <intrins.h>
#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就发送.
}
}
//---------------------------------------------------
/*采用11.0592MHZ晶振,波特率9600*/#include <reg51.h>
#include <intrins.h>
char temp
bit flag
void ser() interrupt 4
{
RI=0
temp=SBUF
flag=1
}
void serinit()
{
TMOD=0x20
TH1=0xfd
TL1=0xfd //设置波特率9600
SM0=0
SM1=1
REN=1
TR1=1
ES=1
EA=1
}
void main()
{
serinit()
while(1)
{
if(flag==1) // 判断是否完成接收
{
flag=0
ES=0 // 串口中断关闭
SBUF=temp // 将原先发送的值给缓存器(接发都是同一个,但意义不一样)
while(!TI)//判断是否发送完成
TI=0 // 是则硬件清0
ES=1// 再次打开串口中断
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)