标题:
Stc8h3K单片机ADC结果,串口助手如何打印显示?
[打印本页]
作者:
zhth1979
时间:
2022-2-27 18:36
标题:
Stc8h3K单片机ADC结果,串口助手如何打印显示?
本帖最后由 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; //清中断标志
}
}
作者:
lkc8210
时间:
2022-2-27 21:50
给你一个思路
#include "stc8hxx.h"
#include "adc.h"
#include "intrins.h"
char line_bat_0_Str[] = {"0000"};
void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}
void UartSendStr(char *p)
{
while (*p)
{
UartSend(*p++);
}
}
void main()
{
STC8ADC_INIT();
SCON = 0x50;
T2L = 0xe8; //65536-11059200/115200/4=0FFE8H
T2H = 0xff;
AUXR = 0x15; //启动定时器
ES = 1; //使能串口中断
EA = 1;
if(line_bat_0)
{
line_bat_0_Str[3] = line_bat_0 % 10 + '0';
line_bat_0/= 10;
line_bat_0_Str[2] = line_bat_0 % 10 + '0';
line_bat_0/= 10;
line_bat_0_Str[1] = line_bat_0 % 10 + '0';
line_bat_0/= 10;
line_bat_0_Str[0] = line_bat_0 % 10 + '0';
line_bat_0/= 10;
UartSendStr("Line bat 0: "};
UartSendStr(line_bat_0_Str};
UartSendStr("\r\n"};
}
}
void UART1_Isr() interrupt 4
{
if (TI)
{
TI = 0; //清中断标志
busy = 0;
}
if (RI)
{
RI = 0; //清中断标志
}
}
复制代码
作者:
wulin
时间:
2022-2-28 06:03
改这样试试,未经验证,自行完善。
#include "stc8hxx.h"
#include "adc.h"
#include "intrins.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 UART1_Isr(unsigned char ADCch,unsigned char ADCcount,unsigned long int ADCadd)
{
unsigned char buf[8];
unsigned char i;
buf[0]=ADCch&0x0f;
buf[1]=ADCcount;
buf[2]=ADCadd>>24;
buf[3]=ADCadd>>16;
buf[4]=ADCadd>>8;
buf[5]=ADCadd;
for(i=0;i<6;i++)
{
SBUF = buf[i];
while(!TI);
TI = 0;
}
}
void main()
{
STC8ADC_INIT();
SCON = 0x50;
T2L = 0xe8; //65536-11059200/115200/4=0FFE8H
T2H = 0xff;
AUXR = 0x15; //启动定时器
// ES = 1; //使能串口中断
EA = 1;
while(1);
}
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结果处理
UART1_Isr(ADC_LINE,count0,ADC_DATA0);//串口发送数据
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结果处理
UART1_Isr(ADC_LINE,count1,ADC_DATA1);//串口发送数据
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结果处理
UART1_Isr(ADC_LINE,count2,ADC_DATA2);//串口发送数据
count2++; //通道2转换次数加1
ADC_LINE=0x80; //切换下一通道(通道0)
ADC_CONTR=ADC_LINE; //下一通道值赋给控制寄存器
}
//=============================================================================================================
ADC_CONTR=ADC_CONTR|0x40; //启动ADC
}
//=========================================================================================
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1