找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3000|回復(fù): 10
收起左側(cè)

這個(gè)單片機(jī)程序一直采集不到ADC數(shù)據(jù),用串口發(fā)送也是亂碼

[復(fù)制鏈接]
ID:1091138 發(fā)表于 2023-8-11 15:12 | 顯示全部樓層 |閱讀模式
有人能幫我看看嗎,有人能幫我看看嗎,
#include "reg51.h"
#include "intrins.h"

sfr     ADC_CONTR   =   0xbc;
sfr     ADC_RES     =   0xbd;
sfr     ADC_RESL    =   0xbe;
sfr     ADCCFG      =   0xde;

sfr     P_SW2   =   0xba;
#define ADCTIM  (*(unsigned char volatile xdata *)0xfea8)
        
sfr     P4      =   0xC0;
sfr     P5      =   0xC8;

sfr     P0M1    =   0x93;
sfr     P0M0    =   0x94;
sfr     P1M1    =   0x91;
sfr     P1M0    =   0x92;
sfr     P2M1    =   0x95;
sfr     P2M0    =   0x96;
sfr     P3M1    =   0xb1;
sfr     P3M0    =   0xb2;
sfr     P4M1    =   0xb3;
sfr     P4M0    =   0xb4;
sfr     P5M1    =   0xc9;
sfr     P5M0    =   0xca;

#define FOSC    11059200UL    // 系統(tǒng)時(shí)鐘頻率
#define BAUD    9600          // 串口波特率

sfr     AUXR    =   0x8e;
sfr     T2H     =   0xd6;
sfr     T2L     =   0xd7;

sbit low_key=P5^4;
unsigned int num;

void Delay100ms()                //@11.0592MHz
{
        unsigned char data i, j, k;

        _nop_();
        i = 6;
        j = 157;
        k = 59;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void UART_Init() {
    SCON = 0x50;    // 設(shè)置串口工作模式為模式1
    AUXR |= 0x40;   // 設(shè)置定時(shí)器1為1T模式
    TMOD &= 0x0F;   // 清除定時(shí)器1模式位
    TMOD |= 0x20;   // 設(shè)置定時(shí)器1為模式2
    TL1 = FOSC / 12 / BAUD;    // 初始化定時(shí)器1低字節(jié)
    TH1 = FOSC / 12 / BAUD;    // 初始化定時(shí)器1高字節(jié)
    ET1 = 0;        // 禁止定時(shí)器1中斷
    TR1 = 1;        // 啟動(dòng)定時(shí)器1
}

void UART_SendByte(unsigned char dat)
{
    SBUF = dat;
    while (!TI); // 等待發(fā)送完成
    TI = 0; // 清除發(fā)送完成標(biāo)志位
}

void UART_SendString(unsigned char *s)
{
    while (*s) {
        UART_SendByte(*s++);
    }
}

//void UART_Receive() interrupt 4 using 1 {
//    unsigned char dat;
//   
//    if (RI) {
//        RI = 0; // 清除接收標(biāo)志位
//        dat = SBUF; // 讀取數(shù)據(jù)
//        
//        // 處理接收到的數(shù)據(jù)
//        // ...
//    }
//}
void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    P3M0 = 0x00;                                //設(shè)置P3.2為ADC口
    P3M1 = 0x04;
    P5M0 = 0x10;                                //設(shè)置P5.4為IO口(推挽輸出)
    P5M1 = 0x00;
        
    P_SW2 |= 0x80;
    ADCTIM = 0x3f;                              //設(shè)置ADC內(nèi)部時(shí)序
    P_SW2 &= 0x7f;
    ADCCFG = 0x0f;                              //設(shè)置ADC時(shí)鐘為系統(tǒng)時(shí)鐘/2/16
    ADC_CONTR = 0x8A;                           //使能ADC模塊
    Delay100ms();
               
    UART_Init();                                //初始化串口
    Delay100ms();
               
    low_key=0;
   ADC_RES=0;
   ADC_RESL=0;

    while (1)
    {               
        ADC_CONTR |= 0x40;                      //啟動(dòng)AD轉(zhuǎn)換
        _nop_();
        _nop_();
        while (!(ADC_CONTR & 0x20));            //查詢ADC完成標(biāo)志                     
                          num = (ADC_RES<<8)|ADC_RESL;                  //讀取ADC結(jié)果
                          Delay100ms();

                          UART_SendByte(num/100+0x30);
                          UART_SendByte(num/100%10+0x30);
                          UART_SendString(" \r\n");
                          Delay100ms();

                          if(num>300)
                                {
                                        low_key=0;
                                }
                                else low_key=1;
    }
}

回復(fù)

使用道具 舉報(bào)

ID:1091138 發(fā)表于 2023-8-11 15:14 | 顯示全部樓層
使用的是STC8G1K08A的芯片,用P3.2引腳做ADC端口
回復(fù)

使用道具 舉報(bào)

ID:41656 發(fā)表于 2023-8-11 16:12 | 顯示全部樓層
1、檢查ADC輸入通道是否設(shè)置對(duì)了  2、串口亂碼檢查MCU下載時(shí)鐘是否與宏定義串口配置參數(shù)的時(shí)鐘一致,另一個(gè)是串口助手的配置顯示模式HEX、CHAR是否設(shè)置對(duì)了   3、可以學(xué)習(xí)一下printf 和sprintf兩個(gè)標(biāo)準(zhǔn)庫(kù)這樣串口用起來(lái)才比較順手
回復(fù)

使用道具 舉報(bào)

ID:1091138 發(fā)表于 2023-8-11 16:54 | 顯示全部樓層
aidianzi 發(fā)表于 2023-8-11 16:12
1、檢查ADC輸入通道是否設(shè)置對(duì)了  2、串口亂碼檢查MCU下載時(shí)鐘是否與宏定義串口配置參數(shù)的時(shí)鐘一致,另一個(gè) ...

感謝提示,的確是ADC通道選錯(cuò)了,但是串口這邊一直找不到原因,時(shí)鐘,波特率等配置都是匹配的
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2023-8-11 19:25 | 顯示全部樓層
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. sfr     ADC_CONTR   =   0xbc;
  4. sfr     ADC_RES     =   0xbd;
  5. sfr     ADC_RESL    =   0xbe;
  6. sfr     ADCCFG      =   0xde;

  7. sfr     P_SW2   =   0xba;

  8. #define ADCTIM  (*(unsigned char volatile xdata *)0xfea8)
  9. #define ADC_POWER   0x80                        //ADC power control dit (宏定義ADC電源控制位)1000 0000
  10. #define ADC_START   0x40                        //ADC start control dit (宏定義ADC啟動(dòng)控制位)0100 0000
  11. #define ADC_FLAG    0x20                        //ADC complete flag (宏定義ADC完成標(biāo)志位)    0010 0000
  12. #define ADC_EPWMT   0x10                        //使能 PWM  實(shí)時(shí)觸發(fā) ADC                     0001 0000        

  13. sfr     P4      =   0xC0;
  14. sfr     P5      =   0xC8;

  15. sfr     P0M1    =   0x93;
  16. sfr     P0M0    =   0x94;
  17. sfr     P1M1    =   0x91;
  18. sfr     P1M0    =   0x92;
  19. sfr     P2M1    =   0x95;
  20. sfr     P2M0    =   0x96;
  21. sfr     P3M1    =   0xb1;
  22. sfr     P3M0    =   0xb2;
  23. sfr     P4M1    =   0xb3;
  24. sfr     P4M0    =   0xb4;
  25. sfr     P5M1    =   0xc9;
  26. sfr     P5M0    =   0xca;

  27. #define FOSC    11059200UL    // 系統(tǒng)時(shí)鐘頻率
  28. #define BAUD    9600          // 串口波特率

  29. sfr     AUXR    =   0x8e;
  30. sfr     T2H     =   0xd6;
  31. sfr     T2L     =   0xd7;

  32. sbit low_key=P5^4;
  33. unsigned int num;
  34. unsigned char rec_buf[]="0000\n";

  35. void Delay100ms()                //@11.0592MHz
  36. {
  37.         unsigned char i, j, k;

  38.         _nop_();
  39.         i = 6;
  40.         j = 157;
  41.         k = 59;
  42.         do
  43.         {
  44.                 do
  45.                 {
  46.                         while (--k);
  47.                 } while (--j);
  48.         } while (--i);
  49. }

  50. void UART_Init()
  51. {
  52.         SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  53.         AUXR |= 0x40;                //定時(shí)器時(shí)鐘1T模式
  54.         AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
  55.         TMOD &= 0x0F;                //設(shè)置定時(shí)器模式
  56.         TL1 = 0xE0;                        //設(shè)置定時(shí)初始值
  57.         TH1 = 0xFE;                        //設(shè)置定時(shí)初始值
  58.         ET1 = 0;                        //禁止定時(shí)器中斷
  59.         TR1 = 1;                        //定時(shí)器1開(kāi)始計(jì)時(shí)
  60. }

  61. void UART_SendByte(unsigned char dat)
  62. {
  63.     SBUF = dat;
  64.     while (!TI); // 等待發(fā)送完成
  65.     TI = 0; // 清除發(fā)送完成標(biāo)志位
  66. }

  67. void UART_SendString(unsigned char *s)
  68. {
  69.         while (*s)
  70.         {
  71.                 UART_SendByte(*s++);
  72.         }
  73. }

  74. void main()
  75. {        
  76.         P3M0 = 0x00;  //設(shè)置P3.2為ADC口
  77.         P3M1 = 0x04;
  78.         P5M0 = 0x10; //設(shè)置P5.4為IO口(推挽輸出)
  79.         P5M1 = 0x00;
  80.         
  81.         P_SW2 |= 0x80;
  82.         ADCTIM = 0x3f; //設(shè)置ADC內(nèi)部時(shí)序
  83.         P_SW2 &= 0x7f;
  84.         ADCCFG = 0x27;                                        //設(shè)置ADC結(jié)果右對(duì)齊,速度為512系統(tǒng)時(shí)鐘
  85.         ADC_RES=0;                                                //清除ADC_RES存儲(chǔ)器以前的結(jié)果
  86.         ADC_RESL=0;
  87.         ADC_CONTR=ADC_POWER;                 //ADC 開(kāi)啟電源
  88.         Delay100ms();
  89.         
  90.         UART_Init();    //初始化串口
  91.         Delay100ms();        
  92.         low_key=0;

  93.         while (1)
  94.         {               
  95.                 ADC_CONTR=ADC_POWER|ADC_START|0x02;//啟動(dòng)轉(zhuǎn)換1100 1010  P3.2
  96.                 _nop_();
  97.                 _nop_();
  98.                 while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成標(biāo)志置位 1010 0000
  99.                 ADC_CONTR &=~ADC_FLAG;                        //清完成標(biāo)志
  100.                 num = (ADC_RES<<8)|ADC_RESL;                  //讀取ADC結(jié)果
  101.                 Delay100ms();
  102.                 rec_buf[0]=num/1000%10+'0';
  103.                 rec_buf[1]=num/100%10+'0';
  104.                 rec_buf[2]=num/10%10+'0';
  105.                 rec_buf[3]=num%10+'0';
  106.                 UART_SendString(rec_buf);

  107.                 Delay100ms();
  108.                
  109.                 if(num>300)
  110.                 {
  111.                         low_key=0;
  112.                 }
  113.                 else low_key=1;
  114.     }
  115. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

ID:1034262 發(fā)表于 2023-8-11 21:46 | 顯示全部樓層
直接去STC官網(wǎng)下載例程多好。
回復(fù)

使用道具 舉報(bào)

ID:1091138 發(fā)表于 2023-8-12 10:06 | 顯示全部樓層
coody_sz 發(fā)表于 2023-8-11 21:46
直接去STC官網(wǎng)下載例程多好。

我用的是ISP軟件里的例程,直接復(fù)制過(guò)來(lái)了,學(xué)藝不精,一些配置沒(méi)改好
回復(fù)

使用道具 舉報(bào)

ID:1091138 發(fā)表于 2023-8-12 10:08 | 顯示全部樓層

感謝大哥指導(dǎo),受益匪淺
回復(fù)

使用道具 舉報(bào)

ID:195496 發(fā)表于 2023-8-12 11:38 | 顯示全部樓層
查晶振,時(shí)鐘是12還是1周期,波特率,字符方式與HEX方式
回復(fù)

使用道具 舉報(bào)

ID:929517 發(fā)表于 2023-8-12 18:24 來(lái)自觸屏版 | 顯示全部樓層
你這頭文件不對(duì)吧 怎么是51的,看端口號(hào)應(yīng)該是挺高級(jí)的
回復(fù)

使用道具 舉報(bào)

ID:1091138 發(fā)表于 2023-8-14 08:14 | 顯示全部樓層
reking8 發(fā)表于 2023-8-12 18:24
你這頭文件不對(duì)吧 怎么是51的,看端口號(hào)應(yīng)該是挺高級(jí)的

51的也行,用的STC系列單片機(jī),添加寄存器就行了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表