• 基于STC15单片机两路ADC测量串口显示-proteus仿真-源程序


    一、系统方案
    1、本设计采用STC15单片机作为主控器。
    2、两路ADC测量值送到串口显示。
    在这里插入图片描述

    二、硬件设计
    原理图如下:
    在这里插入图片描述

    三、单片机软件设计
    1、首先是系统初始化
    /----------------------------
    初始化串口
    ----------------------------
    /
    void InitUart()
    {
    // ACC = P_SW1;
    // ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0
    // P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)

    // ACC = P_SW1;
    // ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0
    // ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2)
    // P_SW1 = ACC;
    //
    // ACC = P_SW1;
    // ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=1
    // ACC |= S1_S1; //(P1.6/RxD_3, P1.7/TxD_3)
    // P_SW1 = ACC;

    #if (PARITYBIT == NONE_PARITY)
    SCON = 0x50; //8位可变波特率
    #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
    SCON = 0xda; //9位可变波特率,校验位初始为1
    #elif (PARITYBIT == SPACE_PARITY)
    SCON = 0xd2; //9位可变波特率,校验位初始为0
    #endif

    AUXR = 0x40;                //定时器1为1T模式
    TMOD = 0x00;                //定时器1为模式0(16位自动重载)
    TL1 = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    TH1 = (65536 - (FOSC/4/BAUD))>>8;
    TR1 = 1;                    //定时器1开始启动
    ES = 1;                     //使能串口中断
    EA = 1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    // SCON = 0x5a; //设置串口为8位可变波特率
    //#if URMD == 0
    // T2L = (65536 - (FOSC/4/BAUD));
    // T2H = (65536 - (FOSC/4/BAUD)) >> 8;
    // AUXR = 0x14; //T2为1T模式, 并启动定时器2
    // AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
    //#elif URMD == 1
    // AUXR = 0x40; //定时器1为1T模式
    // TMOD = 0x00; //定时器1为模式0(16位自动重载)
    // TL1 = (65536 - (FOSC/4/BAUD));
    // TH1 = (65536 - (FOSC/4/BAUD)) >> 8;
    // TR1 = 1; //定时器1开始启动
    //#else
    // TMOD = 0x20; //设置定时器1为8位自动重装载模式
    // AUXR = 0x40; //定时器1为1T模式
    // TH1 = TL1 = (256 - (FOSC/32/BAUD));
    // TR1 = 1;
    //#endif
    }
    2、串口显示程序

    /----------------------------
    发送串口数据
    ----------------------------
    /
    void SendData(BYTE dat)
    {
    while (busy); //等待前面的数据发送完成
    ACC = dat; //获取校验位P (PSW.0)
    // if § //根据P来设置校验位
    // {
    //#if (PARITYBIT == ODD_PARITY)
    // TB8 = 0; //设置校验位为0
    //#elif (PARITYBIT == EVEN_PARITY)
    // TB8 = 1; //设置校验位为1
    //#endif
    // }
    // else
    // {
    //#if (PARITYBIT == ODD_PARITY)
    // TB8 = 1; //设置校验位为1
    //#elif (PARITYBIT == EVEN_PARITY)
    // TB8 = 0; //设置校验位为0
    //#endif
    // }
    busy = 1;
    SBUF = ACC; //写数据到UART数据寄存器
    }

    /----------------------------
    发送字符串
    ----------------------------
    /
    void SendString(char *s)
    {
    // EA = 0 ;
    // ES = 0 ;
    while (*s) //检测字符串结束标志
    {
    SendData(*s++); //发送当前字符
    }
    // EA = 1 ;
    // ES = 1 ;
    }
    void serial_put_uint(unsigned int number)
    {
    unsigned int i;
    unsigned int nTmp;
    // *s++ =num/10 +‘0’;
    //*s++=num%10 +‘0’;
    //*s =0;

     //感觉这写法怪怪的吗?干嘛不for(i=1;i<5;i++) 因为这样不需要使用库函数pow()
     for(i=10000;i>=1;i=i/10)
      {
            nTmp = number/i;
    					if(nTmp >=1 ) SendData((unsigned char)(nTmp%10 + 0x30));
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    }

    3、核心算法程序

    /----------------------------
    初始化ADC
    ----------------------------
    /
    void InitADC()
    {
    P1M0 =1;
    P1M1 =0;
    P1 = 0Xff;
    P1ASF = 0xff; //设置P1口为AD口
    ADC_RES = 0; //清除结果寄存器
    ADC_RESL = 0; //清除结果寄存器
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
    Delay(2); //ADC上电并延时
    }

    /----------------------------
    读取ADC结果 20210101 注释GetADCResult 用GetADCResultint代替
    ----------------------------
    /

    unsigned int GetADCResultint(BYTE ch)
    {
    unsigned int ret=0;
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    nop(); //等待4个NOP
    nop();
    nop();
    nop();
    while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
    ADC_CONTR &= ~ADC_FLAG; //Close ADC
    ret = ADC_RES*4 + ADC_RESL;
    return ret; //返回ADC结果
    }

    四、 proteus仿真设计
    Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
    在这里插入图片描述

  • 相关阅读:
    985、211毕业生涌入小县城求职,是“抢饭碗”,还是“摆烂”?
    表名注解/主键注解/字段注解/乐观锁注解[MyBatis-Plus系列] - 第486篇
    踩坑指南:入门OpenTenBase之部署篇
    java刷题day 05
    安装shap-e(openai开源的3D模型生成框架)踩过的一些坑
    华为 2022_09_07 笔试题复盘
    点云目标检测——pointpillars环境配置与训练
    阿里巴巴 Github 星标 57.9KJava 面试突击汇总(全彩版)首次公开
    sockjs-client和stompjs连接websocket服务被拒绝导致vue项目崩溃问题
    SolidWorks二次开发 API-SOLIDWORKS Simulation分析参数修改
  • 原文地址:https://blog.csdn.net/bbxyliyang/article/details/132944968