C51 COMPILER V9.59.0.0 MAIN 06/10/2021 15:50:11 PAGE 1 C51 COMPILER V9.59.0.0, COMPILATION OF MODULE MAIN OBJECT MODULE PLACED IN .\list\main.obj COMPILER INVOKED BY: C:\Keil_v5\C51\BIN\C51.EXE main.c OMF2 OPTIMIZE(8,SPEED) BROWSE DEBUG PRINT(.\list\main.lst) TABS(2 -) OBJECT(.\list\main.obj) line level source 1 /*---------------------------------------------------------------------*/ 2 /* --- STC MCU Limited ------------------------------------------------*/ 3 /* --- STC 1T Series MCU Demo Programme -------------------------------*/ 4 /* --- Mobile: (86)13922805190 ----------------------------------------*/ 5 /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/ 6 /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/ 7 /* --- Web: www.STCMCU.com --------------------------------------------*/ 8 /* --- Web: www.STCMCUDATA.com ---------------------------------------*/ 9 /* --- QQ: 800003751 -------------------------------------------------*/ 10 /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */ 11 /*---------------------------------------------------------------------*/ 12 13 #include "config.h" 14 #include "STC8A_PCA.h" 15 #include "STC8A_GPIO.h" 16 #include "STC8A_NVIC.h" 17 #include "STC8A_UART.h" 18 #include "STC8A_Delay.h" 19 #include "STC8A_Switch.h" 20 21 /************* 功能说明 *************** 22 23 PCA0 设置为8位PWM, P1.7输出变化的PWM信号, 类似"呼吸灯"的驱动. 24 PCA1 设置为捕获. 可以连接到P1.7或者P1.5用来测试捕获, 捕获的时钟数从串口1输出. 也可以从外部输入一个信号来� -痘�. 25 PCA2 设置为16位软件定时, 定时时间为15000个PCA时钟, 并且从P1.5输出这个信号,输出周期为30000个PCA时钟. 26 PCA3 设置为10位PWM, P1.4输出固定的PWM信号. 27 28 捕获脉宽时间=捕获的时钟数/PCA时钟源, 比如 捕获的时钟数 = 256, PCA时钟源 = 22.1184MHz(1T), 脉宽 = 256/22.11 -84MHz = 11.57us. 29 30 下载时, 选择时钟 22.1184MHz (用户可在"config.h"修改频率). 31 32 ******************************************/ 33 34 /************* 本地常量声明 **************/ 35 36 37 /************* 本地变量声明 **************/ 38 39 u8 cnt0; 40 u8 pwm0; //pwm 41 bit B_PWM0_Dir; //方向, 0为+, 1为-. 42 43 /************* 本地函数声明 **************/ 44 45 46 /************* 外部函数和变量声明 *****************/ 47 48 49 /******************** IO口配置 ********************/ 50 void GPIO_config(void) 51 { 52 1 P1_MODE_IN_HIZ(GPIO_Pin_6); //P1.6 设置为高阻输入 C51 COMPILER V9.59.0.0 MAIN 06/10/2021 15:50:11 PAGE 2 53 1 P1_MODE_IO_PU(GPIO_Pin_7 | GPIO_Pin_5 | GPIO_Pin_4); //P1.7,P1.5,P1.4 设置为准双向口 54 1 } 55 56 /*************** 串口初始化函数 *****************/ 57 void UART_config(void) 58 { 59 1 COMx_InitDefine COMx_InitStructure; //结构定义 60 1 61 1 COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART -_9bit_BRTx 62 1 COMx_InitStructure.UART_BRT_Use = BRT_Timer1; //使用波特率, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使 -用BRT_Timer2) 63 1 COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200 64 1 COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE 65 1 COMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLE 66 1 UART_Configuration(UART1, &COMx_InitStructure); //初始化串口1 UART1,UART2,UART3,UART4 67 1 NVIC_UART1_Init(ENABLE,Priority_1); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Pri -ority_2,Priority_3 68 1 } 69 70 /******************** PCA配置 ********************/ 71 void PCA_config(void) 72 { 73 1 PCA_InitTypeDef PCA_InitStructure; 74 1 75 1 PCA_InitStructure.PCA_PWM_Wide = PCA_PWM_8bit; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit, PCA_PWM_10bit 76 1 PCA_InitStructure.PCA_Value = 128 << 8; //对于PWM,高8位为PWM占空比 77 1 PCA_Init(PCA0,&PCA_InitStructure); 78 1 79 1 PCA_InitStructure.PCA_PWM_Wide = 0; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit, PCA_PWM_10bit 80 1 PCA_InitStructure.PCA_Value = 0; //对于捕获, 这个值没意义 81 1 PCA_Init(PCA1,&PCA_InitStructure); 82 1 83 1 PCA_InitStructure.PCA_PWM_Wide = 0; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit, PCA_PWM_10bit 84 1 PCA_InitStructure.PCA_Value = 15000; //对于软件定时, 为匹配比较值 85 1 PCA_Init(PCA2,&PCA_InitStructure); 86 1 87 1 PCA_InitStructure.PCA_PWM_Wide = PCA_PWM_10bit; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit, PCA_PWM_10bi -t 88 1 PCA_InitStructure.PCA_Value = 256 << 8; //对于PWM,高8位为PWM占空比 89 1 PCA_Init(PCA3,&PCA_InitStructure); 90 1 91 1 PCA_InitStructure.PCA_Clock = PCA_Clock_1T; //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, - PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECI 92 1 PCA_InitStructure.PCA_RUN = ENABLE; //ENABLE, DISABLE 93 1 PCA_Init(PCA_Counter,&PCA_InitStructure); //设置公用Counter 94 1 95 1 NVIC_PCA_Init(PCA_Counter,DISABLE,Priority_0); 96 1 NVIC_PCA_Init(PCA0,PCA_Mode_PWM,Priority_0); //PWM 97 1 NVIC_PCA_Init(PCA1,PCA_Mode_Capture,Priority_0); //Capture 98 1 NVIC_PCA_Init(PCA2,PCA_Mode_HighPulseOutput,Priority_0); //HighPulseOutput 99 1 NVIC_PCA_Init(PCA3,PCA_Mode_PWM,Priority_0); //PWM 100 1 101 1 UpdatePcaPwm(PCA3,500); 102 1 } 103 104 105 /******************** task A **************************/ 106 void main(void) 107 { 108 1 GPIO_config(); 109 1 UART_config(); C51 COMPILER V9.59.0.0 MAIN 06/10/2021 15:50:11 PAGE 3 110 1 PCA_config(); 111 1 EA = 1; 112 1 113 1 pwm0 = 128; 114 1 B_PWM0_Dir = 0; 115 1 116 1 printf("STC8A8K64D4 PCA Test Programme!\r\n"); //UART1发送一个字符串 117 1 118 1 while (1) 119 1 { 120 2 delay_ms(1); 121 2 122 2 if(B_Capture1) 123 2 { 124 3 B_Capture1 = 0; 125 3 //捕获脉宽时间=CCAP1_tmp/PCA_Clock, 比如 CCAP1_tmp = 256, PCA_Clock = 22.1184MHz(1T), 脉宽 = 256/22.118 -4MHz = 11.57us 126 3 printf("Capture=%d\r\n",CCAP1_tmp); 127 3 } 128 2 129 2 cnt0++; 130 2 if((cnt0 & 15) == 15) //16ms 131 2 { 132 3 if(B_PWM0_Dir) 133 3 { 134 4 if(--pwm0 <= 8) B_PWM0_Dir = 0; 135 4 } 136 3 else if(++pwm0 >= 248) B_PWM0_Dir = 1; 137 3 UpdatePcaPwm(PCA0,pwm0); 138 3 } 139 2 } 140 1 } 141 142 143 MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 303 ---- CONSTANT SIZE = 47 ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = 2 14 IDATA SIZE = ---- ---- BIT SIZE = 1 ---- EDATA SIZE = ---- ---- HDATA SIZE = ---- ---- XDATA CONST SIZE = ---- ---- FAR CONST SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)