找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1611|回复: 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 单片机教程网

快速回复 返回顶部 返回列表