TMOD=0xee; TH0=(65535-50000)/256; TL0=(65535-50000)%256; TH1=(65535-500)/256; TL1=(65535-500)%256; EA=1; ET0=1; ET1=1; TR0=1; TR1=0;对这段代码进行注释
时间: 2023-08-05 21:04:22 浏览: 48
这段代码是针对 8051 单片机编写的定时器中断程序,具体注释如下:
```
TMOD=0xee; // 设置定时器0和定时器1为模式2,也就是8位自动重装载计数器模式
TH0=(65535-50000)/256; // 设定定时器0的高字节,使其计数值为50000,计数频率为11.0592MHz/12/50000=18.432Hz
TL0=(65535-50000)%256; // 设定定时器0的低字节
TH1=(65535-500)/256; // 设定定时器1的高字节,使其计数值为500,计数频率为11.0592MHz/12/500=18.432kHz
TL1=(65535-500)%256; // 设定定时器1的低字节
EA=1; // 使能总中断
ET0=1; // 使能定时器0中断
ET1=1; // 使能定时器1中断
TR0=1; // 启动定时器0
TR1=0; // 关闭定时器1
```
其中,TMOD 寄存器用于设置定时器的工作模式,TH0 和 TL0 分别表示定时器0的高字节和低字节,TH1 和 TL1 分别表示定时器1的高字节和低字节。EA、ET0、ET1、TR0 和 TR1 分别表示总中断使能、定时器0中断使能、定时器1中断使能、定时器0启动和定时器1启动。这段代码的作用是启动定时器0,并且设置该定时器的计数频率为18.432Hz,当定时器0的计数器达到计数值50000时,会触发定时器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];。
把下列代码中的正计时改成倒计时。#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,Max; char Count; bit Sym=0; sbit Srg=P1^2; sbit Nrg=P1^4; sbit Yel=P1^3; void putch(unsigned char n) { SBUF=n; while(TI==0); TI=0; } void main() { TMOD=0X01; EA=1; ET0=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; flag=0; Count=0; Yel=Srg=Nrg=0; Max=10; i=table[Count/10]; j=table[Count%10]; putch(i); putch(j); while(1) { if(Max==10){ if(Sym){ Nrg=1; Srg=0; Yel=0; } else{ Srg=1; Nrg=0; Yel=0; } } else{ Yel=1; Srg=0; Nrg=0; } } } void Timer0() interrupt 1 { flag++; TH0=(65536-50000)/256; TL0=(65536-50000)%256; if(flag==20){ flag=0; Count++; } if(Count>=Max){ Count=0; if(Max==10){ Max=3; Yel=0; Sym=~Sym; } else { Yel=0; Max=10; } } i=table[Count/10]; j=table[Count%10]; putch(i); putch(j); }
将代码中的 Count 和 Max 的初始值都设为需要倒计时的数值,然后将 Count 和 Max 递减即可实现倒计时功能。同时需要将倒计时的数字转换为对应的数码管显示值,可以参考代码中的 table 数组。修改后的代码如下:
#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;
char Count, Max;
bit Sym = 0;
sbit Srg = P1^2;
sbit Nrg = P1^4;
sbit Yel = P1^3;
void putch(unsigned char n) {
SBUF=n;
while(TI==0);
TI=0;
}
void main() {
TMOD=0X01;
EA=1;
ET0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
flag=0;
Count=30; // 初始倒计时为 30 秒
Max=Count;
while(1) {
i = table[Count/10];
j = table[Count%10];
putch(i);
putch(j);
}
}
void Timer0() interrupt 1 {
flag++;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(flag==20) {
flag=0;
Count--; // 每 1 秒递减
}
if(Count <= 0) { // 倒计时结束
Yel = 1;
Srg = 0;
Nrg = 0;
Count = Max;
} else if(Count <= 10) { // 倒计时最后 10 秒
Yel = 1;
Srg = 0;
Nrg = 0;
if(Sym) {
Nrg = 1;
} else {
Srg = 1;
}
Sym = ~Sym;
} else {
Yel = 0;
Srg = 0;
Nrg = 0;
}
i = table[Count/10];
j = table[Count%10];
putch(i);
putch(j);
}