標題: 我串口程序把我搞死了,只希望大家?guī)兔Ψ治鲆,換了3快開發(fā)板了。 [打印本頁]

作者: 2500    時間: 2016-9-27 21:15
標題: 我串口程序把我搞死了,只希望大家?guī)兔Ψ治鲆,換了3快開發(fā)板了。
我目地是比如輸入123456789 返回123456789 就是輸入什么返回什么。我使用ISIS仿真 程序沒有問題,把程序燒入單片機就不行 我拿了3快51單片機的開發(fā)板來測試就是不行,人都急死了,最基本的都出問題實在沒有辦法玩下再學。找不到問題點。希望大家?guī)蛶臀;蛘甙盐页绦驘銈?1里面去實際測試看看。我想知道到底是我程序還是我設備哪里出問題了,按理不可能三臺開發(fā)板都出問題
#include <reg52.h>
#define uint unsigned int
int a;
uint flag;
void uart_init();
void main()
{
    uart_init();
    while(1)
    {
        if(flag==1) // 如果收到數(shù)據(jù)
        {
            ES=0; //關閉串口中斷
            flag=0; //標志位清零
            SBUF=a; //將收到的數(shù)據(jù)發(fā)送至緩沖區(qū)
            while(!TI); //等待數(shù)據(jù)發(fā)送結束
            TI=0; // 將發(fā)送結束標志清零
            ES=1; // 使能串口中斷
        }
    }
}
void serial() interrupt 4   // 串口中斷服務函數(shù)
{
    a=SBUF; // 讀出接收到的數(shù)據(jù)
    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; // 打開串口中斷開關
}


作者: wxx    時間: 2016-9-27 23:28
這樣是不是兩邊在無限循環(huán)?
作者: fzguo    時間: 2016-9-27 23:59
對,一直在收發(fā)
作者: a0931727149    時間: 2016-9-28 05:42
中斷函數(shù):
作者: a0931727149    時間: 2016-9-28 05:42
void serial() interrupt 4   // 串口中斷服務函數(shù) {      a=SBUF; // 讀出接收到的數(shù)據(jù)     RI=0; // 清零接收標志位      flag=1; //標志位 }
作者: a0931727149    時間: 2016-9-28 05:50
一直在收發(fā)的...原因是當接收到第一個字組,啟動串列傳輸字組 ,當傳輸字組完成後又產(chǎn)生中斷的條件,又中斷...因此程式進入無窮循環(huán)...
作者: a0931727149    時間: 2016-9-28 06:08
首先說明串列中斷函數(shù)的特性:當 TI=1 或 RI=1 時皆會進入中斷服務函數(shù) 一直在收發(fā)的原因在於:發(fā)送完成也會產(chǎn)生中斷 在中斷服務函數(shù)加個判斷 void serial() interrupt 4   // 串口中斷服務函數(shù) {  if(RI)    {     a=SBUF; // 讀出接收到的數(shù)據(jù)     RI=0; // 清零接收標志位      flag=1; //標志位    }         }
作者: npn    時間: 2016-9-28 07:12
用示波器或邏輯分析儀檢測串口信號波形是否正常即可。
硬件串口有問題的話試試軟件模擬串口,適用于任何型號的單片機。

作者: a0931727149    時間: 2016-9-28 07:41
首先說明串列中斷函數(shù)的特性:當 TI=1 或 RI=1 時皆會進入中斷服務函數(shù) 一直在收發(fā)的原因在於:發(fā)送完成也會產(chǎn)生中斷 在中斷服務函數(shù)加個判斷 void serial() interrupt 4   // 串口中斷服務函數(shù) {  if(RI)    {     a=SBUF; // 讀出接收到的數(shù)據(jù)     RI=0; // 清零接收標志位      flag=1; //標志位    }         }
作者: a0931727149    時間: 2016-9-28 07:43
a0931727149 發(fā)表于 2016-9-28 07:41
首先說明串列中斷函數(shù)的特性:當 TI=1 或 RI=1 時皆會進入中斷服務函數(shù) 一直在收發(fā)的原因在於:發(fā)送完成也會 ...

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

而一直在收發(fā)的原因在於:發(fā)送完成也會產(chǎn)生中斷
在中斷服務函數(shù)加個判斷
void serial() interrupt 4   // 串口中斷服務函數(shù)
{  if(RI)
   {
    a=SBUF; // 讀出接收到的數(shù)據(jù)
    RI=0; // 清零接收標志位
    flag=1; //標志位
   }       
}
作者: zl2168    時間: 2016-9-28 08:38
本帖最后由 zl2168 于 2016-9-28 09:32 編輯

經(jīng)常看到樓主2500在51黑網(wǎng)上提出的疑問,說明2500是一個好學青年。
但是你提的疑問大多是長篇沒注釋的程序,要別人解讀。你是否知道解讀別人冗長而沒注釋的程序是最煩人的事?因此,你常常得不到正確有效的解答。
你能否換一種學習方法?首先,你要拿到正確的程序(估計你原來拿到的程序都是從網(wǎng)上下載的,網(wǎng)上下載的程序多數(shù)是不靠譜的)。
那么,如何從眾多網(wǎng)上程序中識別正確有效程序呢?沒法識別。因為,不可能一個一個去解讀。
唯一的方法是找到一本靠譜的單片機書。即電路與程序真實可靠可信可行,且便于閱讀理解,便于自學。
真誠地給你介紹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, 下載次數(shù): 5)
目錄.rar (16.49 KB, 下載次數(shù): 3)
前言.rar (7.28 KB, 下載次數(shù): 3)


目錄.rar (11.45 KB, 下載次數(shù): 3)
前言.rar (6.53 KB, 下載次數(shù): 3)
有問題,可email咨詢。zzlls[url=]@126.com[/url]











作者: 章魚哥    時間: 2016-9-28 10:12
好久沒玩51了,好親切哈




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1