单片机秒表C 错误(2)

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        
                        }

        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值