找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我串口程序把我搞死了,只希望大家帮忙分析要,换了3快开发板了。

[复制链接]
跳转到指定楼层
楼主
我目地是比如输入123456789 返回123456789 就是输入什么返回什么。我使用ISIS仿真 程序没有问题,把程序烧入单片机就不行 我拿了3快51单片机的开发板来测试就是不行,人都急死了,最基本的都出问题实在没有办法玩下再学。找不到问题点。希望大家帮帮我。或者把我程序烧你们51里面去实际测试看看。我想知道到底是我程序还是我设备哪里出问题了,按理不可能三台开发板都出问题
#include <reg52.h>
#define uint unsigned int
int a;
uint flag;
void uart_init();
void main()
{
    uart_init();
    while(1)
    {
        if(flag==1) // 如果收到数据
        {
            ES=0; //关闭串口中断
            flag=0; //标志位清零
            SBUF=a; //将收到的数据发送至缓冲区
            while(!TI); //等待数据发送结束
            TI=0; // 将发送结束标志清零
            ES=1; // 使能串口中断
        }
    }
}
void serial() interrupt 4   // 串口中断服务函数
{
    a=SBUF; // 读出接收到的数据
    RI=0; // 清零接收标志位
    flag=1; //标志位
}
void uart_init()
{
    TMOD=0x20; // 设置定时器1 为方式2
    TH1=0xfd;  //装入初值 11.0592
    TL1=0xfd;
    TR1=1; //启动定时器1
    SM0=0;
    SM1=1; //设置串口为方式1
    REN=1;  // 接受使能
    EA=1; // 打开总中断开关
    ES=1; // 打开串口中断开关
}

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

使用道具 举报

沙发
ID:138419 发表于 2016-9-27 23:28 | 只看该作者
这样是不是两边在无限循环?
回复

使用道具 举报

板凳
ID:140696 发表于 2016-9-27 23:59 | 只看该作者
对,一直在收发
回复

使用道具 举报

地板
ID:140371 发表于 2016-9-28 05:42 | 只看该作者
中斷函數:
回复

使用道具 举报

5#
ID:140371 发表于 2016-9-28 05:42 | 只看该作者
void serial() interrupt 4   // 串口中断服务函数 {      a=SBUF; // 读出接收到的数据     RI=0; // 清零接收标志位      flag=1; //标志位 }
回复

使用道具 举报

6#
ID:140371 发表于 2016-9-28 05:50 | 只看该作者
一直在收发的...原因是當接收到第一個字組,啟動串列傳輸字組 ,當傳輸字組完成後又產生中斷的條件,又中斷...因此程式進入無窮循環...
回复

使用道具 举报

7#
ID:140371 发表于 2016-9-28 06:08 | 只看该作者
首先說明串列中斷函數的特性:當 TI=1 或 RI=1 時皆會進入中斷服務函數 一直在收發的原因在於:發送完成也會產生中斷 在中斷服務函數加個判斷 void serial() interrupt 4   // 串口中断服务函数 {  if(RI)    {     a=SBUF; // 读出接收到的数据     RI=0; // 清零接收标志位      flag=1; //标志位    }         }
回复

使用道具 举报

8#
ID:57657 发表于 2016-9-28 07:12 | 只看该作者
用示波器或逻辑分析仪检测串口信号波形是否正常即可。
硬件串口有问题的话试试软件模拟串口,适用于任何型号的单片机。
回复

使用道具 举报

9#
ID:140371 发表于 2016-9-28 07:41 | 只看该作者
首先說明串列中斷函數的特性:當 TI=1 或 RI=1 時皆會進入中斷服務函數 一直在收發的原因在於:發送完成也會產生中斷 在中斷服務函數加個判斷 void serial() interrupt 4   // 串口中断服务函数 {  if(RI)    {     a=SBUF; // 读出接收到的数据     RI=0; // 清零接收标志位      flag=1; //标志位    }         }

评分

参与人数 1黑币 +60 收起 理由
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

10#
ID:140371 发表于 2016-9-28 07:43 | 只看该作者
a0931727149 发表于 2016-9-28 07:41
首先說明串列中斷函數的特性:當 TI=1 或 RI=1 時皆會進入中斷服務函數 一直在收發的原因在於:發送完成也會 ...

首先說明串列中斷函數的特性:當 TI=1 或 RI=1 時皆會進入中斷服務函數

而一直在收發的原因在於:發送完成也會產生中斷
在中斷服務函數加個判斷
void serial() interrupt 4   // 串口中断服务函数
{  if(RI)
   {
    a=SBUF; // 读出接收到的数据
    RI=0; // 清零接收标志位
    flag=1; //标志位
   }       
}
回复

使用道具 举报

11#
ID:111634 发表于 2016-9-28 08:38 | 只看该作者
本帖最后由 zl2168 于 2016-9-28 09:32 编辑

经常看到楼主2500在51黑网上提出的疑问,说明2500是一个好学青年。
但是你提的疑问大多是长篇没注释的程序,要别人解读。你是否知道解读别人冗长而没注释的程序是最烦人的事?因此,你常常得不到正确有效的解答。
你能否换一种学习方法?首先,你要拿到正确的程序(估计你原来拿到的程序都是从网上下载的,网上下载的程序多数是不靠谱的)。
那么,如何从众多网上程序中识别正确有效程序呢?没法识别。因为,不可能一个一个去解读。
唯一的方法是找到一本靠谱的单片机书。即电路与程序真实可靠可信可行,且便于阅读理解,便于自学。
真诚地给你介绍2本能达到上述要求的书,

张志良编著的:
80C51单片机实用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9

80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1

其中,第一本是教材书可用于学习51单片机原理,第二本是案例书,内有常用的单片机应用100案例。
以上绝不忽悠你!!!
为了便于你了解这2本书,在帖上简单介绍资料。
12-04962-003-01单片机实用教程 (1).pdf (479.45 KB, 下载次数: 5)
目录.rar (16.49 KB, 下载次数: 3)
前言.rar (7.28 KB, 下载次数: 3)


目录.rar (11.45 KB, 下载次数: 3)
前言.rar (6.53 KB, 下载次数: 3)
有问题,可email咨询。zzlls[url=]@126.com[/url]










回复

使用道具 举报

12#
ID:140716 发表于 2016-9-28 10:12 | 只看该作者
好久没玩51了,好亲切哈
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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