SOGO論壇
  登入   註冊   找回密碼
查看: 3490|回覆: 11
列印 上一主題 下一主題

[問題求助] 有關類比轉數位之程式 8051 ADC0804 RS232 請求達人幫助 [複製連結]

Rank: 2

狀態︰ 離線
跳轉到指定樓層
1
發表於 2011-11-7 21:28:09 |只看該作者 |倒序瀏覽
小弟有個問題,想請各位達人 大師 幫忙ㄧ下
小弟卡在類比轉數位的8051以及AD0804、RS232之間不會溝通,8051程式碼在編譯的時候有誤 但是怎嚜找都找不到,望請各位大大幫忙ㄧ下 附上程式碼  還是小弟本身程式有誤,還請各位大大指教... 或者大大您可否幫寫程式,小弟我萬分感激 好人有好報啊

程式碼如下     
ORG 0000H
JMP START
ORG 0023H
JMP INTERR
START:
MOV SP,#70H
MOV DPTR,#TABLE
MOV 20H,#00H
MOV 21H,#00H
MOV IE,#10010000B
MOV SCON,#01110000B
MOV TMOD,#00100000B
MOV TH1,#0FDH
SETB TR1
MAIN:
CLR P1.7
ACALL DELAY
SETB P1.7
WAIT:
JB P1.6,WAIT
MOV A,P2
MOV B,A
SWAP A
ANL A,#00001111B
MOVC A,@A+DPTR
MOV DPTR,
MOV 20H,A
MOV A,B
ANL A,
MOVC A,@A+DPTR
MOV 21H,A
SETB TI
AJMP MAIN
INTERR:
PUSH A
JBC TI,TIINT
POP A
RETI
TIINT:
MOV A,20H
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,21H
MOV SBUF,A
JNB TI,$
CLR TI
POP A
RETI
DELAY:
MOV R6,#20
DL1: MOV R7,#200
DJNZ R7,$
DJNZ R6,DL1
RET
TABLE:
DB 30H
DB 31H
DB 32H
DB 33H
DB 34H
DB 35H
DB 36H
DB 37H
DB 38H
DB 39H
DB 41H
DB 42H
DB 43H
DB 44H
DB 45H
DB 46H
END
喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

Rank: 5Rank: 5

數位軟體勳章

狀態︰ 離線
2
發表於 2011-11-7 22:17:39 |只看該作者
有考慮C語言嗎.這樣我可以幫你寫一下

點評

又靜  工作固然重要,但身體也要顧好,別太累了 ^^  發表於 2011-11-7 23:01:26

Rank: 2

狀態︰ 離線
3
發表於 2011-11-8 23:37:53 |只看該作者
alphi 發表於 2011-11-7 22:17  
有考慮C語言嗎.這樣我可以幫你寫一下

好~大大感謝你了 小弟感激不盡

點評

alphi  大師不敢當,但是互相交流是不錯.技術這種東西是越交流越精進  發表於 2011-11-10 20:36:39
又靜  alphi 可是電子電機資訊館專業級的大師,有什麼問題可以回文提出來互相交流 ^^  發表於 2011-11-9 16:48:01

Rank: 5Rank: 5

數位軟體勳章

狀態︰ 離線
4
發表於 2011-11-9 13:29:45 |只看該作者
你需要的baudrate 用RS232輸出格式為何 其結尾為\r\n 還是其他

點評

sss555  大師您好 小弟學識之淺 不知道您所說的baud rate ,我將我所求告知你 ~目前狀況是我要將類比訊號傳入0804透過8051轉成RS232 在電腦顯示出值  發表於 2011-11-9 20:59:56

Rank: 5Rank: 5

狀態︰ 離線
5
發表於 2011-11-9 18:29:31 |只看該作者
組譯後有兩個指令錯誤如下
               2500 A.D. 8051 Macro Assembler  -  Version 5.00c
               ------------------------------------------------
                       Input  Filename : adc0804.asm
                       Output Filename : adc0804.obj

   26   0051   90 00 00                 MOV DPTR,
        ***** adc0804.asm : Line 26 *****
        ***** ILLEGAL ADDRESSING MODE *****
   29   0058   55 41                    ANL A,
        ***** adc0804.asm : Line 29 *****
        ***** SYNTAX ERROR *****

           Lines Assembled :  61             Assembly Errors :  2

26 DPTR在START:程式段中 MOV DPTR,#TABLE設定過初始值,它指向TABLE
   整個程式並不需要更改DPTR。
   所以可以將這個指令刪除

29 在MAIN的程式中,你檢查P1.6=0輸入P2 port,將P2的高4bit值轉換成
   ASCII碼置於20H,低4bit值轉換成ASCII碼置於21H。
   修改成ANL A,#00001111B即可

修改後的程式如下,試試看
         ORG 0000H
         JMP START
         ORG 0023H
         JMP INTERR
START:
         MOV SP,#70H
         MOV DPTR,#TABLE
         MOV 20H,#00H
         MOV 21H,#00H
         MOV IE,#10010000B
         MOV SCON,#01110000B
         MOV TMOD,#00100000B
         MOV TH1,#0FDH
         SETB TR1
MAIN:
         CLR P1.7
         ACALL DELAY
         SETB P1.7
WAIT:
         JB P1.6,WAIT
         MOV A,P2
         MOV B,A
         SWAP A
         ANL A,#00001111B
         MOVC A,@A+DPTR
;        MOV DPTR,
         MOV 20H,A
         MOV A,B
         ANL A,#00001111B
         MOVC A,@A+DPTR
         MOV 21H,A
         SETB TI
         AJMP MAIN
INTERR:
         PUSH A
         JBC TI,TIINT
         POP A
         RETI
TIINT:
         MOV A,20H
         MOV SBUF,A
         JNB TI,$
         CLR TI
         MOV A,21H
         MOV SBUF,A
         JNB TI,$
         CLR TI
         POP A
         RETI
DELAY:
         MOV R6,#20
DL1:    MOV R7,#200
         DJNZ R7,$
         DJNZ R6,DL1
         RET
TABLE:  ; ASCII code: 0..9,A..F
         DB 30H,31H,32H,33H,34H
         DB 35H,36H,37H,38H,39H
         DB 41H,42H,43H,44H,45H
         DB 46H
         END

點評

sss555  感謝大大幫忙DEBUG~小弟感激不盡  發表於 2011-11-9 21:00:52
helper197  感謝大大 ... 小弟也學到一點了.... ^_^  發表於 2011-11-9 18:56:57
已有 1 人評分威望 收起 理由
紅塵孤鳥 + 2 感謝您熱心幫助會員解決問題,論壇需要您的.

總評分: 威望 + 2   查看全部評分

Rank: 2

狀態︰ 離線
6
發表於 2011-11-9 21:03:22 |只看該作者
alphi 大師~ 這我從網上找到的  是能寫入8051上 但是我不曉得 為什麼RS232總是沒反應   在這感謝大大
程式如下
// Program to read the values of ADC and serially tranmitting it to PC.
#include<reg51.h>
sbit wr= P2^0;        // Write pin. It is used to start the conversion.
sbit rd= P2^1;        // Read pin. It is used to extract the data from internal register to the output pins of ADC.
sbit intr= P2^2;        // Interrupt pin. This is used to indicate the end of conversion. It goes low when conversion is complete.

void transmit()        // Function for serial tranmission of data.
{
    SBUF=P1;
    while(TI==0);
    TI=0;
}

void delay(unsigned int msec )        // The delay function provides delay in msec.
{
    int i ,j ;
    for(i=0;i<msec;i++)
        for(j=0; j<1275; j++);
}

void adc()        //Function to read the values from ADC and tranmit serially.
{
    rd=1;
    wr=0;
    delay(2);
    wr=1;
    while(intr==1);
    rd=0;
    transmit();
    delay(2);
    intr=1;
}

void init()        // Intialize timer 1 in mode 2 for serial transmission. The baud rate is set to 9600bps.
{
    TMOD=0x20;
    TH1=0xFD;
    SCON=0x50;
    TR1=1;
}

void main()
{
    P1=0xff;        // Declare P1 as input port.
    init();
    while(1)
    {
        adc();
    }
}

點評

sss555  大師 此軟體沒用過 我是用網路上所找的檢測RS232  發表於 2011-11-9 21:19:47
alphi  我回去幫你看一下 並且跑一下模擬 你有用過Proteus嗎  發表於 2011-11-9 21:13:30

Rank: 2

狀態︰ 離線
7
發表於 2011-11-9 21:17:33 |只看該作者
大師 此軟體沒用過 我是用網路上所找的檢測RS232

Rank: 5Rank: 5

數位軟體勳章

狀態︰ 離線
8
發表於 2011-11-9 21:33:49 |只看該作者
那是一套可以模擬AVR,Microchip,8051,ARM7,z80等MCU的模擬軟體

http://www.labcenter.co.uk

你可以試試看驗證

點評

sss555  大師~小弟感激不盡~還能請教 是要下載哪個....  發表於 2011-11-9 22:00:44
已有 1 人評分威望 收起 理由
紅塵孤鳥 + 1 感謝您熱心幫助會員解決問題,論壇需要您的.

總評分: 威望 + 1   查看全部評分

失敗只有一種:那就是半途而廢

Rank: 3Rank: 3

數位軟體勳章

狀態︰ 離線
9
發表於 2011-11-9 22:45:34 |只看該作者
本帖最後由 helper197 於 2011-11-9 22:47 編輯

    嗨嗨..

     sbit intr= P2^2;        // Interrupt pin. This is used to indicate the end of conversion. It goes low when conversion is complete.
   
    不曉得您有沒有觸發他哩??  

    另外是 他是送出去P1這個值唷

     SBUF=P1; //偶的電腦可以跑  耶

    您在試試看 :D

點評

又靜  好久沒在這裡看見您了,有空就常來互相交流 ^^  發表於 2011-11-10 00:13:44
感同身受,就能放下執著

Rank: 5Rank: 5

數位軟體勳章

狀態︰ 離線
10
發表於 2011-11-10 08:34:09 |只看該作者
本帖最後由 alphi 於 2011-11-10 13:35 編輯

我沒仔細設計其ADC電源及採用偷懶方法使用Freerun 並且採用RC震盪方式.
用模擬軟體可以正常動作

#include <at89x52.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

///Delay函數
void delay(int);
///初始化UART 1200,N,8,1 at 16MHz
void UART_Init(void);
///傳送資料
void UART_SendByte(unsigned char ch);
///發送資料
unsigned char UART_GetByte(void);
///轉換
unsigned int ADC_Convert(void);


void delay(int d)
{
int i, j;
for(i=0; i<d; i++)
    for(j=0; j<200; j++)  ;
}

//初始化UART
void UART_Init(void)
{
        SCON  = 0x50;                        /* SCON: mode 1, 8-bit UART, enable rcvr      */
    TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
    TH1   = 221;                /* TH1:  reload value for 1200 baud @ 16MHz   */
    TR1   = 1;                  /* TR1:  timer 1 run                          */
    TI    = 1;    // SCON: mode 1, 8-bit UART, enable rcvr      */
   
   
                        
   //TI    = 1;           // TI:   set TI to send first char of UART    */
}

void UART_SendByte(unsigned char ch)
{
        //發送資料
        SBUF=ch;
        //等待資料發送完成
        while(TI==0)
                  ;
        TI=0;       
}

unsigned char UART_GetByte()
{
        //等待資料接收
        while(RI==0)
                  ;
          RI=0;
          return SBUF;
}

int main(void)
{
       

        //初始化UART
        UART_Init();
       
        while(1)
           {
       
                //P2_0=1;
       
                //UART_SendByte('A');
                printf("adc:%u\r\n",ADC_Convert());
                // delay(5000);
           
       
   }
}
unsigned int ADC_Convert(void)
{
//電壓值=(ADC_Value/256)*5V
unsigned int ADC_Value;
        //P2.0 0->1 正源觸發 告知ADC轉換
        P2_0=0;
        P2_0=1;
        //P0高阻抗
        P0=0xFF;
        //進行轉換
        ADC_Value=P0;
        P1=        ADC_Value;
              return ADC_Value;
}









點評

helper197  哇 太厲害了 偶也來學習學習...... :D 威望 + 10000  發表於 2011-11-10 14:35:38
已有 1 人評分威望 收起 理由
紅塵孤鳥 + 2 感謝您熱心幫助會員解決問題,論壇需要您的.

總評分: 威望 + 2   查看全部評分

失敗只有一種:那就是半途而廢
請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2024-5-7 11:25

© 2004-2024 SOGO論壇 OURSOGO.COM
回頂部