找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1384|回复: 2
打印 上一主题 下一主题
收起左侧

Stc8h3K单片机ADC结果,串口助手如何打印显示?

[复制链接]
跳转到指定楼层
楼主
ID:686513 发表于 2022-2-27 18:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhth1979 于 2022-2-27 18:52 编辑

#include "adc.h"
#include "delay.h"

typedef unsigned char u8;
typedef unsigned int u16;

unsigned int line_bat_0;                //通道0的ADC结果,送显示用的
unsigned int line_bat_1;                //通道1的ADC结果,送显示用的
unsigned int line_bat_2;                //通道2的ADC结果,送显示用的

unsigned long int ADC_DATA0;        //           ADC0数据
unsigned long int ADC_DATA1;        //           ADC1数据
unsigned long int ADC_DATA2;        //           ADC2数据

u8  count0;          //        ADC通道0转换次数记录
u8  count1;          //        ADC通道1转换次数记录
u8  count2;          //        ADC通道2转换次数记录
u8  ADC_LINE;        //        ADC通道记录

//ADC口初始化
void STC8ADC_INIT()                         //STC8ADC初始化
{
  P1M0=0x00;
  P1M1=0x07;             //设定P1.4567通道为高阻
         P_SW2|=0X80;    //打开特殊功能寄存器
   ADCTIM=0X3F;    //设置ADC内部时序
   P_SW2&=0X7F;    //关闭特殊功能寄存器
  ADCCFG=0x2f;             //设置ADC的时钟和转换结果存放格式
  ADC_CONTR=0x80;    //使能ADC模块
  ADC_LINE=0x80;     //通道0
  DelayXms(5);      //等待5ms
  ADC_CONTR=ADC_CONTR|0x40;        //启动ADC
  EADC=1;            //打开ADC中断开关
}               

void ADC_ISR()interrupt 5
{        
        //ADC_CONTR&=~0x20;
        ADC_CONTR=ADC_CONTR&0xdf;        //清除中断标志位
//=============================================================================================================
        if(ADC_LINE==0x80)        //选择通道0
                {  
                if(count0>=100)          //如果通道0转换次数小于32
                        {        
                          line_bat_0=ADC_DATA0/100;        
                                 ADC_DATA0=0x00;    //ADC0数据清零
                                 count0=0x00;       //通道0转换次数清零
                        }
                        ADC_DATA0=ADC_DATA0+(ADC_RES*256+ADC_RESL);        //ADC结果处理
                        count0++;            //通道0转换次数加1
                        ADC_LINE=0x81;       //切换下一通道(通道1)
                        ADC_CONTR=ADC_LINE;   //下一通道值赋给控制寄存器
                }
//====================================================================
else if(ADC_LINE==0x81)      //选择通道1
                {  
                if(count1>=100)            //如果通道1转换次数小于32
                        {
                                line_bat_1=ADC_DATA1/100;
                                 ADC_DATA1=0x00;      //ADC1数据清零
                                 count1=0x00;         //通道1转换次数清零
                        }
                        ADC_DATA1=ADC_DATA1+(ADC_RES*256+ADC_RESL);        //ADC结果处理
                        count1++;                //通道1转换次数加1
                        ADC_LINE=0x82;           //切换下一通道(通道2)
                        ADC_CONTR=ADC_LINE;      //下一通道值赋给控制寄存器
                }
//=====================================================================
else if(ADC_LINE==0x82)     //选择通道2
                {  
                if(count2<100)            //如果通道2转换次数小于32
                        {
                                line_bat_2=ADC_DATA2/100;
                                 ADC_DATA2=0x00;      //ADC2数据清零
                                 count2=0x00;         //通道2转换次数清零
                        }
                        ADC_DATA2=ADC_DATA2+(ADC_RES*256+ADC_RESL);        //ADC结果处理
                        count2++;              //通道2转换次数加1
                        ADC_LINE=0x80;         //切换下一通道(通道0)
                        ADC_CONTR=ADC_LINE;    //下一通道值赋给控制寄存器
                }

//=============================================================================================================                                   
        ADC_CONTR=ADC_CONTR|0x40;        //启动ADC
}
//=========================================================================================



上面是中断方式获取的ADC结果,下面是串口打印程序如何修改才能在串口助手里查看ADC结果?
#include  "stc8hxx.h"
#include "adc.h"
#include "intrins.h"


void main()
{
        STC8ADC_INIT();
        
    SCON = 0x50;
    T2L = 0xe8;                                 //65536-11059200/115200/4=0FFE8H
    T2H = 0xff;
    AUXR = 0x15;                                //启动定时器
    ES = 1;                                     //使能串口中断
    EA = 1;
   
}


void UART1_Isr() interrupt 4
{
    if (TI)
    {
        TI = 0;                                 //清中断标志
SBUF = line_bat_0;                                //发送测试数据
    }
    if (RI)
    {
        RI = 0;                                 //清中断标志

    }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2022-2-27 21:50 | 只看该作者
给你一个思路
  1. #include "stc8hxx.h"
  2. #include "adc.h"
  3. #include "intrins.h"

  4. char line_bat_0_Str[] = {"0000"};
  5. void UartSend(char dat)
  6. {
  7.     while (busy);
  8.     busy = 1;
  9.     SBUF = dat;
  10. }

  11. void UartSendStr(char *p)
  12. {
  13.     while (*p)
  14.     {
  15.         UartSend(*p++);
  16.     }
  17. }
  18. void main()
  19. {
  20.     STC8ADC_INIT();
  21.         
  22.     SCON = 0x50;
  23.     T2L = 0xe8;                                 //65536-11059200/115200/4=0FFE8H
  24.     T2H = 0xff;
  25.     AUXR = 0x15;                                //启动定时器
  26.     ES = 1;                                     //使能串口中断
  27.     EA = 1;
  28.         if(line_bat_0)
  29.         {
  30.                 line_bat_0_Str[3] = line_bat_0 % 10 + '0';
  31.                 line_bat_0/= 10;
  32.                 line_bat_0_Str[2] = line_bat_0 % 10 + '0';
  33.                 line_bat_0/= 10;
  34.                 line_bat_0_Str[1] = line_bat_0 % 10 + '0';
  35.                 line_bat_0/= 10;
  36.                 line_bat_0_Str[0] = line_bat_0 % 10 + '0';
  37.                 line_bat_0/= 10;
  38.                 UartSendStr("Line bat 0: "};
  39.                 UartSendStr(line_bat_0_Str};
  40.                 UartSendStr("\r\n"};
  41.         }
  42. }

  43. void UART1_Isr() interrupt 4
  44. {
  45.     if (TI)
  46.     {
  47.         TI = 0;                                 //清中断标志
  48.                 busy = 0;                     
  49.     }
  50.     if (RI)
  51.     {
  52.         RI = 0;                                 //清中断标志

  53.     }
  54. }
复制代码
回复

使用道具 举报

板凳
ID:213173 发表于 2022-2-28 06:03 | 只看该作者
改这样试试,未经验证,自行完善。
  1. #include  "stc8hxx.h"
  2. #include "adc.h"
  3. #include "intrins.h"

  4. typedef unsigned char u8;
  5. typedef unsigned int u16;

  6. unsigned int line_bat_0;                //通道0的ADC结果,送显示用的
  7. unsigned int line_bat_1;                //通道1的ADC结果,送显示用的
  8. unsigned int line_bat_2;                //通道2的ADC结果,送显示用的

  9. unsigned long int ADC_DATA0;        //           ADC0数据
  10. unsigned long int ADC_DATA1;        //           ADC1数据
  11. unsigned long int ADC_DATA2;        //           ADC2数据

  12. u8  count0;          //        ADC通道0转换次数记录
  13. u8  count1;          //        ADC通道1转换次数记录
  14. u8  count2;          //        ADC通道2转换次数记录
  15. u8  ADC_LINE;        //        ADC通道记录

  16. //ADC口初始化
  17. void STC8ADC_INIT()                         //STC8ADC初始化
  18. {
  19.         P1M0=0x00;
  20.         P1M1=0x07;             //设定P1.4567通道为高阻
  21.         P_SW2|=0X80;    //打开特殊功能寄存器
  22.         ADCTIM=0X3F;    //设置ADC内部时序
  23.         P_SW2&=0X7F;    //关闭特殊功能寄存器
  24.         ADCCFG=0x2f;             //设置ADC的时钟和转换结果存放格式
  25.         ADC_CONTR=0x80;    //使能ADC模块
  26.         ADC_LINE=0x80;     //通道0
  27.         DelayXms(5);      //等待5ms
  28.         ADC_CONTR=ADC_CONTR|0x40;        //启动ADC
  29.         EADC=1;            //打开ADC中断开关
  30. }               

  31. void UART1_Isr(unsigned char ADCch,unsigned char ADCcount,unsigned long int ADCadd)
  32. {       
  33.         unsigned char buf[8];
  34.         unsigned char i;
  35.         buf[0]=ADCch&0x0f;
  36.         buf[1]=ADCcount;
  37.         buf[2]=ADCadd>>24;
  38.         buf[3]=ADCadd>>16;
  39.         buf[4]=ADCadd>>8;
  40.         buf[5]=ADCadd;
  41.         for(i=0;i<6;i++)
  42.         {
  43.                 SBUF = buf[i];
  44.                 while(!TI);
  45.                 TI = 0;
  46.         }
  47. }

  48. void main()
  49. {
  50.         STC8ADC_INIT();
  51.         SCON = 0x50;
  52.         T2L = 0xe8;                                 //65536-11059200/115200/4=0FFE8H
  53.         T2H = 0xff;
  54.         AUXR = 0x15;                                //启动定时器
  55. //        ES = 1;                                     //使能串口中断
  56.         EA = 1;   
  57.         while(1);
  58. }

  59. void ADC_ISR()interrupt 5
  60. {        
  61.         //ADC_CONTR&=~0x20;
  62.         ADC_CONTR=ADC_CONTR&0xdf;        //清除中断标志位
  63. //=============================================================================================================
  64.         if(ADC_LINE==0x80)        //选择通道0
  65.         {  
  66.                 if(count0>=100)          //如果通道0转换次数小于32
  67.                 {        
  68.                         line_bat_0=ADC_DATA0/100;        
  69.                         ADC_DATA0=0x00;    //ADC0数据清零
  70.                         count0=0x00;       //通道0转换次数清零
  71.                 }
  72.                 ADC_DATA0=ADC_DATA0+(ADC_RES*256+ADC_RESL);        //ADC结果处理

  73.                 UART1_Isr(ADC_LINE,count0,ADC_DATA0);//串口发送数据

  74.                 count0++;            //通道0转换次数加1
  75.                 ADC_LINE=0x81;       //切换下一通道(通道1)
  76.                 ADC_CONTR=ADC_LINE;   //下一通道值赋给控制寄存器
  77.         }
  78. //====================================================================
  79.         else if(ADC_LINE==0x81)      //选择通道1
  80.         {  
  81.                 if(count1>=100)            //如果通道1转换次数小于32
  82.                 {
  83.                         line_bat_1=ADC_DATA1/100;
  84.                         ADC_DATA1=0x00;      //ADC1数据清零
  85.                         count1=0x00;         //通道1转换次数清零
  86.                 }
  87.                 ADC_DATA1=ADC_DATA1+(ADC_RES*256+ADC_RESL);        //ADC结果处理

  88.                 UART1_Isr(ADC_LINE,count1,ADC_DATA1);//串口发送数据

  89.                 count1++;                //通道1转换次数加1
  90.                 ADC_LINE=0x82;           //切换下一通道(通道2)
  91.                 ADC_CONTR=ADC_LINE;      //下一通道值赋给控制寄存器
  92.         }
  93. //=====================================================================
  94.         else if(ADC_LINE==0x82)     //选择通道2
  95.         {  
  96.                 if(count2<100)            //如果通道2转换次数小于32
  97.                 {
  98.                         line_bat_2=ADC_DATA2/100;
  99.                         ADC_DATA2=0x00;      //ADC2数据清零
  100.                         count2=0x00;         //通道2转换次数清零
  101.                 }
  102.                 ADC_DATA2=ADC_DATA2+(ADC_RES*256+ADC_RESL);        //ADC结果处理

  103.                 UART1_Isr(ADC_LINE,count2,ADC_DATA2);//串口发送数据

  104.                 count2++;              //通道2转换次数加1
  105.                 ADC_LINE=0x80;         //切换下一通道(通道0)
  106.                 ADC_CONTR=ADC_LINE;    //下一通道值赋给控制寄存器
  107.         }
  108. //=============================================================================================================                                   
  109.         ADC_CONTR=ADC_CONTR|0x40;        //启动ADC
  110. }
  111. //=========================================================================================
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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