久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2957|回復: 10
打印 上一主題 下一主題
收起左側

這個單片機程序一直采集不到ADC數據,用串口發送也是亂碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:1091138 發表于 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    // 系統時鐘頻率
#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;    // 設置串口工作模式為模式1
    AUXR |= 0x40;   // 設置定時器1為1T模式
    TMOD &= 0x0F;   // 清除定時器1模式位
    TMOD |= 0x20;   // 設置定時器1為模式2
    TL1 = FOSC / 12 / BAUD;    // 初始化定時器1低字節
    TH1 = FOSC / 12 / BAUD;    // 初始化定時器1高字節
    ET1 = 0;        // 禁止定時器1中斷
    TR1 = 1;        // 啟動定時器1
}

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

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; // 清除接收標志位
//        dat = SBUF; // 讀取數據
//        
//        // 處理接收到的數據
//        // ...
//    }
//}
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;                                //設置P3.2為ADC口
    P3M1 = 0x04;
    P5M0 = 0x10;                                //設置P5.4為IO口(推挽輸出)
    P5M1 = 0x00;
        
    P_SW2 |= 0x80;
    ADCTIM = 0x3f;                              //設置ADC內部時序
    P_SW2 &= 0x7f;
    ADCCFG = 0x0f;                              //設置ADC時鐘為系統時鐘/2/16
    ADC_CONTR = 0x8A;                           //使能ADC模塊
    Delay100ms();
               
    UART_Init();                                //初始化串口
    Delay100ms();
               
    low_key=0;
   ADC_RES=0;
   ADC_RESL=0;

    while (1)
    {               
        ADC_CONTR |= 0x40;                      //啟動AD轉換
        _nop_();
        _nop_();
        while (!(ADC_CONTR & 0x20));            //查詢ADC完成標志                     
                          num = (ADC_RES<<8)|ADC_RESL;                  //讀取ADC結果
                          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;
    }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1091138 發表于 2023-8-11 15:14 | 只看該作者
使用的是STC8G1K08A的芯片,用P3.2引腳做ADC端口
回復

使用道具 舉報

板凳
ID:41656 發表于 2023-8-11 16:12 | 只看該作者
1、檢查ADC輸入通道是否設置對了  2、串口亂碼檢查MCU下載時鐘是否與宏定義串口配置參數的時鐘一致,另一個是串口助手的配置顯示模式HEX、CHAR是否設置對了   3、可以學習一下printf 和sprintf兩個標準庫這樣串口用起來才比較順手
回復

使用道具 舉報

地板
ID:1091138 發表于 2023-8-11 16:54 | 只看該作者
aidianzi 發表于 2023-8-11 16:12
1、檢查ADC輸入通道是否設置對了  2、串口亂碼檢查MCU下載時鐘是否與宏定義串口配置參數的時鐘一致,另一個 ...

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

使用道具 舉報

5#
ID:213173 發表于 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啟動控制位)0100 0000
  11. #define ADC_FLAG    0x20                        //ADC complete flag (宏定義ADC完成標志位)    0010 0000
  12. #define ADC_EPWMT   0x10                        //使能 PWM  實時觸發 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    // 系統時鐘頻率
  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位數據,可變波特率
  53.         AUXR |= 0x40;                //定時器時鐘1T模式
  54.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  55.         TMOD &= 0x0F;                //設置定時器模式
  56.         TL1 = 0xE0;                        //設置定時初始值
  57.         TH1 = 0xFE;                        //設置定時初始值
  58.         ET1 = 0;                        //禁止定時器中斷
  59.         TR1 = 1;                        //定時器1開始計時
  60. }

  61. void UART_SendByte(unsigned char dat)
  62. {
  63.     SBUF = dat;
  64.     while (!TI); // 等待發送完成
  65.     TI = 0; // 清除發送完成標志位
  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;  //設置P3.2為ADC口
  77.         P3M1 = 0x04;
  78.         P5M0 = 0x10; //設置P5.4為IO口(推挽輸出)
  79.         P5M1 = 0x00;
  80.         
  81.         P_SW2 |= 0x80;
  82.         ADCTIM = 0x3f; //設置ADC內部時序
  83.         P_SW2 &= 0x7f;
  84.         ADCCFG = 0x27;                                        //設置ADC結果右對齊,速度為512系統時鐘
  85.         ADC_RES=0;                                                //清除ADC_RES存儲器以前的結果
  86.         ADC_RESL=0;
  87.         ADC_CONTR=ADC_POWER;                 //ADC 開啟電源
  88.         Delay100ms();
  89.         
  90.         UART_Init();    //初始化串口
  91.         Delay100ms();        
  92.         low_key=0;

  93.         while (1)
  94.         {               
  95.                 ADC_CONTR=ADC_POWER|ADC_START|0x02;//啟動轉換1100 1010  P3.2
  96.                 _nop_();
  97.                 _nop_();
  98.                 while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成標志置位 1010 0000
  99.                 ADC_CONTR &=~ADC_FLAG;                        //清完成標志
  100.                 num = (ADC_RES<<8)|ADC_RESL;                  //讀取ADC結果
  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. }
復制代碼

回復

使用道具 舉報

6#
ID:1034262 發表于 2023-8-11 21:46 | 只看該作者
直接去STC官網下載例程多好。
回復

使用道具 舉報

7#
ID:1091138 發表于 2023-8-12 10:06 | 只看該作者
coody_sz 發表于 2023-8-11 21:46
直接去STC官網下載例程多好。

我用的是ISP軟件里的例程,直接復制過來了,學藝不精,一些配置沒改好
回復

使用道具 舉報

8#
ID:1091138 發表于 2023-8-12 10:08 | 只看該作者

感謝大哥指導,受益匪淺
回復

使用道具 舉報

9#
ID:195496 發表于 2023-8-12 11:38 | 只看該作者
查晶振,時鐘是12還是1周期,波特率,字符方式與HEX方式
回復

使用道具 舉報

10#
ID:929517 發表于 2023-8-12 18:24 來自觸屏版 | 只看該作者
你這頭文件不對吧 怎么是51的,看端口號應該是挺高級的
回復

使用道具 舉報

11#
ID:1091138 發表于 2023-8-14 08:14 | 只看該作者
reking8 發表于 2023-8-12 18:24
你這頭文件不對吧 怎么是51的,看端口號應該是挺高級的

51的也行,用的STC系列單片機,添加寄存器就行了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩视频中文字幕 | 精品国产一区二区在线 | 久久久久一区二区三区四区 | 精品伊人| 日韩一区二区福利视频 | 国产福利精品一区 | 久久精品小视频 | 中文字幕一区二区三区不卡在线 | 免费久久网 | 精品久久久久一区二区国产 | 日韩激情视频一区 | 成人免费视频网 | 精品久久一 | 中文日本在线 | 久久久精品 | 一级免费毛片 | 日韩精品一区二区三区在线观看 | 无码国模国产在线观看 | 在线精品一区二区三区 | 婷婷久久一区 | 精品一区二区久久久久久久网站 | 久久一二 | 在线免费观看亚洲 | 国产精品一区二区视频 | 日韩一区二区三区在线视频 | 久久久成人一区二区免费影院 | 久久中文字幕一区 | 九九福利| 一级少妇女片 | 雨宫琴音一区二区在线 | 亚洲日韩中文字幕 | 成年人的视频免费观看 | 操操操操操 | 国产精品有限公司 | 国产精品久久久久一区二区三区 | 国产1区2区3区 | 国产精品视频不卡 | 麻豆久久久久久 | 欧美精品三区 | 欧美lesbianxxxxhd视频社区 | 午夜影院在线观看 |