OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 23344|回复: 34

STM32与C51串口通信

[复制链接]

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-8-11
在线时间
15 小时
发表于 2012-8-11 11:24:28 | 显示全部楼层 |阅读模式
最近做了一个STM32与C51串口通信, 不用电平转换,就是用USART通信。今天试验8051到8051,8051与PC,STM32 到PC都能通信,波特率9600。但是用STM32与8051串口通信就不可以了。把SM32的变量i的数值传到80C51上并用LCD1602显示,请大家看是什么问题!要实现的通信结构图如下:


1、C51代码部分:
//C51串口通信 -双机通信
#include "usart.h"   

//发送数据
//input:k
//output:none
void Send(uchar k)
{
 SBUF=k;     //P3.1输出
 while(TI==0);
 TI=0; 
}

//定时器T1初始化
//input:none
//output:none
void T1_Init(void)
{
 TMOD=0x20; // 选择T1工作于方式2,选择可自动加载初值的8位计数器
 SCON=0x50; //工作方式1为8位UART
 CON=0x00;   //电源控制寄存器
 TH1=0xFD;      //9600bit/s
 TL1=0xFD;
 TR1=1;
}



#include <REGX52.H> 
#include "delay.h"
#include "key.h"
#include "lcd1602.h"
#include "usart.h"
 
#define uchar unsigned char
#define unit unsigned int

char R_data=0;
char code table_code[]={'0','1','2','3','4','5','6','7','8','9',\
      'A','B','C','D','E','F','H','I','J','K',\
      'L','N','M','O','P','Q','R','S','T','U',\
      'V','W','X','Y','Z','+','-','*','/','='};//转换成液晶显示的字符
       

//主程序                                        
int main()
{
 char i;     //按键值缓存区
    
 LCD_Init();  //液晶初始化
 T1_Init();   // 串口初始化


 while(1)
  {

 i=key_scanf();   //取得按键值
 LCD_Write_String(0,0,"T_DATA:") ;  //显示发关数据
 LCD_Write_String(0,1,"R_DATA:") ;  //显示接收数据 

    switch(i)
  {
  
  case 1: LCD_Write_Char(8,0,table_code[1]) ; Send(1);break;   //发送数据
  case 2: LCD_Write_Char(8,0,table_code[2]) ; Send(2);break;
  case 3: LCD_Write_Char(8,0,table_code[3]) ;Send(3);break;
  case 4: LCD_Write_Char(8,0,table_code[4]) ; Send(4);break;
  default: ; break;
  }

  if(RI==1)      //接收数据标志
   {
   R_data=SBUF;
   RI=0;
   }        

   LCD_Write_Char(8,1,table_code[R_data]) ; //显示接收数据  

 }


2、STM32代码部分:用原子哥的视频《入门(KEIL安装+JTAG调试+串口下载+新建工程)》

#include<stm32f10x_lib.h>
#include"sys.h"
#include"delay.h"
#include"usart.h"

int main(void)
{
 u8 i=0;
 Stm32_Clock_Init(9); //初始化时钟
 delay_init(72);   //初始化延时
 uart_init(72,9600); //初始化串口

///
 while(1)
  {
 printf("串口调试试验i自动加一\n");
 printf("i=%d\r\n",i);
   i++;
   delay_ms(5000);
   if(i==20)
      i=2;
  }
}



#include "sys.h"
#include "usart.h"
////////////////////////////////////////////////////////////////////////////////// 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//串口1初始化    
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/5/27
//版本:V1.3
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//********************************************************************************
//V1.3修改说明
//支持适应不同频率下的串口波特率设置.
//加入了对printf的支持
//增加了串口接收命令功能.
//修正了printf第一个字符丢失的bug
//////////////////////////////////////////////////////////////////////////////////   
 

//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB  
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                
struct __FILE
{
 int handle;
 /* Whatever you require here. If the only file you are using is */
 /* standard output using printf() for debugging, no file handling */
 /* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
 x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{     
 while((USART1->SR&0X40)==0);//循环发送,直到发送完毕  
 USART1->DR = (u8) ch;     
 return ch;
}
#endif
//end
//////////////////////////////////////////////////////////////////

#ifdef EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误    
u8 USART_RX_BUF[64];     //接收缓冲,最大64个字节.
//接收状态
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目
u8 USART_RX_STA=0;       //接收状态标记  
 
void USART1_IRQHandler(void)
{
 u8 res;    
 if(USART1->SR&(1<<5))//接收到数据
 { 
  res=USART1->DR;
  if((USART_RX_STA&0x80)==0)//接收未完成
  {
   if(USART_RX_STA&0x40)//接收到了0x0d
   {
    if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
    else USART_RX_STA|=0x80; //接收完成了
   }else //还没收到0X0D
   { 
    if(res==0x0d)USART_RX_STA|=0x40;
    else
    {
     USART_RX_BUF[USART_RX_STA&0X3F]=res;
     USART_RX_STA++;
     if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收  
    }  
   }
  }                  
 }             
}
#endif          
//初始化IO 串口1
//pclk2CLK2时钟频率(Mhz)
//bound:波特率
//CHECK OK
//091209
void uart_init(u32 pclk2,u32 bound)
{   
 float temp;
 u16 mantissa;
 u16 fraction;   
 temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
 mantissa=temp;     //得到整数部分
 fraction=(temp-mantissa)*16; //得到小数部分 
    mantissa<<=4;
 mantissa+=fraction;
 RCC->APB2ENR|=1<<2;   //使能PORTA口时钟 
 RCC->APB2ENR|=1<<14;  //使能串口时钟
 GPIOA->CRH&=0XFFFFF00F;
 GPIOA->CRH|=0X000008B0;//IO状态设置
   
 RCC->APB2RSTR|=1<<14;   //复位串口1
 RCC->APB2RSTR&=~(1<<14);//停止复位       
 //波特率设置
  USART1->BRR=mantissa; // 波特率设置 
 USART1->CR1|=0X200C;  //1位停止,无校验位.
#ifdef EN_USART1_RX    //如果使能了接收
 //使能接收中断
 USART1->CR1|=1<<8;    //PE中断使能
 USART1->CR1|=1<<5;    //接收缓冲区非空中断使能      
 MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
#endif
}

LCD1602显示双机通信(C51).zip

42.45 KB, 下载次数: 1176

MiniSTM32串器入门.zip

29.91 KB, 下载次数: 1274

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-8-11 12:21:35 | 显示全部楼层
是不是8051电平匹配的问题?
STM32输出高只有3.3V.
你试试8051发送数据到STM32,看看STM32接收是否正确.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

145

主题

477

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1264
金钱
1264
注册时间
2012-4-2
在线时间
69 小时
发表于 2012-8-11 20:47:35 | 显示全部楼层
8051输出高是5V   ?
那STM32输出可以设置为5V吗?
或者51是否又能设为3.3V ?
回复 支持 反对

使用道具 举报

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-8-11
在线时间
15 小时
 楼主| 发表于 2012-8-12 08:30:00 | 显示全部楼层
回复【2楼】正点原子:
--------------------------------
没注意到C51板晶振是12MHz,换成11.0592MHz,能正常相互通信了。谢谢原子哥!   
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2012-9-4
在线时间
0 小时
发表于 2012-11-19 13:37:59 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2012-8-6
在线时间
0 小时
发表于 2012-11-22 20:26:12 | 显示全部楼层
好东西啊  哈哈
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-3-5
在线时间
0 小时
发表于 2013-3-6 07:40:25 | 显示全部楼层
我用stm32 与51直连,stm32能发送数据,但接收不到51发来的收据,程序应该没问题,都能单独和串口助手通信,一直搞不明白怎么回事
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-3-6
在线时间
0 小时
发表于 2013-3-16 17:58:54 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,我想问下,就是扩展实验20的摄像头那个,怎么让Mini板TFTLCD边上出现一个截图的图标,可以通过触屏把图像保存在SD卡里呢,求指点
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-3-16 20:50:30 | 显示全部楼层
回复【9楼】cqrdyx:
---------------------------------
这个效果不好。
你必须不停的刷屏,刷屏的时候叠加一个图标进去,看起来那个图标会一闪一闪的(因为速度不够快)。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-3-6
在线时间
0 小时
发表于 2013-3-16 21:31:56 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
这倒也是,那能否这样,用一个按键实现把图像保存在SD卡里
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-3-16 21:46:51 | 显示全部楼层
回复【11楼】cqrdyx:
---------------------------------
我们的拍照就是这么做的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-3-6
在线时间
0 小时
发表于 2013-3-16 21:50:44 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
真的呀,Mini板有相应例程吗?琢磨好久了,呵呵
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-3-16 21:52:54 | 显示全部楼层
战舰板有,迷你板没。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-3-6
在线时间
0 小时
发表于 2013-3-16 22:16:59 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
这样哦,那Mini板要做哪些改进才能使用呀?
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-3-6
在线时间
0 小时
发表于 2013-3-16 23:18:38 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
这样哦,那Mini板要做哪些改进才能使用呀?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-3-17 17:54:38 | 显示全部楼层
关键在移植fatfs。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2012-11-8
在线时间
0 小时
发表于 2013-5-24 12:45:26 | 显示全部楼层
回复【8楼】年华同在:
---------------------------------
估计你在中间用到三极管电平转换电路了,也就是说 STM32的3V3-->三极管-->5V, C51的5V-->三极管-->3V3
如果是这么做的话,就会出问题

1.计算机串口通信的RS-232电平:用正负电压来表示逻辑状态.逻辑1= = -3V~-15V,逻辑0=+3~+15V。

(二)RS-232àTTL电平的转换原理

当PCTXD为-3~-15时显然Q4是处于截止状态的,RXD的电平与VCC相等的为+5V是逻辑1

当PCTXD为+3~+15V时显然Q4是处于导通状态的,RXD的电位为0是逻辑0

综上所述: 当PCTXD为-3~-15(RS-232)时转换后的TTL电平为+5V是逻辑1(TTL)

          当PCTXD为+3~+15V(RS-232)时转换后的TTL电平为0V是逻辑0(TTL)
回复 支持 反对

使用道具 举报

8

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2013-7-27
在线时间
0 小时
发表于 2013-7-30 18:48:27 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,他这个程序的发送变量 i 的代码在哪呢?是怎么发送的
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-7-30 21:44:30 | 显示全部楼层
回复【19楼】snailliu123:
---------------------------------
printf("i=%d\r\n",i);
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-5-31
在线时间
4 小时
发表于 2013-8-15 14:57:36 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2013-7-26
在线时间
0 小时
发表于 2013-8-15 22:04:50 | 显示全部楼层
请教一下楼主,STM32F103ZET6开发板如何与51开发板进行通信?
也许“贸——工——技”才是企业生存之道!
回复 支持 反对

使用道具 举报

94

主题

260

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-10-23
在线时间
48 小时
发表于 2014-7-24 22:22:11 | 显示全部楼层
回复【4楼】htc369:
---------------------------------
我的51也是12M,是因为这个原因不能与STM32串口通讯吗?试了好长时间通讯不了,纠结死了。
回复 支持 反对

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-4-12
在线时间
0 小时
发表于 2014-7-27 20:29:45 | 显示全部楼层
回复【4楼】htc369:
---------------------------------
什么意思??与晶振有关系吗???我也做过的,就是不能通信
回复 支持 反对

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-4-12
在线时间
0 小时
发表于 2014-7-27 20:47:17 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥:这是什么原因啊??电平不一致吗??
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-7-27 23:29:16 | 显示全部楼层
回复【25楼】dongxinwanwu:
---------------------------------
有可能.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

15

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2013-6-3
在线时间
1 小时
发表于 2014-8-8 08:56:48 | 显示全部楼层
LZ的这个程序里面好像什么都没有啊?
没有签名
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2014-11-13
在线时间
0 小时
发表于 2014-11-13 19:21:52 | 显示全部楼层
哥们你好,我最近也需要stm32和c51通信,和你这个很像。问你个问题哦?你这里51的代码好像一个sbit没有啊?我是初学者。。。嘿嘿。。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2014-11-13
在线时间
0 小时
发表于 2014-11-13 20:48:27 | 显示全部楼层
原来是汇编语言的。。。
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2014-2-4
在线时间
71 小时
发表于 2014-12-6 16:13:23 | 显示全部楼层
回复【8楼】年华同在:
---------------------------------
我也遇到了同样的问题,搞了好久都不行,请问你解决了没有
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-9-17
在线时间
0 小时
发表于 2015-11-21 21:00:30 | 显示全部楼层
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复【30楼】hu9977:
---------------------------------
回复 支持 反对

使用道具 举报

20

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-11-11
在线时间
22 小时
发表于 2016-3-20 00:57:30 | 显示全部楼层
正点原子 发表于 2012-8-11 12:21
是不是8051电平匹配的问题?
STM32输出高只有3.3V.
你试试8051发送数据到STM32,看看STM32接收是否正确.

我现在也遇到这个情况不知道各位大升有没有找到原因?
寻找远方的自己,不断的学习。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-4-30
在线时间
0 小时
发表于 2016-4-30 15:41:13 | 显示全部楼层
请问你用的单片机是AT89C51和STM32吗?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-9-20
在线时间
0 小时
发表于 2016-9-20 22:59:26 | 显示全部楼层
今天也碰到了类似的问题,最终解决了,特地注册了个账号过来说一下。

我的情况是stm32F103和C8051F410通讯,两端用的都是485芯片。一开始出现的情况是C8051和电脑用485转串口的数据线可以通讯,STM32F103和电脑用该数据线也可以通讯(这里的通讯什么意思呢,就是没有乱码,所有的数据严丝合缝,发什么就接收到什么)。但是当直接把485的AA,BB连接起来后,就不能通讯了。(后来发现实际只是数据乱码,帧头帧尾检查不出了,所以以为通讯发生了异常。)

但两端都是同型号的485,为什么会发生这种现象呢?(其实这个我也 不知道)

看了上文,首先怀疑是电平的问题,我用示波器测试后。C8051F410通过串口发出的,是正负电平(就是大于0表示高电平1,小于0表示低电平0,幅值大概是正负5V),而电脑通过数据线发向STM32的,低电平实际上电压幅值在0.9V,高电平在5V左右),这就C8051F410和STM32两端485发送接收乱码的原因,于是,我把电路改了,C8051端的485输出端一端直接拉低,在用杜邦线连接两端485的时候,STM32和C51就通讯就正常了。

回复 支持 反对

使用道具 举报

5

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2016-10-20
在线时间
42 小时
发表于 2017-8-4 17:38:49 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2019-3-27
在线时间
51 小时
发表于 2019-12-27 16:55:45 | 显示全部楼层
热舞我微软 微软委任为
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 22:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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