找回密码
 立即注册
查看: 520|回复: 0

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

[复制链接]

该用户从未签到

42

主题

7

回帖

246

积分

中级会员

积分
246
发表于 2023-6-12 19:27:00 | 显示全部楼层 |阅读模式
每日学习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口输出高电平 风扇停止

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

04、STC8A8K64D4 14个AD 4个串口 5个定时器 综合程序.zip

591.13 KB, 下载次数: 28

回复 送花

使用道具 举报

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-19 11:45 , Processed in 0.058356 second(s), 33 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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