用ADC0808设计的调温报警器

能分析批注一下代码吗?急!


#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar Temperature[]={0,0,0};
sbit ST=P2^5;
sbit OE=P2^7;
sbit EOC=P2^6;
sbit CLK=P2^4;
sbit H_LED=P3^0;
sbit L_LED=P3^1;
sbit BEEP = P3^7;
uchar t=0;
void DelayMS(uint x)
{
uchar i;
while(x--)for(i=0;i<120;i++);
}
void Show_Temperature()
{
uchar i,DSY_IDX[]={0xF7,0xFB,0xFD};
for (i=0;i<3;i++)
{
P0 = DSY_CODE[Temperature[i]];
P2 &=DSY_IDX[i];
DelayMS(5);
P2|=0x0F;     
}
}

void main()
{
uchar d;
IE=0x8a;
TMOD=18;
TH0=245;
TL0=0;
TH1=(65536-1000)/256;
TL1=(65536-1000)&256;
TR0=1;
H_LED=L_LED=1;
while(1)
{
ST=0;ST=1;ST=0;
while(1)
{
if(EOC==1)
{
OE=1;
d =P1;
OE=0;
Temperature[2]=d/100;
Temperature[1]=d%100/10;
Temperature[0]=d%10;
Show_Temperature();
if(d<60)
{
TR1=1; L_LED=!H_LED;
}
else
if(d>160)
{
TR1 = 1, H_LED =!L_LED;
}
else
{
TR1=0;H_LED=L_LED=1;
}
break;
}
}
}
}
void T0_INT() interrupt 1
{
CLK=~CLK;
}
void T1_INT() interrupt 3
{
TL1=(65536-1000)% 256;
BEEP=~BEEP;
if (++t !=150){return;}
else
if (++t !=60) {return;}
t=0;
DelayMS(20);
}

这是一个程序,用于测量温度并显示在数码管上。下面是一些分析和说明:

  • 首先,在开头定义了一些符号常量和位变量,用于指示芯片上的特定引脚和寄存器。
  • DSY_CODE 数组包含了用于在数码管上显示温度数字的码值。
  • Temperature 数组用于存储温度值,其中 Temperature[0] 存储个位数,Temperature[1] 存储十位数,Temperature[2] 存储百位数。
  • Show_Temperature 函数用于在数码管上显示温度值。
  • main 函数执行测量温度的操作。它先将温度传感器的读取脉冲发出,然后等待读取结束信号(EOC)。当温度读取完成时,它会将温度值转换为数字并存储在 Temperature 数组中,然后调用 Show_Temperature 函数将温度显示在数码管上。此外,它还会根据温度值来控制绿灯和红灯的亮灭以及蜂鸣器的响声。
  • T0_INT 函数是 T0 定时器的中断服务程序,它会每隔一定时间反转时钟信号。

  • T1_INT 函数是 T1 定时器的中断服务程序,它会每隔一定时间反转蜂鸣

  • DelayMS 函数用于延迟一段时间。它是通过循环计数来实现的,每次循环延迟大约 1 毫秒。
  • 在 main 函数中,芯片的中断使能寄存器(IE)被设置为 0x8a,这样定时器 T0 和 T1 的中断请求才能得到响应。
  • 定时器 T0 和 T1 的工作模式均被设置为模式 1,即 16 位自动重装载定时器。
  • 定时器 T0 的计数初值被设置为 245,TL0 被设置为 0。这样,T0 的定时周期就被设定为 4.65 毫秒。
  • 定时器 T1 的计数初值被设置为 (65536-1000)/256 和 (65536-1000)&256,分别对应 TH1 和 TL1。这样,T1 的定时周期就被设定为 1 秒。
  • 在 main 函数的主循环中,当温度小于 60 时,开启 T1 定时器并点亮绿灯;当温度大于 160 时,开启 T1 定时器并点亮红灯;当温度在 60 到 160 之间时,关闭 T1 定时器并点亮绿红灯。
  • 在 main 函数中,当温度小于 60 时,定时器 T1 被开启并点亮绿灯;当温度大于 160 时,定时器 T1 被开启并点亮红灯;当温度在 60 到 160 之间时,定时器 T1 被关闭并点亮绿红灯。
  • 在 T1_INT 函数中,蜂鸣器的响声频率会随着 t 变量的增大而变快。当 t 等于 60 时,蜂鸣器的响声频率为 1Hz;当 t 等于 150 时,蜂鸣器的响声频率为 2Hz。
  • 在 T1_INT 函数中,每次中断服务程序执行时,定时器 T1 的计数值都会被重设为 (65536-1000)%256。这样,T1 就能继续按 1 秒的周期触发中断。
  • 在 T1_INT 函数中,每次中断服务程序执行时,蜂鸣器的响声状态都会被反转