单片机STC15定时器(1)中断,数码管自动加1的电子钟,为什么不自动加1

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-31
51单片机定时器T1中断使数码管计数0—F,每秒加1,想要将if()函数写到main()函数中,如何实现。

把初始化程序 Timer1Init(); 放在while(1) 的上面,你现在这样,每次循环都初始化了,就永远也不计数了 。另外,开机是显示8,是因为,开机P0口全为1,要过1秒后开始从0开始显示,可以在while(1)上面加一行 P0=0x3f; 这样,开机就显示0了。另外,这种定时1秒,定时器最好定时长点,如50ms ,你现在是定时1ms ,这中断频率太高了,如果有其它程序就会影响主程序的执行。
还有,if 语句下面的
if(i==1000)
{
//TR1=0;//要这行,就计数一遍就停了,要不停地计数就要删掉
i=0;
P0=smgduan[n++];
if(n==16) n=0;

}

共阳数码管中断程序:
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x83,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
uint num,a;
uchar bai,shi,ge;
void init();
void delay(uint);
void display(ucharbai,ucharshi,ucharge);
uint fb();
uint fs();
uint fg();
void main()
{
init();
while(1)
{
display(fb(),fs(),fg());
}
}
void init()
{
num=0;
a=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display(ucharbai,ucharshi,ucharge)
{
P1=0xfd;
P0=table[bai];
delay(1);
P1=0xfb;
P0=table[shi];
delay(1);
P1=0xf7;
P0=table[ge];
delay(1);
}
void timeoff() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65526-50000)%256;
a++;
if(a%20==0)
{
num++;
if(num==999)
{
num=0;
}
}
}void delay(uint z){
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uint fb()
{
bai=num/100;
return bai;
}
uint fs()
{
shi=num%100/10;
return shi;
}
uint fg()
{
ge =num%100%10;
return ge;
}

扩展资料
2个可编程定时/计数器·5个中断源,2个优先级(52有6个)
一个全双工串行通信口
外部数据存储器寻址空间为64kB
外部程序存储器寻址空间为64kB
逻辑操作位寻址功能·双列直插40PinDIP封装
单一+5V电源供电
CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM:用以存放程序、一些原始数据和表格;
I/O口:四个8位并行I/O口,既可用作输入,也可用作输出
T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最佳振荡频率为6M—12M。
参考资料来源:百度百科-51单片机


单片机STC15定时器1显示的电子钟,这程序问题太多了,虽然能生成HEX文件,可那HEX代码有错误,电子钟当然不会自动加1计时了。主程序格式就不对,应该是下图这样。那中断程序应该有interrupt 1,才可以中断后执行中断程序。而你这样是不会执行中断程序的。
中断程序中的变量是全局变量,红框内的变量应在主程序前声明。数码管电路是用74HC595驱动的吗,显示子程序也有问题。



定时器中断没有开,主程序又是空的死循环,所以肯定不会加1。

问题貌似出在主程序中While循环,按你目前的写法,程序执行到While(1);就进入死循环了,显示程序只执行了一次,后续无论怎么中断都与显示无关了,正确的写法应该是循环调用显示程序,每次中断把某时间变量改变时才能通过显示程序显示出来,另外,中断函数不用主动调用,主程序中应该将相关语句去除。

是在板子上只显示display函数里面设置好的初值,并不会自动加1操作。

1. 定时器初始化要放在main下的前几行,while(1){} 的上面
2. 函数声明在main的前面
3. 错误都在上面两条已说明

  • 单片机STC15定时器(1)中断,数码管自动加1的电子钟,为什么不自动加1
    答:单片机STC15定时器1显示的电子钟,这程序问题太多了,虽然能生成HEX文件,可那HEX代码有错误,电子钟当然不会自动加1计时了。主程序格式就不对,应该是下图这样。那中断程序应该有interrupt 1,才可以中断后执行中断程序。而你这样是不会执行中断程序的。中断程序中的变量是全局变量,红框内的变量应在...
  • 求助stc15系列定时器中断问题
    答:MOV TL0,#0B0H ;定时器0 预置15536,一个计数周期50000uS=50mS.CLR TF0 SETB EA ;中断总开关 SETB ET0 ;定时器0中断开关 SETB TR0 ;定时器0开始计时 MOV T0MS,#00H MOV T1MS,#00H MOV TMI,#0 MOV 41H,#00H MOV ...
  • stc15单片机有几个中断源
    答:3——定时器1中断 4——串口中断 附加的:5——定时器2中断 外部中断 > 定时器中断 > 串口中断,0 > 1
  • stc15单片机串行口1的中断源有几个
    答:stc15单片机串行口1有14个中断源。根据查询相关公开信息显示:STC15F2K60S2系列单片机提供14个中断源1、外部中断5个。
  • STC单片机定时器中断问题
    答:TR0=1;while(1);} void time0() interrupt 1 //定时器0 { TH0=0;TL0=0;//重新装初值 P2--;} 以上程序中断会每隔65536us(如果你眼睛够快的话,但是以这个速度人眼应该感觉不到,你可以每隔20次中断再让P2自减一次,这样效果更好)发生一次,但是由于P2--;自减8次之后就会变成0x00,所以...
  • STC单片机的定时器下降沿中断是什么?
    答:就是下降沿触发的对应定时器中断啊
  • stc15w408as单片机定时器1定时时间不准,要3个NOP定时器1才加一;定时器...
    答:stc15w408as-sop16封装单片机,在使用定时器0时正常,在使用定时器1时定时时间不准(使用烧录软件的“定时器计算器”生成的程序复制进去也不准);晶振11.0592m,1t模式,定时器12分频,在debug时,一个NOP占用一个时钟周期,TR1=1;后,定时加一,再往后面要3个nop定时器才加一,望高手大神指教怎么...
  • stc15f2k60s2有多少个定时器和中断
    答:stc15f2k60s2单片机共有3个定时器,为T0,T1,T2,共有14个中断源。比传统的51单片机多了一个定时器T2,中断源多了9个。见下表,画箭头的一列。
  • STC单片机里面哪个中断方式是对哪个序号的?谁给我列一下
    答:0——外部中断0 1——定时器0中断 2——外部中断1 3——定时器1中断 4——串口中断 附加的:5——定时器2中断 外部中断 > 定时器中断 > 串口中断,0 > 1
  • stc15同时使用定时器0和定时器2,定时器2进不了中断程序
    答:1、确认定时器中断的优先级设置:定时器中断的优先级应该是按照用户手册中所定义的方式进行设置,避免冲突。2、配置定时器参数和中断使能:在使用两个定时器的场景下,需要仔细检查定时器计数器、重载值、工作模式和中断使能等参数设置,确保两个定时器之间的计数互不干扰,并且满足用户自定义的功能需求。