找回密码
 立即注册
查看: 113|回复: 3

STC8A8K64D4使用T1(P3.5脚)计数模式不能得到正确次数是什么问题

[复制链接]

该用户从未签到

1

主题

1

回帖

21

积分

新手上路

积分
21
发表于 2023-6-18 16:37:56 | 显示全部楼层 |阅读模式
本帖最后由 zhiwen123 于 2023-6-18 16:56 编辑

使用P3.5进行按键次数统计(P3.5按下接通GND),T1外部引脚P3.5计数模式,变量mc_js记录总按下次数,使用T0定时,每1秒更新mc_js,现象是每按一次计数值不是加1,而是没规律乱变,以下是工程代码,群里大佬能帮看看什么问题吗,,小弟感激涕零


#include<STC8A8K64D4.H>
#include    "intrins.h"
#define MCU_1
#define MAIN_Fosc 24000000L
#define MODBUS_TIMEOUT 10
#define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中断频率, 1000次/秒

typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;
bit B_TX4_Busy; //发送忙标志
bit modbus_recv_complete;
u16 t0_cnt;
u16 idata t0_js;
u16 xdata mc_js;
u16 xdata modbus_recv_timeout;
u8 xdata RX4_Buffer[48];
u8 xdata TX4_Buffer[48];
u16 xdata adc0_num;
u16 xdata adc1_num;
u16 xdata adc2_num;
u16 xdata adc3_num;
u16 xdata adc4_num;
u16 xdata adc5_num;
u16 xdata adc6_num;
u16 xdata adc7_num;
u16 xdata adc8_num;
u16 xdata adc9_num;
u16 xdata adc10_num;
u16 xdata adc11_num;
u16 xdata adc12_num;
u16 xdata adc13_num;
u16 xdata adc14_num;

u8 RX4_cnt;
u16 xdata jizhun;
u32 xdata tempu32;
void init_timer0(void)
{
    AUXR = 0xc0;    //Timer0,1 set as 1T, 16 bits timer auto-reload,
    TH0 = (u8)(Timer0_Reload / 256);
    TL0 = (u8)(Timer0_Reload % 256);
    ET0 = 1;    //Timer0 interrupt enable
//    TR0 = 1;    //Tiner0 run        
    }
void init_timer1(void)
{
    TMOD |= 0x40;          //使能T1外部计数模式0   
    TH1 = 0;
    TL1 = 0;
    ET1 = 0;
//    TR1 = 1;                //启动定时器T1
    }
void init_uart(void)//timer4做uart串口波特率24MHZ,9600
{
    S4CON = 0x50;       //8位数据, 使用Timer4做波特率发生器, 允许接收
    T4H = (65536UL - (24000000L / 4) / 9600) / 256;
    T4L = (65536UL - (24000000L / 4) / 9600) % 256;
    T4T3M = 0xa0;   
    IE2 |= 0x10;          //允许UART4中断
    P_SW2 |= 0x04;//uart4,端口P5.2,P5.3
    }
void init_adc(void)
{
//    P1M1 = 0x08;   P1M0 = 0x00;   //设置 P1.3 为 ADC 输入口   
    P_SW2 |= 0x80;
    ADCTIM = 0x3f;                //设置 ADC 内部时序,ADC采样时间建议设最大值
    P_SW2 &= 0x7f;
    ADCCFG = 0x2f;                //设置 ADC 时钟为系统时钟/2/16,750khz
    ADC_CONTR = 0x80; //使能 ADC 模块
    }

u16 Get_ADC12bitResult(u8 channel)  //channel = 0~15
{
    ADC_RES = 0;
    ADC_RESL = 0;

    ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel;    //启动 AD 转换
    _nop_();
    _nop_();
    _nop_();
    _nop_();

    while((ADC_CONTR & 0x20) == 0)  ;   //wait for ADC finish
    ADC_CONTR &= ~0x20;     //清除ADC结束标志
    return  (((u16)ADC_RES << 8) | ADC_RESL);
}

void senddata(u8 *p,u8 num)
{
    u8 i;
    for(i = 0;i < num;i++)
    {        
        S4BUF = *p++;
        B_TX4_Busy = 1;
        while(B_TX4_Busy);        
        }
   
    }


void init_gpio(void)
{

    P0M1 = 0x7f;P0M0 = 0x00;
    P1M1 = 0xff;P1M0 = 0x00;
    P3M1 = 0x30;P3M0 = 0x00;   //P3.4,P3.5设置为输入口
    P_SW2 |= 0x80;
    P3PU = 0x30;            //P3.4,P3.5使能内部4.1K上拉电阻
    P_SW2 &= 0x7f;

    }
void main(void)
{
   
    P_SW2 = 0x80;
    CLKSEL = 0x00;//内部IRC,24MHZ
    CLKDIV = 0x00;//1分频
    HIRCCR = 0x80; //启动内部 IRC
    IRC32KCR = 0X00;//关闭32K时钟
//    MCLKOCR = 0X08;//输出时钟/8,P5.4口
//    P5M0 = 0x00;
//    P5M1 = 0x00;
    P_SW2 = 0x00;   
    while (!(HIRCCR & 1)); //等待时钟稳定
    init_gpio();
    init_adc();
    init_timer0();
    init_timer1();
    init_uart();
    EA = 1;
    INTCLKO &= ~0x03;      //T0,T1不输出时钟
    TF0 = 0;
    TF1 = 0;
    t0_cnt = 0;
    TR0 = 1;
    TR1 = 1;
    RX4_cnt = 0;
    t0_js = 0;
    mc_js = 0;
    while(1)
    {
        
        
        if(t0_cnt >= 200)//采集频率5hz
        {
            t0_cnt = 0;
            jizhun = Get_ADC12bitResult(15);
            tempu32 = (u32)Get_ADC12bitResult(0);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc0_num = (u16)tempu32;            
            tempu32 = (u32)Get_ADC12bitResult(1);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc1_num = (u16)tempu32;            
            tempu32 = (u32)Get_ADC12bitResult(2);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc2_num = (u16)tempu32;            
            tempu32 = (u32)Get_ADC12bitResult(3);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc3_num = (u16)tempu32;
            tempu32 = (u32)Get_ADC12bitResult(4);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc4_num = (u16)tempu32;            
            tempu32 = (u32)Get_ADC12bitResult(5);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc5_num = (u16)tempu32;
            tempu32 = (u32)Get_ADC12bitResult(6);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc6_num = (u16)tempu32;            
            tempu32 = (u32)Get_ADC12bitResult(7);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc7_num = (u16)tempu32;            
            tempu32 = (u32)Get_ADC12bitResult(8);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc8_num = (u16)tempu32;            
            tempu32 = (u32)Get_ADC12bitResult(9);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc9_num = (u16)tempu32;            
            tempu32 = (u32)Get_ADC12bitResult(10);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc10_num = (u16)tempu32;            
            tempu32 = (u32)Get_ADC12bitResult(11);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc11_num = (u16)tempu32;            
            tempu32 = (u32)Get_ADC12bitResult(12);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc12_num = (u16)tempu32;            
            tempu32 = (u32)Get_ADC12bitResult(13);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc13_num = (u16)tempu32;            
            tempu32 = (u32)Get_ADC12bitResult(14);
            tempu32 *= 119;
            tempu32 /= jizhun;
            adc14_num = (u16)tempu32;
            }
        
        }   
    }



void UART4_int(void) interrupt 18
{
    if((S4CON & 0x01) != 0)
    {
        S4CON &= ~0x01;    //Clear Rx flag
        RX4_Buffer[RX4_cnt++] = S4BUF;
        }

    if((S4CON & 0x02) != 0)
    {
        S4CON &= ~0x02;    //Clear Tx flag
        B_TX4_Busy = 0;
        }
}   

void timer0 (void) interrupt 1
{
    t0_cnt++;
    t0_js++;
   
    if(t0_js > 100)
    {
        t0_js = 0;
        mc_js = TH1;
        mc_js <<= 8;
        mc_js |= (u16)TL1;
//        TH1 = 0;
//        TL1 = 0;
        }
   
    }



   
   

回复 送花

使用道具 举报

该用户从未签到

552

主题

9482

回帖

1万

积分

管理员

积分
14047
发表于 2023-6-18 16:46:19 | 显示全部楼层
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

1

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2023-6-18 17:58:04 | 显示全部楼层
神农鼎 发表于 2023-6-18 16:46
用仿真功能进去看下

测试的数据有点像当按下时,TH1,TL1记录的是系统时钟震荡数据,不断往上加,按短一些,增量小,按长一些增量大

点评

zhp
按键有抖动,需要进行去抖动处理 简单一点,可以从另外一个IO输出方波,然后接到P3.5口  详情 回复 发表于 2023-6-19 16:31
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    6 天前
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    16

    主题

    724

    回帖

    2578

    积分

    超级版主

    积分
    2578
    发表于 2023-6-19 16:31:12 | 显示全部楼层
    zhiwen123 发表于 2023-6-18 17:58
    测试的数据有点像当按下时,TH1,TL1记录的是系统时钟震荡数据,不断往上加,按短一些,增量小,按长一些 ...

    按键有抖动,需要进行去抖动处理
    简单一点,可以从另外一个IO输出方波,然后接到P3.5口来验证
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-17 18:25 , Processed in 0.070746 second(s), 45 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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