SOGO論壇

標題: 有關類比轉數位之程式 8051 ADC0804 RS232 請求達人幫助 [列印本頁]

作者: sss555    時間: 2011-11-7 21:28:09     標題: 有關類比轉數位之程式 8051 ADC0804 RS232 請求達人幫助

小弟有個問題,想請各位達人 大師 幫忙ㄧ下
小弟卡在類比轉數位的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
作者: alphi    時間: 2011-11-7 22:17:39

有考慮C語言嗎.這樣我可以幫你寫一下
作者: sss555    時間: 2011-11-8 23:37:53

alphi 發表於 2011-11-7 22:17  
有考慮C語言嗎.這樣我可以幫你寫一下

好~大大感謝你了 小弟感激不盡
作者: alphi    時間: 2011-11-9 13:29:45

你需要的baudrate 用RS232輸出格式為何 其結尾為\r\n 還是其他
作者: begti20    時間: 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    時間: 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    時間: 2011-11-9 21:17:33

大師 此軟體沒用過 我是用網路上所找的檢測RS232
作者: alphi    時間: 2011-11-9 21:33:49

那是一套可以模擬AVR,Microchip,8051,ARM7,z80等MCU的模擬軟體

http://www.labcenter.co.uk

你可以試試看驗證
作者: helper197    時間: 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

作者: alphi    時間: 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;
}











附件: adc0804.jpg (2011-11-10 08:30:45, 74.15 KB) / 下載次數 32
https://oursogo.com/forum.php?mod=attachment&aid=ODEwODA0fDkyZWQ4OTMyfDE3MTcxMTEwMTZ8MHww
作者: sss555    時間: 2011-11-10 22:11:54

感謝各位大的幫忙~目前小弟在努力的試~如還有需要幫忙我會告知~感謝各位
作者: 又靜    時間: 2011-11-11 10:07:44

sss555 發表於 2011-11-10 22:11  
感謝各位大的幫忙~目前小弟在努力的試~如還有需要幫忙我會告知~感謝各位

希望會員們的回覆有幫助到您,好的學習態度值得肯定
雖然我幫不上什麼忙,但多與會員互動、討論相信能學到更多





歡迎光臨 SOGO論壇 (https://oursogo.com/) Powered by OURSOGO.COM