求单片机串行口通信的发送和接收程序

zhangyiheng 2005-03-08 02:42:32
要求用挂仿真器的单片机发送,用keil c51语言写
电脑com1口接收用turbo c2.0写
我自己写了一个,但不知道哪里错了,希望能指点一下,或直接帖一个新的代码上来
/*微机串行口发送接收程序,用TURBO C编译*/
#include<bios.h>
#include<stdio.h>

#define PROTOCAL 0xe3 /*定义RS232通信协议,波特率*/
/*bioscom控制函数的工作命令*/
#define PROT 0
#define TX 1
#define RX 2
#define STATUS 3
int port=0; /*系统通信端口使用COM1*/

void showby(unsigned char c)
{
unsigned int a=0x80;
int i,j;
int b=c;
for(i=8;i>0;i--)
{
j=a&b;
if(j==0)
printf("0");
else
printf("1");
a=a>>1;
}
printf("\n");
}
main()
{
int s;
unsigned char c;
/*设定RS232通信协议*/
showby('1');
bioscom(PROT,PROTOCAL,port);
clrscr();
puts("--------------------");
puts("test.ext PC RS232 COM1 <9,600 N 8 1>");
puts("--------------------");

while(1)
{
s=bioscom(STATUS,0,port)&0x100;
if(s)
{
c=bioscom(RX,0,port);
showby(c);
printf("%c",c); /*显示在屏幕上*/
}
if(kbhit())
{
c=getch(); /*读取按键*/
switch(c)
{
case ' ': /*空白键清屏*/
clrscr();
puts("--------------------");
puts("test.ext PC RS232 COM1 <9,600 N 8 1>");
puts("--------------------");
break;
case 27: /*ESC*/
exit(0);
break;
default:
printf("%c",c);
bioscom(TX,c,port);
break;
}
}
}
}
...全文
2003 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fei180 2005-06-04
  • 打赏
  • 举报
回复
如果接收的是乱码,那就是波特率设置发面的问题!
单片机方面的波特率有计算公式的,和TCON SMOD PCON TH1有关。
boiscom里设置参考端口设置。
fei180 2005-06-04
  • 打赏
  • 举报
回复
如果接收的是乱码,那就是波特率设置发面的问题!
单片机方面的波特率有计算公式的,和TCON SMOD PCON TH1
fei180 2005-06-04
  • 打赏
  • 举报
回复
我这几天就是做个这样的项目!
PC发个建立连接的开始字符串(2个字,比如“ok”)给51,51收到后,确定是ok后,在发个确定字符串(也是2个字母)给pc,pc收到确定后,开始接收51的发送信息。
jingping1024 2005-06-04
  • 打赏
  • 举报
回复
我们也急用啊!@@@
jingping1024 2005-06-04
  • 打赏
  • 举报
回复
我们也要要写这么一个程序的,不过我们是要用写的,是不是用VB写会比较简单呢???
cfstock 2005-03-15
  • 打赏
  • 举报
回复


SCON = 0x50; //这才是模式1 ,SM0 = 0,SM1 = 1,而不是0XD8
TMOD = 0x20;
TH1 = 0xfd;
TR1 = 1;
TI = 1;
这是11.0592MHZ晶体初始化串口程序,改之试试吧~~
cfstock 2005-03-15
  • 打赏
  • 举报
回复
你的C51程序有问题,VC端是9600,N,8,1,可你的51串口寄存器设置的好像不是9600,N,8,1

先问一下你的晶振是什么频率的? 是不是 11.0592MHZ?这个很重要的
cfstock 2005-03-15
  • 打赏
  • 举报
回复
呵呵,我正做一个项目,计算机端是BCB5,单片机是8031 串口,我把部分代码给你贴上点儿吧,你的错误回头我再看
zhangyiheng 2005-03-15
  • 打赏
  • 举报
回复
晕啊,这些程序是不行的,看在我发了这么多的面子上,能不能发一个行的出来?
yaterman2 2005-03-15
  • 打赏
  • 举报
回复
wo up
wxdspy 2005-03-14
  • 打赏
  • 举报
回复
好,是在太好
zhangyiheng 2005-03-14
  • 打赏
  • 举报
回复
给点反应好不好?
三炮 2005-03-10
  • 打赏
  • 举报
回复
gz 马上我也要用c写串口通信程序的单片机部分!
zhangyiheng 2005-03-10
  • 打赏
  • 举报
回复
我试过用VC和turbo c接收,本来应该是收到“11111”的,但都只接收到一串乱码,可能是通信协议不对。但又不知道是哪里不对。
VC部分程序如下
BOOL CSpcDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
//串口初始化
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(1); //选择com1
if( !m_ctrlComm.GetPortOpen())
{
m_ctrlComm.SetPortOpen(TRUE);//打开串口
}
else
{
AfxMessageBox("cannot open serial port");
}
m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
//m_ctrlComm.SetInputModel(1);
m_ctrlComm.SetInputMode(1);//1:表示以二进制方式检取数据
m_ctrlComm.SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
}
gRempCH_eNter 2005-03-09
  • 打赏
  • 举报
回复
先给你贴个用AVR的单片机(RISC)写的一段串口通讯中断服务程序吧,不知道你是否看得懂。你再讲讲你的错误是什么!

COMM_RX:
IN R16, SREG
PUSH R16

IN R17, USR
ANDI R17, 0X18 ;check the OR(OverRun) bit and FE(framing error) bit
BRNE COMM_RX_END
IN R16, UDR
SBIS UCR, 1 ;is the ID frame?
RJMP DATA_FRAME
ID_FRAME:
CPI R16, DEVICE_ID
BRNE COMM_RX_END
LDI IDOK, 1
RESET_RX_PTR ;initiate the RX_PTR
SBI UCR, 0 ;set TX8
OUT UDR, R16
RJMP COMM_RX_END
DATA_FRAME:
CPI IDOK, 1
BRNE COMM_RX_END
MOV ZL, RX_PTR
ST Z+, R16 ;store the data in buf
MOV RX_PTR, ZL
CPI ZL, RX_BUF+3 ;is complete?
BRNE COMM_RX_END
RESET_RX_PTR
LDI RX_OVER, 1
LDI IDOK, 0
COMM_RX_END:
POP R16
OUT SREG, R16
RETI
icesnows 2005-03-09
  • 打赏
  • 举报
回复
帮你顶一顶吧。先讲一下什么错误
zhangyiheng 2005-03-08
  • 打赏
  • 举报
回复
//串行口单片机发送程序
#include<reg51.h>
#define BYTE unsigned char
#define WORD unsigned int
#define hi 0xdc
#define lo 0x16
BYTE idata txdata[7]={"11111\n"};
char ab;



void main()
{
BYTE i;
WORD j;
//设置波特率为9600,通过设置定时器1的工作方式和初始值
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
SCON=0xd8; //设置串行口工作方式
PCON=0x00; //模式1
TR1=1;
while(1)
{
i=0;
//发送字符串
while(txdata[i])
{
SBUF=txdata[i];
while(TI==0);
TI=0;
i++;

}
for(j=0;j<10000;j++)
{P1=0;}
//延时
}
}

27,370

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧