钰平电子 发表于 2023-6-12 19:27:00

每日学习STC8A8K64D单片机之14路ADC采集报警控制 5个定时器 4个串口 综合程序

每日学习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口输出高电平 风扇停止

      }
}
/**************程序结束****************/

页: [1]
查看完整版本: 每日学习STC8A8K64D单片机之14路ADC采集报警控制 5个定时器 4个串口 综合程序