- 打卡等级:初来乍到
- 打卡总天数:1
- 最近打卡:2025-03-17 16:39:04
中级会员
- 积分
- 253
|
每日学习STC8A8K64D单片机之14路ADC采集报警控制 5个定时器 4个串口 综合程序
声明】此程序仅用于学习与参考!
底层程序 来自STC官方例程
程序说明:
14路AD模拟量采集,将采集后的数据进行判断,是否高于设定阈值,高于设定阈值,对应的IO口输出低电平。
5路定时器选择定时器0 ,程序可以自由切换定时器,选择对应的定时器,将AD采集的数据,定时通过指定的串口发出对应的模拟量数据值。
4个串口可以自由选择。
源码在附件中,仅供参考,学习!
程序功能以验证,可以放心使用。
*********************************************************************/
#include "config.h"
#include "STC8A_GPIO.h"
#include "STC8A_ADC.h"
#include "STC8A_UART.h"
#include "STC8A_Delay.h"
#include "STC8A_NVIC.h"
#include "STC8A_Timer.h"
/************* 功能说明 **************
本程序演示16路ADC查询采样,通过串口发送给上位机,波特率9600,N,8,1。
用定时器做波特率发生器,建议使用1T模式(除非低波特率用12T),并选择可被波特率整除的时钟频率,以提高精度。
下载时, 选择时钟 11.0592MHz (可以在配置文件"config.h"中修改).
******************************************/
/************* 本地常量声明 **************/
sbit AD01= P0^6;//ADC14采集口 输入采集口
sbit AD02= P0^5;//ADC13采集口 输入采集口
sbit AD03= P1^0;//ADC00采集口 输入采集口
sbit AD04= P1^1;//ADC01采集口 输入采集口
sbit AD05= P1^2;//ADC02采集口 输入采集口
sbit AD06= P1^3;//ADC03采集口 输入采集口
sbit AD07= P1^4;//ADC04采集口 输入采集口
sbit AD08= P1^5;//ADC05采集口 输入采集口
sbit AD09= P1^6;//ADC06采集口 输入采集口
sbit AD10= P1^7;//ADC07采集口 输入采集口
sbit NTC1= P0^4;//ADC12采集口 温度采集口
sbit FS1 = P5^0;//冷却风扇控制口
sbit M01= P2^5;//AD01控制口 输出给树莓派
sbit M02= P2^4;//AD02控制口 输出给树莓派
sbit M03= P2^3;//AD03控制口 输出给树莓派
sbit M04= P2^2;//AD04控制口 输出给树莓派
sbit M05= P2^1;//AD05控制口 输出给树莓派
sbit M06= P2^0;//AD06控制口 输出给树莓派
sbit M07= P7^3;//AD07控制口 输出给树莓派
sbit M08= P7^2;//AD08控制口 输出给树莓派
sbit M09= P7^1;//AD09控制口 输出给树莓派
sbit M10= P7^0;//AD10控制口 输出给树莓派
u16 AD01_date=0;//模拟量数据
u16 AD02_date=0;//模拟量数据
u16 AD03_date=0;//模拟量数据
u16 AD04_date=0;//模拟量数据
u16 AD05_date=0;//模拟量数据
u16 AD06_date=0;//模拟量数据
u16 AD07_date=0;//模拟量数据
u16 AD08_date=0;//模拟量数据
u16 AD09_date=0;//模拟量数据
u16 AD10_date=0;//模拟量数据
u16 NTC1_date=0;//模拟量数据
u16 yssj=50;//延时时间
extern bit send_uart_bz;
extern u16 sjjs;
/************* 本地变量声明 **************/
/************* 本地函数声明 **************/
#define AD01_fa_zhi 1000 //第1路模拟量控制阀值
#define AD02_fa_zhi 1000 //第2路模拟量控制阀值
#define AD03_fa_zhi 1000 //第3路模拟量控制阀值
#define AD04_fa_zhi 1000 //第4路模拟量控制阀值
#define AD05_fa_zhi 1000 //第5路模拟量控制阀值
#define AD06_fa_zhi 1000 //第6路模拟量控制阀值
#define AD07_fa_zhi 1000 //第7路模拟量控制阀值
#define AD08_fa_zhi 1000 //第8路模拟量控制阀值
#define AD09_fa_zhi 1000 //第9路模拟量控制阀值
#define AD10_fa_zhi 1000 //第10路模拟量控制阀值
#define NTC_L_fa_zhi 1800 //温度低阀值模拟量控制阀值 NTC是负温度系数传感器 温度越高数值越小 温度越低数值越大
#define NTC_H_fa_zhi 1700 //温度高阀值模拟量控制阀值 NTC是负温度系数传感器 温度越高数值越小 温度越低数值越大
/************* 外部函数和变量声明 *****************/
/******************* IO配置函数 *******************/
void GPIO_config(void)
{
P0_MODE_IN_HIZ(GPIO_Pin_LOW | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6); //P0.0~P0.6 设置为高阻输入
P1_MODE_IN_HIZ(GPIO_Pin_All); //P1.0~P1.7 设置为高阻输入
P3_MODE_IO_PU(GPIO_Pin_0 | GPIO_Pin_1); //P3.0,P3.1 设置为准双向口
P2_MODE_IO_PU(GPIO_Pin_All); //P2设置为准双向口
P5_MODE_IO_PU(GPIO_Pin_All); //P5设置为准双向口
P7_MODE_IO_PU(GPIO_Pin_All); //P7设置为准双向口
}
/******************* AD配置函数 *******************/
void ADC_config(void)
{
ADC_InitTypeDef ADC_InitStructure; //结构定义
ADC_InitStructure.ADC_SMPduty = 31; //ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)
ADC_InitStructure.ADC_CsSetup = 0; //ADC 通道选择时间控制 0(默认),1
ADC_InitStructure.ADC_CsHold = 1; //ADC 通道选择保持时间控制 0,1(默认),2,3
ADC_InitStructure.ADC_Speed = ADC_SPEED_2X1T; //设置 ADC 工作时钟频率 ADC_SPEED_2X1T~ADC_SPEED_2X16T
ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED; //ADC结果调整, ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
ADC_Inilize(&ADC_InitStructure); //初始化
ADC_PowerControl(ENABLE); //ADC电源开关, ENABLE或DISABLE
NVIC_ADC_Init(DISABLE,Priority_0); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}
/*************** 串口初始化函数 *****************/
void UART_config(void)
{
COMx_InitDefine COMx_InitStructure; //结构定义
COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
COMx_InitStructure.UART_BRT_Use = BRT_Timer1; //使用波特率, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
COMx_InitStructure.UART_BaudRate = 9600; //波特率, 110 ~ 115200
COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE
UART_Configuration(UART1, &COMx_InitStructure); //初始化串口2 USART1,USART2,USART3,USART4
NVIC_UART1_Init(ENABLE,Priority_1); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}
/************************ 定时器配置 ****************************/
void Timer_config(void)
{
TIM_InitTypeDef TIM_InitStructure; //结构定义
TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
TIM_InitStructure.TIM_ClkOut = DISABLE; //是否输出高速脉冲, ENABLE或DISABLE
TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 100000UL); //初值,
TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE
Timer_Inilize(Timer0,&TIM_InitStructure); //初始化Timer0 Timer0,Timer1,Timer2,Timer3,Timer4
NVIC_Timer0_Init(ENABLE,Priority_0); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
// TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
// TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
// TIM_InitStructure.TIM_ClkOut = DISABLE; //是否输出高速脉冲, ENABLE或DISABLE
// TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 10000); //初值,
// TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE
// Timer_Inilize(Timer1,&TIM_InitStructure); //初始化Timer1 Timer0,Timer1,Timer2,Timer3,Timer4
// NVIC_Timer1_Init(ENABLE,Priority_0); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
// TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
// TIM_InitStructure.TIM_ClkOut = DISABLE; //是否输出高速脉冲, ENABLE或DISABLE
// TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 1000); //初值
// TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE
// Timer_Inilize(Timer2,&TIM_InitStructure); //初始化Timer2 Timer0,Timer1,Timer2,Timer3,Timer4
// NVIC_Timer2_Init(ENABLE,NULL); //中断使能, ENABLE/DISABLE; 无优先级
// TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
// TIM_InitStructure.TIM_ClkOut = ENABLE; //是否输出高速脉冲, ENABLE或DISABLE
// TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / (100*12)); //初值
// TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE
// Timer_Inilize(Timer3,&TIM_InitStructure); //初始化Timer3 Timer0,Timer1,Timer2,Timer3,Timer4
// NVIC_Timer3_Init(ENABLE,NULL); //中断使能, ENABLE/DISABLE; 无优先级
// TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
// TIM_InitStructure.TIM_ClkOut = ENABLE; //是否输出高速脉冲, ENABLE或DISABLE
// TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / (50*12)); //初值
// TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE
// Timer_Inilize(Timer4,&TIM_InitStructure); //初始化Timer4 Timer0,Timer1,Timer2,Timer3,Timer4
// NVIC_Timer4_Init(ENABLE,NULL); //中断使能, ENABLE/DISABLE; 无优先级
}
/**********************************************/
/**********************************************/
void main(void)
{
// u8 i;
// u16 j;
GPIO_config();
UART_config();
ADC_config();
Timer_config();
EA = 1;
while (1)
{
if(send_uart_bz==1)
{
AD01_date = Get_ADCResult(14);printf("AD%02bd=%04d ",1,AD01_date); //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
AD02_date = Get_ADCResult(13);printf("AD%02bd=%04d ",2,AD02_date); //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
AD03_date = Get_ADCResult(0);printf("AD%02bd=%04d ",3,AD03_date); //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
AD04_date = Get_ADCResult(1);printf("AD%02bd=%04d ",4,AD04_date); //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
AD05_date = Get_ADCResult(2);printf("AD%02bd=%04d ",5,AD05_date); //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
AD06_date = Get_ADCResult(3);printf("AD%02bd=%04d ",6,AD06_date); //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
AD07_date = Get_ADCResult(4);printf("AD%02bd=%04d ",7,AD07_date); //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
AD08_date = Get_ADCResult(5);printf("AD%02bd=%04d ",8,AD08_date); //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
AD09_date = Get_ADCResult(6);printf("AD%02bd=%04d ",9,AD09_date); //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
AD10_date = Get_ADCResult(7);printf("AD%02bd=%04d ",10,AD10_date); //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
NTC1_date = Get_ADCResult(12);printf("ADNTC=%04d ",NTC1_date); //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
printf("\r\n"); //换行
send_uart_bz=0;
}
if(AD01_date>AD01_fa_zhi){M01=0;}else{M01=1;}//当第1路模拟量大于阀值时,对应IO口输出低电平
if(AD02_date>AD02_fa_zhi){M02=0;}else{M02=1;}//当第2路模拟量大于阀值时,对应IO口输出低电平
if(AD03_date>AD03_fa_zhi){M03=0;}else{M03=1;}//当第3路模拟量大于阀值时,对应IO口输出低电平
if(AD04_date>AD04_fa_zhi){M04=0;}else{M04=1;}//当第4路模拟量大于阀值时,对应IO口输出低电平
if(AD05_date>AD05_fa_zhi){M05=0;}else{M05=1;}//当第5路模拟量大于阀值时,对应IO口输出低电平
if(AD06_date>AD06_fa_zhi){M06=0;}else{M06=1;}//当第6路模拟量大于阀值时,对应IO口输出低电平
if(AD07_date>AD07_fa_zhi){M07=0;}else{M07=1;}//当第7路模拟量大于阀值时,对应IO口输出低电平
if(AD08_date>AD08_fa_zhi){M08=0;}else{M08=1;}//当第8路模拟量大于阀值时,对应IO口输出低电平
if(AD09_date>AD09_fa_zhi){M09=0;}else{M09=1;}//当第9路模拟量大于阀值时,对应IO口输出低电平
if(AD10_date>AD10_fa_zhi){M10=0;}else{M10=1;}//当第10路模拟量大于阀值时,对应IO口输出低电平
if(NTC1_date>NTC_H_fa_zhi){FS1 =1;}//当温度大于阀值时,对应IO口输出低电平 风扇启动
if(NTC1_date<=NTC_L_fa_zhi) {FS1 =0;}//当温度大于阀值时,对应IO口输出高电平 风扇停止
}
}
/**************程序结束****************/
|
|