|
问题:目前是使用定时器0的T0外部计数输入,然后使用定时器1每隔1ms取定时器0的TH,TL值一次,并将TH,TL值赋值为0;目前出来的数据很乱,不知道为什么。请帮我看看程序是否有问题吧?
#include "config.h"
//#include "STC8G_PCA.h"
#include "STC8G_H_GPIO.h"
#include "STC8G_H_UART.h"
#include "STC8G_H_NVIC.h"
#include "STC8G_H_Delay.h"
#include "STC8G_H_Switch.h"
#include "STC8G_H_Timer.h"
/************* 功能说明 ***************
本例程基于STC8G1K08-20PIN进行编写测试,STC8G系列芯片可通用参考.
/******************** IO口配置 ********************/
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //结构定义
GPIO_InitStructure.Pin = GPIO_Pin_All; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P1,&GPIO_InitStructure); //初始化
GPIO_InitStructure.Pin = GPIO_Pin_2; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P1,&GPIO_InitStructure); //初始化
GPIO_InitStructure.Pin = GPIO_Pin_7; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P3,&GPIO_InitStructure); //初始化
GPIO_InitStructure.Pin = GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
GPIO_InitStructure.Mode = GPIO_HighZ; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P3,&GPIO_InitStructure); //初始化
}
/*************** 串口初始化函数 *****************/
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_Timer2; //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
COMx_InitStructure.UART_BaudRate = 115200; //波特率, 一般 110 ~ 115200
COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE
COMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLE
UART_Configuration(UART2, &COMx_InitStructure); //初始化串口1 UART1,UART2,UART3,UART4
NVIC_UART2_Init(ENABLE,Priority_3); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
UART2_SW(UART2_SW_P10_P11); //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}
void Timer1_config(void)
{
TMOD =0x00;
TL1 = 0X66; //65536-11.0592M/12/1000
TH1 = 0XFC;
TR1 = 1; //启动定时器
ET1 = 1; //使能定时器中断
IPH=IPH|PT1H;
PT1 =1;
}
void Timer0_config(void)
{
TMOD=0x04; //外部计数模式,自动重载值
TL0 =0X0;
TH0 =0X0;
TR0 = 1; //启动定时器
ET0 = 1; //使能定时器中断
IPH =IPH;
PT0 = 1;
}
u16 CYCLE_COUNT=0,CYCLE_COUNT_L=0,th=0,tl=0;
u32 CYCLE_COUNT1=0;
u8 CYCLE_COUNT_H=0;
void Timer1_ISR_Handler (void) interrupt TMR1_VECTOR //进中断时已经清除标志
{
th=TH0;tl=TL0;CYCLE_COUNT=th*0xff+tl;
TH0=0;TL0=0;
CYCLE_COUNT1++;
if(CYCLE_COUNT1>1000){CYCLE_COUNT1=0;OUT_PIN=!OUT_PIN;}
}
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR //进中断时已经清除标志
{
}
void main(void)
{
EAXSFR(); /* 扩展寄存器访问使能 */
GPIO_config();
UART_config();
Timer1_config();
Timer0_config();
// INTCLKO = 0x10;
// IPH=IPH|PX1H;
AUXR=AUXR|0x80;
EA = 1;
printf("****************printf test********************** \r\n");
while(1)//改为1ms计数一次判断高低电平
{
printf("CYCLE_COUNT=%u\n",CYCLE_COUNT);
CYCLE_COUNT=0;
delay_ms(100);
}
}
|
|