我想让
单片机通过串行口给
手机返回记录的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[]="**** 'Instruc
tions 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();
}
}
}
一周热门 更多>