想让51单片机记录的led总数通过串行口发送到手机,但总数有问题,求帮

2019-07-15 09:10发布

我想让单片机通过串行口给手机返回记录的led灯亮的总次数,但是我写的程序返回值不对,求大佬帮帮忙,
#include<reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 tmp;
u8 tmp5;
u8 tmp6;
u8 tmp7;
u8 tmp8;
u16 c=0;
sbit led1=P1^0;
sbit led2=P1^1;
sbit led7=P1^3;

sbit wei1=P2^4;
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;

u8 code TEXT1[]="************************************************************";
u8 code TEXT2[]="****          'Welcome to use this product'             ****";
u8 code TEXT3[]="****              'Instructions of use'                 ****";
u8 code TEXT4[]="****  If you want open the red lamp,please enter '1'.   ****";
u8 code TEXT5[]="**** If you want close the red lamp,please enter '1'.   ****";
u8 code TEXT6[]="**** If you want open the green lamp,please enter '2'.  ****";
u8 code TEXT7[]="**** If you want close the green lamp,please enter '2'. ****";
u8 code TEXT8[]="****                   .<-_->.                          ****";        
u8 code TEXT9[]="red";
u8 code TEXT10[]="green";         

u8 code sugduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~9的值

u16 i;
u16 sugshu;                  
u8 sugshu1;
u8 sugshu2;

u8 sugqwei;
u8 sugbwei;
u8 sugswei;
u8 suggwei;

u8 sugswei1;
u8 suggwei1;
u8 sugswei2;
u8 suggwei2;


void delay100us(void)   //延时100us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=47;a>0;a--);
}

void sugwei()
{
        sugqwei=sugduan[(sugshu/1000)%10];
        sugbwei=sugduan[(sugshu/100)%10];
        sugswei=sugduan[(sugshu/10)%10];
        suggwei=sugduan[(sugshu/1)%10];
}
void sugwei1()
{
        sugswei1=sugduan[(sugshu1/10)%10];
        suggwei1=sugduan[(sugshu1/1)%10];
        sugswei2=sugduan[(sugshu2/10)%10];
        suggwei2=sugduan[(sugshu2/1)%10];
}

void DigDisplay()
{
        u8 i;
        for(i=0;i<4;i++)
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                P0=sugqwei; wei4=1; wei1=0; break;//显示第0位
                        case(1):
                                P0=sugbwei; wei1=1; wei2=0; break;//显示第1位
                        case(2):
                                  P0=sugswei; wei2=1; wei3=0; break;//显示第2位
                        case(3):
                                P0=suggwei; wei3=1; wei4=0; break;//显示第3位
                        default:break;
                }
                delay100us(); //间隔一段时间扫描        100
                P0=0x00;//消隐                                                
        }
        
        
}
void DigDisplay1()
{
        u8 i;
        for(i=0;i<4;i++)
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                P0=sugswei1; wei4=1; wei1=0; break;//显示第0位
                        case(1):
                                P0=suggwei1; wei1=1; wei2=0; break;//显示第1位
                        case(2):
                                  P0=sugswei2; wei2=1; wei3=0; break;//显示第2位
                        case(3):
                                P0=suggwei2; wei3=1; wei4=0; break;//显示第3位
        
                        default:break;
                }
                delay100us(); //间隔一段时间扫描        100
                P0=0x00;//消隐                                                
        }
        
        
}  
void send(u8 a)        //单字节数据发送
{                                                        
        TI=0;        
        SBUF=a;
        while(TI==0);
        TI=0;

        if(c%2)                                        //发送指示灯标志,每接收一次,此灯亮灭交替
         led7=1;
        else                                
         led7=0;
        c++;                  
}
void sendstr(u8 *s)
{
        while(*s!='')
        {
                send(*s);
                s++;
        }
}
void init()        //串口初始化
{
                   ES=0;                                                                  //关中断
                  SCON = 0x50;                        // REN=1允许串行接受状态,串口工作模式1,
                                                                                          //10位UART(1位起始位,8位数据位,1位停止位,无奇偶校验),波特率可变

                  TMOD = 0x20;                        // 定时器1工作于方式2,8位自动重载模式, 用于产生波特率
          TH1=TL1=0xFD;                       // 波特率9600 (本次测试采用晶振为11.0592)

          PCON &= 0x7f;                       // 波特率不倍增
          TR1 = 1;                                                          //定时器1开始工作,产生波特率
                                                                                          //发送标志位置0
                  TI=0;                                                                  //接收标志位置0
                  RI=0;
                  
                  EA=1;
              ES=1;
}

void ctrl()        interrupt 4                    //接收处理函数
{
                                  if(RI==1)                     // 是否有数据到来
                  {
                   RI = 0;
                                   tmp=SBUF;
                                  tmp5=sugswei1;
                                   tmp6=suggwei1;
                                   tmp7=sugswei2;
                                   tmp8=suggwei2;

                                          ES=0;
                                   
                                    switch(tmp)
                                  {
                                          case '1':
                                                led1=~led1;                //led灯1状态取反
                                                if(led1==1)
                                                {
                                                        sugshu++;
                                                        sugshu1++;
                                                }
                                                
                                                send(tmp);        
                                                sendstr(TEXT9);
                                                send(tmp5);        
                                                send(tmp6);

                                                   //记录led灯亮的次数
                                                
                                                break;                                       
                                        case '2':                                         //收到字符2,指示灯1亮
                                                led2=~led2;
                                                        if(led2==1)
                                                {
                                                        sugshu++;
                                                        sugshu2++;
                                                }
                                                
                                                send(tmp);
                                                sendstr(TEXT10);               
                                                send(tmp7);        
                                                send(tmp8);

                                                break;
                                       

                                       
                                       
                                        default:                   //其他,灯全灭
                                                  led1=0;
                                                  led2=0;
                                                  sendstr(TEXT1);
                                                  sendstr(TEXT2);
                                                  sendstr(TEXT3);
                                                  sendstr(TEXT4);
                                                  sendstr(TEXT5);
                                                  sendstr(TEXT6);
                                                  sendstr(TEXT7);
                                                  sendstr(TEXT8);
                                                  break;
                                  }
                                  ES=1;
                                  }
}

void main()
{        
        init();        
        led2=0;
        led1=0;
        sugshu=0;
        sugshu1=0;
        sugshu2=0;



        while(1)

        {
                sugwei();
                sugwei1();
                for(i=2000;i>0;i--)
                {  DigDisplay();
                }
                for(i=2000;i>0;i--)
                {  DigDisplay1();
                }
        }

        

}

0条回答

一周热门 更多>