【已解决】为何ISP中定时器计算器给的程序没有用
本帖最后由 wszjw2 于 2024-11-29 10:40 编辑现在用开天斧三.2,用下面这段,是51教学视频上用的方式,P20可以正常一秒闪一下void time1_init(void)
{
TMOD|=0X10;//选择为定时器0模式,工作方式1
TH1=0XFC; //给定时器赋初值,定时1ms
TL1=0X18;
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
void main()
{
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
time1_init();//定时器1中断配置
while(1)
{
}
}
void time1() interrupt 3 //定时器1中断函数
{
static u16 i;//定义静态变量i
TH1=0XFC; //给定时器赋初值,定时1ms
TL1=0X18;
i++;
if(i==1000)
{
i=0;
LED1=!LED1;
}
}但是用ISP中的代码就不行,见附图。请各位大佬帮忙看看是为啥
不行是怎么个不行法?不闪?还是不是按照1s间隔闪? 至少你也得把你用ISP的代码改完之后的程序发一下吧 猜一个没开总中断 _奶咖君_ 发表于 2024-11-28 16:53
至少你也得把你用ISP的代码改完之后的程序发一下吧
就是用了ISP的定时器设置,其他没改,本来也就一句话{:4_167:}原来是1s闪烁,换了之后直接不亮了 _奶咖君_ 发表于 2024-11-28 16:54
猜一个没开总中断
还真是,大意了{:4_167:} _奶咖君_ 发表于 2024-11-28 16:54
猜一个没开总中断
另外想问一下,如果想定时15分钟,什么办法比较好呀,目前是想定时器1s然后标志位+1,判断标志位。然后我看定时器的TMOD说明T1/T0要在INT1/INT0为高电平时才能打开,那是不是可以用硬件控制定时器T1/T0 wszjw2 发表于 2024-11-28 17:01
另外想问一下,如果想定时15分钟,什么办法比较好呀,目前是想定时器1s然后标志位+1,判断标志位。然后我 ...
1.定时15分钟这个 可以这么做。通过计数变量的方式你可以定义到天荒地老{:4_165:}
2.你说的这个功能我没有测试过,,没法提供太多的想法。{:4_185:} wszjw2 发表于 2024-11-28 17:01
另外想问一下,如果想定时15分钟,什么办法比较好呀,目前是想定时器1s然后标志位+1,判断标志位。然后我 ...
1.如果想定时比较长的,可以使用单片机的RTC功能。
2.一般是用来做PPM(脉宽控制,舵机常见控制信号)的,你说的这个用法确实是可以的 _奶咖君_ 发表于 2024-11-28 17:05
1.定时15分钟这个 可以这么做。通过计数变量的方式你可以定义到天荒地老
2.你说的这个功能我没有测试过, ...
刚刚发现ISP的程序还是不行{:4_167:}灯一直亮着
#include "stc8h.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
u8 pump_flag=0;
u16 sec=0;
/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
/*******************************************************************************
* 函 数 名 : time0_init
* 函数功能 : 定时器0中断配置函数,通过设置TH和TL即可确定定时时间
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void time1_init(void)
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xCD; //设置定时初始值
TH1 = 0xD4; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //使能定时器1中断
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
EA=1;
P_SW2|=0X80;
while(1)
{
time1_init();//定时器0中断配置
}
}
void time1() interrupt 3 //定时器0中断函数
{
P20=~P20;
}