void timer1() interrupt 3 { static uchar n=0; TH1=(65535-50000)/256; //ÇóÕû·ÅÔÚ¸ß8λ TL1=(65535-50000)%256; //ÇóÓà·ÅÔÚµÍ8λ n=n+1; if(n==20) //¶¨Ê±1Ã루20¸ö50msΪ1Ã룩 { n=0; min_sec++; if(min_sec==3600) { min_sec=0; } } }
时间: 2023-06-24 14:02:53 浏览: 93
这是一个8051单片机的定时器1中断服务程序。当定时器1溢出时,会触发中断,程序会执行中断服务程序中的代码。在这个程序中,每50ms会增加一个计数器n的值,当n的值达到20时,说明已经过了1秒钟,会将计数器min_sec增加1。如果min_sec的值达到3600,说明已经过了1个小时,会将min_sec清零重新开始计时。
相关问题
void Timer0Init() { TMOD=0X01; TH0=(65535-10000)/256; TL0=(65535-10000)%256; ET0=1; EA=1; TR0=0; }
这段代码是用来初始化定时器0的,具体来说是将定时器0设置为16位定时器,计数方式为模式1,即每当计数器溢出时,TH0和TL0的值被重新装载,同时触发中断。其中,TH0和TL0的初值是根据所需的定时时间来计算得出的。ET0和EA分别代表定时器0中断使能和总中断使能,TR0为定时器启动控制位,设置为0时定时器不启动,需要手动启动。
#include <reg51.h> unsigned char code table[] = { 0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6, 0xEE, 0x3E, 0x9C, 0x7A, 0x9E, 0x8E}; unsigned char i, j, flag,num; char Count; bit Sym=0; sbit nred=P1^2; sbit ngreen=P1^4; sbit nyellow=P1^3; sbit intex0=P3^2; sbit intex1=P3^3; void putch(unsigned char n) { SBUF=n; while(TI==0); TI=0; } void main() { TMOD=0X10; EA=1; EX0=1; EX1=1; ET1=1; TH1=(65536-50000)/256; TL1=(65536-50000)%256; TR1=1; flag=0; Count=0; nred=nyellow=ngreen=0; num=10; i=table[Count/10]; j=table[Count%10]; putch(i); putch(j); while(1) { if(num==10) { if(Sym){ ngreen=1; nred=0; nyellow=0; } else{ nred=1; ngreen=0; nyellow=0; } } else{ nyellow=1; nred=0; ngreen=0; } } } void Timer0() interrupt 3 { flag++; TH1=(65536-50000)/256; TL1=(65536-50000)%256; if(flag==20){ flag=0; Count++; } if(Count>=num){ Count=0; if(num==10){ num=3; nyellow=0; Sym=~Sym; } else { nyellow=0; num=10; } } i=table[Count/10]; j=table[Count%10]; putch(i); putch(j); } void redinterrupt() interrupt 0 { TR0=0; P1=0x10; while(intex0==0); TR0=1; } void greeninterrupt() interrupt 2 { TR0=0; P1=0x04; while(intex1==0); TR0=1; }将从0到10改成10到0,并生成代码
请注意,这份代码涉及到了定时器、中断以及IO口的操作,如果您不熟悉这些知识点,可能需要先对其进行学习和了解。
以下是将从0到10改成10到0后的代码:
```
#include <reg51.h>
unsigned char code table[] = { 0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6, 0xEE, 0x3E, 0x9C, 0x7A, 0x9E, 0x8E};
unsigned char i, j, flag, num;
char Count;
bit Sym=0;
sbit nred=P1^2;
sbit ngreen=P1^4;
sbit nyellow=P1^3;
sbit intex0=P3^2;
sbit intex1=P3^3;
void putch(unsigned char n) {
SBUF=n;
while(TI==0);
TI=0;
}
void main() {
TMOD=0X10;
EA=1;
EX0=1;
EX1=1;
ET1=1;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
flag=0;
Count=10; // 从10开始计数
nred=nyellow=ngreen=0;
num=10;
i=table[Count/10]; // 先输出10
j=table[Count%10];
putch(i);
putch(j);
while(1) {
if(num==10) {
if(Sym){
ngreen=1;
nred=0;
nyellow=0;
} else{
nred=1;
ngreen=0;
nyellow=0;
}
} else {
nyellow=1;
nred=0;
ngreen=0;
}
}
}
void Timer0() interrupt 3 {
flag++;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(flag==20) {
flag=0;
Count--;
}
if(Count<0) { // 判断计数是否达到0
Count=10; // 重置计数器
if(num==10) {
num=3;
nyellow=0;
Sym=~Sym;
} else {
nyellow=0;
num=10;
}
}
j=table[Count/10]; // 更新i和j的值
i=table[Count%10];
putch(i);
putch(j);
}
void redinterrupt() interrupt 0 {
TR0=0;
P1=0x10;
while(intex0==0);
TR0=1;
}
void greeninterrupt() interrupt 2 {
TR0=0;
P1=0x04;
while(intex1==0);
TR0=1;
}
```
请注意,在修改计数器 Count 时,需要把从 20 改成了从 10 开始计数,同时在判断计数器是否达到 0 时,需要把 if(Count>=num) 改成 if(Count<0)。同时需要更新输出的数码管的 i 和 j 的值,即把 i=table[Count/10]; 和 j=table[Count%10]; 改成 j=table[Count/10]; 和 i=table[Count%10];。