|
本帖最后由 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;
}
}
|
|