STC8H1K17T-TSSOP20系列实验之二----ADC测试
本帖最后由 xxkj2010 于 2023-12-27 08:13 编辑自制的STC8H1K17T-TSSOP20测试板,插入tm1637四位数码管模块作为显示。
从stc-isp工具的ADC(中断模式)例程中复制几行代码,随即进行ADC测量实验。
测试板上的ADC可调电阻中心抽头接的是P33,
通过查看手册,是选中了第11通道ADC,所以例程中的通道必须修改一下。
主要代码随后贴出,欢迎大佬指教。
main.c
#include "STC8H.h"
#include <intrins.h>
#include <stdio.h>
#include "config.h"
#include "delay.h"
//#include "key.h"
#include "WS2812.h"
#include "IRC.h"
#include "TM1637.h"
bit fBusy; //串口发送忙标志
u8 bStage; //用户自定义命令检测阶段
#define CPUIDBASE 0xfde0
#define ID_ADDR ((unsigned char volatile xdata *)(CPUIDBASE + 0x00))
#define ADCTIM(*(unsigned char volatile xdata *)0xfea8)
uint cp;
u8 ADCval; //ADC测量结果
/*******************************************************************************
*******************************************************************************/
void UartInit();//串口、定时器初始化
void Timer0_Init(void); //100微秒+16位自动装载+12T模式@24.000MHz
void CheckCustomCmd(u8 dat);//自动下载检测
void main()
{
uchar i=1,d;
//以下初始化
fBusy = 0;
delay_us(1);
delay_ms(1500);//等待稳定
UartInit();//串口、定时器初始化
while(1)
{
if(cp>5000)
{
LED=!LED;
cp=0;
TM1637_display(ADCval/16,ADCval%16,21 ,21, 0); // 按顺序显示
printf("ADC:0x%x\r\n",(u16)ADCval);
}
}
}
void UartInit()//串口及定时器初始化
{
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P5M0 = 0x10; P5M1 = 0x00;
//以下设置内部IRC频率
P_SW2 |= 0x80;//使能访问XFR
SetIRC();//手动设置内部IRC频率
//以下设置定时器0
Timer0_Init() ; //100微秒@24.000MHz
#if defined BRT_T1
AUXR = 0x40; //使用定时器1作为串口波特率发生器
TMOD = 0x00;
TL1 = BAUD;
TH1 = BAUD >> 8;
TR1 = 1;
#elif defined BRT_T2
T2L = BAUD; //使用定时器2作为串口波特率发生器
T2H = BAUD >> 8;
AUXR = 0x15;
#else
#error "Baudrate generator select error !"
#endif
SCON = 0x50;
ES = 1;
EA=1;//
P3M0 = 0x00; P3M1 = 0x08; //设置P33为ADC输入口
P_SW2 |= 0x80;
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2 &= 0x7f;
ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0x8B; //开启ADC电源,选择第11通道ADC
EADC = 1; //使能ADC中断
// EA = 1;
ADC_CONTR |= 0x40; //启动AD转换
}
void CheckCustomCmd(u8 dat) //检测命令序列:"@STCISP#"
{
switch (bStage++)
{
default:
L_Check1st:
case 0: //检测命令头
bStage = (dat == '@');
break;
case 1:
if (dat != 'S') goto L_Check1st;
break;
case 2:
if (dat != 'T') goto L_Check1st;
break;
case 3:
if (dat != 'C') goto L_Check1st;
break;
case 4:
if (dat != 'I') goto L_Check1st;
break;
case 5:
if (dat != 'S') goto L_Check1st;
break;
case 6:
if (dat != 'P') goto L_Check1st;
break;
case 7:
if (dat != '#') goto L_Check1st;
delay_ms(10); //检测到正确的命令序列后复位到系统区,此处的延时可省去
IAP_CONTR = 0x60; //复位到系统区
break;
}
}
char putchar(char dat) //重定义putchar系统函数
{
while (fBusy);
fBusy = 1;
SBUF = dat;
return dat;
}
void uart_isr() interrupt 4
{
if (TI)
{
TI = 0;
fBusy = 0;
}
if (RI)
{
RI = 0;
CheckCustomCmd(SBUF); //检测命令序列
}
}
void Timer0_Isr(void) interrupt 1
{
cp++;
}
void Timer0_Init(void) //100微秒+16位自动装载+12T模式@24.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x38; //设置定时初始值
TH0 = 0xFF; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器
}
void ADC_Isr() interrupt 5
{
ADC_CONTR &= ~0x20; //清中断标志
ADCval = ADC_RES; //读取ADC结果
ADC_CONTR |= 0x40; //继续AD转换
}
上面代码大多来源于本论坛或stc-isp,谢谢各位大佬的分享和STC工作人员的辛劳!
tm1637的驱动程序能贴出来借鉴一下吗 ljm10000 发表于 2025-1-5 13:27
tm1637的驱动程序能贴出来借鉴一下吗
https://www.stcaimcu.com/forum.p ... =1&extra=#pid110798
从网上下载下来的,修改一下引脚定义,基本都可以用
页:
[1]