小弟单片机C语言不熟,现有一段程序已知其功能,但是对里面的语句不很了解,求大侠们给每行写个注释吧!

先说问题:
1、求大侠们给程序写个注释,答辩用,谢谢拉。
2、(对于这个问题可以先看看功能可能就懂我说什么了=。=)我想加个延时函数,使输入端口断开高电平时,输出端口延迟一段时间再由低电平恢复成高电平,这个延时函数应该加在哪?

再说功能:

1、这是个用作光传感器自动风门的程序。
2、P0.0到P0.3为信号输入口,P1.0到P1.3为输出口,且一一对应互不影响。
3、以P0.0和P1.0这一组为例,某时刻当P0.0接高电平时,延迟大约3秒后P1.0由高电平变为低电平。
4、当某时刻P0.0断开高电平时(什么都不输入),P1.0又立即由低电平恢复为高电平。
5、P0.1和P1.1、P0.2和P1.2、P0.3和P1.3各为一组,互相独立,功能同上。

最后函数:
#include <reg51.h>

sbit S1=P0^0;
sbit S2=P0^1;
sbit S3=P0^2;
sbit S4=P0^3;
sbit D1=P1^0;
sbit D2=P1^1;
sbit D3=P1^2;
sbit D4=P1^3;

void Timer0_On(void)
{
TMOD= 0x01;
TH0=1;
EA=1;
ET0=1;
TR0=1;
}

unsigned int Time_ms=0;
void time0 (void) interrupt 1
{
TH0= 0xFC;//定时中断1mS @ 12MHz fosc
TL0= 0x1A;
Time_ms++;
}

void main(void)
{
unsigned char DY[4]={0,0,0,0};
unsigned char i;
Timer0_On();
D1=0;D2=0;D3=0;D4=0;

while (1)
{
if (Time_ms++>1000)
{
Time_ms=0;
for (i=0;i<4;i++)
{ DY[i]>>=1;
}
}
D1= (DY[0]==0)?0:1;
D2= (DY[1]==0)?0:1;
D3= (DY[2]==0)?0:1;
D4= (DY[3]==0)?0:1;

if (S1==0) DY[0]=0x10;
if (S2==0) DY[1]=0x10;
if (S3==0) DY[2]=0x10;
if (S4==0) DY[3]=0x10;
}
}

http://zhidao.baidu.com/question/548570658.html?push=1&group=1
#include <reg51.h>
sbit S1=P0^0;//端口定义
sbit S2=P0^1;//端口定义
sbit S3=P0^2;//端口定义
sbit S4=P0^3;//端口定义
sbit D1=P1^0;//端口定义
sbit D2=P1^1;//端口定义
sbit D3=P1^2;//端口定义
sbit D4=P1^3;//端口定义
/********************定时器初始化子函数**********/
void Timer0_On(void)
{
TMOD= 0x01;//定时器寄存器设置
TH0=1;//设置几时初值
EA=1;//开总中断
ET0=1;//开定时器中断允许
TR0=1;//开定时器0
}
/***********************************************/
int Time_ms=0;//变量初始化
/******************定时中断子函数****************/
void time0 (void) interrupt 1
{
TH0= 0xFC;//定时中断1mS @ 12MHz fosc//重复装计时初值(高位)
TL0= 0x1A;//重复装计时初值(低位)
Time_ms++;//每次中断计时变量加一
}
/************************************************/
/************************主函数******************/
void main(void)
{
long int DY[4]={4000,4000,4000,4000};//数组定义用来存放端口状态
unsigned char i;//用来循环计数用
Timer0_On();//开定时器0
D1=1;D2=1;D3=1;D4=1;//初始化输出端口
while (1)//用于程序执行的大循环
{
if (Time_ms=3000)//判断计时变量是否达到要求的计时
{
Time_ms=0;//循环计时
}
if ((S1==1)&&(DY[0]=4000)) DY[0]=Time_ms;//若输入变为高电平,则记下当前时间
if ((S2==1)&&(DY[1]=4000)) DY[1]=Time_ms;//若输入变为高电平,则记下当前时间
if ((S3==1)&&(DY[2]=4000)) DY[2]=Time_ms;//若输入变为高电平,则记下当前时间
if ((S4==1)&&(DY[3]=4000)) DY[3]=Time_ms;//若输入变为高电平,则记下当前时间
for(i=0;i<4;i++)//遍历四个变量,找出到达上秒的
{
if((DY[i]<=3000)&&(DY[i]==Time_ms+1))//如果Time_ms和DY[i]再次相等,则正好计时三秒,即可把相应的端口变为低电平
//如果DY[i]大于3000说明此端口没有计时
{
switch(i)//判断端口,对相应位置0
{
case 0:D1=0;
case 1:D2=0;
case 2:D3=0;
case 3:D4=0;
}
DY[i]=4000;//在这里计时3秒已经完成,相应的位已经置0 ,最后把端口状态转为无计时
}
}
if (S1==0) D0=1;//在任何时候输入为低电平的时候,输出为高电平
if (S2==0) D1=1;//在任何时候输入为低电平的时候,输出为高电平
if (S3==0) D2=1;//在任何时候输入为低电平的时候,输出为高电平
if (S4==0) D3=1;//在任何时候输入为低电平的时候,输出为高电平
}
}
未编译运行,可能存在错误,但思路没问题。

good luck!
步行者====电子单片机团
[email protected]
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-08
加个延时函数 ,延时函数网上找去, 写个函数传入DY[*]的值,然后判断再延时返回1或0就可以了。
还有if(time_ms >1000)是不是该去掉 不然会计时不准确的哦…
第2个回答  2013-05-10
我明明回答了,可恨的百度知道!