找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 836|回复: 6
打印 上一主题 下一主题
收起左侧

STC89C52单片机串口通信keil代码烧录到单片机上不能发送,Protues上仿真没有问题

[复制链接]
跳转到指定楼层
楼主
ID:1102910 发表于 2023-12-6 15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg52.h"               
#include <stdio.h>
#include <oled.h>        
sbit SDA = P2 ^ 1;
sbit SCL = P2 ^ 0;



char recive=0;
unsigned char a;


//========================================================
//串口通信初始化
void UartInit(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;               
        TMOD &= 0x0F;               
        TMOD |= 0x20;               
        TL1 = 0xFD;               
        TH1 = 0xFD;               
        ET1 = 0;               
        TR1 = 1;               
        ES = 1;
        EA = 1;
}
//========================================================

void SendByte (unsigned char dat)  //发送一个字符
{
        SBUF = dat;
        while(!TI);
        TI = 0;
        }
//===========================================================
char putchar(char c)  //获取一个字符
{
         SendByte(c);
        return c;
}
//==============================================================
//延迟函2,ms=1,延迟1ms
void delay(unsigned int ms)
{
        unsigned char j = 0;
        while (ms--)
                for (j = 0; j < 254; j++);
}
//==============================================================
//OLED显示函数
void OLED_display()
{
        OLED_Init();      //初始化OLED
        OLED_Clear();             //OLED清屏
        
  OLED_ShowChar(5,5,'A',8);
        OLED_ShowString(1,2,"Hello World",8);
}               
//=================================================================

void UART() interrupt 4
{
        if(RI == 1)
        {
                 
                a = SBUF;
                recive=2;
                switch(recive)
                {
                        case 0:printf("停止\r\n");break;
                        case 1:printf("3\r\n");break;
                        case 2:printf("2\r\n");break;
                        case 3:printf("1\r\n");break;
                        default: break;
                }
                RI=0;
        }        
}
//====================================================================
//主程序        
void main()
{

        UartInit();
        //printf("Start now!\r\n");
        OLED_display();
        while(1)
        {
               
        }
        }
        
//=================================================================

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:458247 发表于 2023-12-6 16:17 | 只看该作者
检查晶振频率
回复

使用道具 举报

板凳
ID:277550 发表于 2023-12-6 16:23 | 只看该作者

可以按STC下载工具中的串口例子,来抄一个。


~~~~~
回复

使用道具 举报

地板
ID:1102910 发表于 2023-12-6 16:42 | 只看该作者
解决了,是“文件大小超出程序区范围,超出部分已被自动移到EEPROM区”删了一些定义就好了
回复

使用道具 举报

5#
ID:1102910 发表于 2023-12-6 16:43 | 只看该作者
devcang 发表于 2023-12-6 16:23
可以按STC下载工具中的串口例子,来抄一个。

谢谢,就是这样试了试才发现,然后解决了
回复

使用道具 举报

6#
ID:1103003 发表于 2023-12-6 23:16 | 只看该作者
定义有问题吧 删删看
回复

使用道具 举报

7#
ID:1037692 发表于 2023-12-7 12:04 | 只看该作者
这种情况可能是由于单片机的硬件连接问题或者软件配置问题导致的。首先,确保单片机的串口引脚连接正确,并且电平转换电路(如果有的话)也正确连接。然后,检查keil代码中的串口配置是否正确,包括波特率、数据位、停止位和校验位等参数。另外,还需要确保程序中的发送函数调用正确,并且发送的数据格式符合接收端的要求。

如果以上步骤都没有解决问题,可以尝试使用示波器或者逻辑分析仪来监测串口信号,以确定是否有数据发送出去。另外,还可以尝试更换单片机或者调整串口配置参数来排除硬件问题。

最后,如果以上方法都无法解决问题,可以尝试在单片机上添加调试输出功能,通过串口或者其他方式输出调试信息,帮助定位问题所在。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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