1.规范 typedef unsigned long int ulint
2.k 为非负数,因此循环时 while 条件不能为 while(k>=0)
正确为:
void Delay (uint k)
{
while (k!=0)
{k–;}
}
3.蜂鸣器延时程序写在while(1)主程序下时,
原来为:
while (1)
{
Buzzer_Ring(0xffff);
}
void Buzzer_Ring(ulint k)
{
P4M1=0x00;
P4M0=0x08;
BUZZER=0;
BUZZER=1;
Delay(k);
BUZZER=0; // 此处继续下个循环,即停留很短
// 改为 BUZZER=0;
Delay(k);
}
4.接收数据的格式建议:
structure Rx_data
{
byte[10] ; // 记录数据
num ; // 记录长度
flag ; // 记录是否收到结束字符
}
5.按键触发时,高低电平的变化取决于图纸
6.防止一次按键时间太长,使用 while(KEY1==0);
空循环等待按键松开
7.规范: 记次数时, for 中常用 i ++
8.
`void Send_Char(uchar a)
{
tx_flag=1;
SBUF=a;
while(tx_flag==1);
}
void Send_String(uchar *s)
{
while (*s!='\0')
{
Send_Char(*s); // 原来是 Send_Char(s);
s++;
}
}
9.初始化在循环外执行,否则会不停重复
while (1)
{
RI=0;
rx_flag=0;
tx_flag=0;
start_flag=0;
应改为
RI=0;
rx_flag=0;
tx_flag=0;
start_flag=0;
while (1) {...}
10.中断中不能再使用中断
void Timer0() interrupt 1
{
TF0=0;
TL0=0; // TH0=(65536 - 10ms/(12*1/11.059M))/256
TH0=0xDC; // TL0=(65536 - 10ms/(12*1/11.059M))%256
//TI=1;
//printf("%d",second);
second++; //
while(TI==1);
TI=0;
SBUF=second;
}
11.波特率越高发送一个字节占用的时间越短
12. printf 使用前 TI=1,ES=0
13. 时分秒进位算法
msx++;
if(msx>=100)
{
msx=0;
secondx++;
if(secondx>=60)
{
secondx=0; secondx=0;
minutex++;
if( minutex>=60)
{
minutex=0;
hourx++;
}
}
}
14.
1.0
void main ()
{
int i;`
Timer0_Init(); // 定时器0,串行口1初始化
Serial1_Init();
Intertupt_Init();
for (i=0;i<2;i++)
{
Buzzer_Ring(0xffff); // 开机蜂鸣长鸣2声
}
RI=0;
rx_flag=0;
tx_flag=0;
start_flag=0;
stop_flag=0;
while (1) // 开机时
{
Is_Start();
if (start_flag) // start_flag=1 时,启动
{
Buzzer_Ring(0x1fff); // 蜂鸣器响一声
TR0=1; // 计时器0开始计时
secondx=0; // 初始化
minutex=0;
hourx=0;
msx=0;
}
start_flag=0; // 这句非常重要!!! 在没有收到停止命令前,仍然重复执行while(1),若start_flag=1, 则一直重复启动
Is_Stop();
}
}
void Is_Start() // 收到 START 或 按键 为高电平,则 start_flag=1
{
while (!start_flag) // 当未开始计时时,等待start_flag=1
//
{
if (rx_flag==1)
{
if(strcmp(string,"START")==0)
{
start_flag=1;
rx_flag=0; // 若接收到START命令,
string[0]='0'; // 则RX_flag=0,清空接收的字符
}
}
if (KEY1==0)
{
start_flag=1;
while(KEY1==0);
}
if (start_flag==1)
{
Send_String("Run");
}
} // while
} // void Is_Start
void Is_Stop()
{
if (rx_flag==1)
{
if(strcmp(string,"STOP")==0)
{
stop_flag=1;
rx_flag=0; // 若接收到STOP命令,
string[0]='0'; // 则RX_flag=0 ,清空接收的字符
}
}
if (KEY1==0)
{
stop_flag=1;
while(KEY1==0);
}
if (stop_flag==1)
{
ET0=0;
TR0=0;
}
}
2.0 start_flag 清零 换位置
void main ()
{
int i;`
Timer0_Init(); // 定时器0,串行口1初始化
Serial1_Init();
Intertupt_Init();
for (i=0;i<2;i++)
{
Buzzer_Ring(0xffff); // 开机蜂鸣长鸣2声
}
RI=0;
rx_flag=0;
tx_flag=0;
start_flag=0;
stop_flag=0;
while (1) // 开机时
{
Is_Start();
if (start_flag) // start_flag=1 时,启动
{
Buzzer_Ring(0x1fff); // 蜂鸣器响一声
TR0=1; // 计时器0开始计时
start_flag=0; // 这句非常重要!!! 在没有收到停止命令前,仍然重复执行while(1),若start_flag=1, 则一直重复启动
secondx=0; // 初始化
minutex=0;
hourx=0;
msx=0;
}
Is_Stop();
}
}
3.0 删去 while
void Is_Start() // 收到 START 或 按键 为高电平,则 start_flag=1
{
// while (!start_flag) // 当未开始计时时,等待start_flag=1
//
{
if (rx_flag==1)
{
if(strcmp(string,"START")==0)
{
start_flag=1;
rx_flag=0; // 若接收到START命令,
string[0]='0'; // 则RX_flag=0,清空接收的字符
}
}
if (KEY1==0)
{
start_flag=1;
while(KEY1==0);
}
if (start_flag==1)
{
Send_String("Run");
}
} // while
} // void Is_Start
4.0 升级算法
void main ()
{
int i;
Timer0_Init(); // 定时器0,串行口1初始化
Serial1_Init();
Intertupt_Init();
for (i=0;i<2;i++)
{
Buzzer_Ring(0xffff); // 开机蜂鸣长鸣2声
}
RI=0;
rx_flag=0;
tx_flag=0;
start_flag=0;
stop_flag=0;
while (1) // 开机时
{
if( rx_flag==1)
{
if(strcmp(string,"START")==0)
{
start_flag=1;
}
if(strcmp(string,"STOP")==0)
{
start_flag=0;
}
rx_flag=0;
}
else
{
uchar key=(P2&0x30)^0x30;
switch(key)
{
case 0x20:
start_flag=1;
break;
case 0x10:
start_flag=0;
break;
}
while(((P2&0x30)^0x30)!=0);
}
if(start_flag==1)
{
if(stop_flag==0)
{
Buzzer_Ring(0x1fff); // 蜂鸣器响一声
TR0=1; // 计时器0开始计时
start_flag=0;
secondx=0; // 初始化
minutex=0;
hourx=0;
msx=0;
stop_flag=1;
ET0=1;
}
}
else
{
if(stop_flag==1)
{
Buzzer_Ring(0x1fff); // 蜂鸣器响一声
TR0=0; // 计时器0开始计时
ET0=0;
stop_flag=0; //b
}
}