|
本帖最后由 工控单片机 于 2023-7-18 22:33 编辑
问题描述:1.TH1和TL1的值在定时器1ms中断服务函数里计时2000ms时,Tim_Count被成功清零,TH1和TL1没有被清零。T1按键也就是P35我不按他的情况下,TH1和TL1无规律的几分钟加1.以下是我的代码,求计数大佬指教。有人说TR1=0以后才能给TH1和TL1清零,有人说不用,我试过了,TR1=0后确实能清零,但是马达计数效果不理想。冲哥视频中也没先给TR1=0后再清零。然后再在定时器0中给TR1=1.希望有大佬答疑。
#include "stc.h"
#include "usb.h"
#include "math.h"
#define KEY1 P32
#define KEY2 P33
#define BEEP P54
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#"; //设置自动复位到ISP区的用户接口命令
u8 Num_Geg[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0xff};//0-9数码管显示, 段码,0.-9.带小数点。
u8 Com_tab[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//从左到右1-8位数码管的位码
u8 Show_tab[8]={20,20,20,20,0,0,0,0};//右边到左边倒数第三个数组填10,数码管显示“0.”这里显示的内容可以用来灵活替换Num_Geg内容
u8 num =0;
u32 Tim_Count = 0;//计时1ms
u16 Count_t1 = 0;//计数寄存器,赋初值。
void Seg_Fre()//数码管刷新函数
{
P7=Com_tab[num];
P6=Num_Geg[Show_tab[num]];
// delay_ms(1);============使用定时器刷新,delay函数不需要直接屏蔽掉
num++;
if(num>7)
num=0;
}
void sys_init()
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
//====== USB 初始化 ======
P3M0 &= ~0x03;
P3M1 |= 0x03;
IRC48MCR = 0x80;
while (!(IRC48MCR & 0x01));
USBCLK = 0x00;
USBCON = 0x90;
//========================
}
void Timer0_Init(void) //1毫秒@24.000MHz 1ms定时器初始化
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
//主函数入口
void main()
{
Timer0_Init();
TMOD = 0x40; //设置计数器模式
TL1 = 0x00; //设置计数器初始值========计数两次脉冲进入中断
TH1 = 0x00; //设置计数器初始值
TF1 = 0; //清除TF0标志
TR1 = 1; //计数器1开始计时
ET1 = 1; //使能计数器1中断
P3PU = 0x20; //打开计数器P35的4.1K上拉电阻,P34,P35用作脉冲计数推荐打开内部上拉
EA = 1; //打开总中断
sys_init(); //系统初始化
usb_init(); //USB CDC 接口配置
//死循环
while (1)
{
if(DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置
continue;
if (bUsbOutReady)
{
usb_OUT_done(); //接收应答(固定格式)
printf("计算结果:%d\r\n",TL1);
printf("计算结果:%d\r\n",Count_t1);
// memcpy(UsbInBuffer, UsbOutBuffer, OutNumber); //将接收数据(UsbOutBuffer),复制到发送缓冲区(UsbInBuffer)
// usb_IN(OutNumber); //原路返回, 用于测试
}
}
}
//void Tim1_Isr() interrupt 3//计数器1中断函数,中断号3,固定格式计数器0中断号必须是1,计数器1中断号是3,
//{
// P60 = !P60;
//}
void Timer0_Isr(void) interrupt 1//定时器1ms中断服务函数
{
Tim_Count++;
if(Tim_Count>=2000)//计时到达2000MS,也就是2S,
{
Tim_Count = 0;//计时值清零,
Count_t1 = (TH1*256)+TL1;//读计数寄存器高八位TH1和低八位TL1的值转换成10进制
Show_tab[4]=Count_t1/1000%10;
Show_tab[5]=Count_t1/100%10;
Show_tab[6]=Count_t1/10%10;
Show_tab[7]=Count_t1/1%10; //取1位
TH1 = 0;//计数值清零,
TL1 = 0;//计数值清零,
}
Seg_Fre();
}
|
|