/****接受一个数组如果首为0c尾为0f则显示数组中间三个且反馈给计算机,否则显示eeeeeee且反馈给计算机******/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar i,j,add; //
uchar temp[15]; //控制显示数形
uchar temp1[5]; //暂存接收数据
uchar code position[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //数码管位置数组
uchar code figure[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x00}; //数形
void Init() ; //初始化函数
void Check(); //核实接受的数据
void Divide(); //将接收数据进行分解
void Display(); //显示接收到的数字
void Send(); //发送数据
void main()
{
Init();
while(1)
{
if(add==4)
{
Send();
add=0;
Check();
}
}
}
/****************下面为被调用的子函数**********************/
/*******初始化函数**********/
void Init()
{
TMOD=0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=0xFD; // 波特率9600
TL1=0xFD;
SCON=0x50; // 设定串行口工作方式
PCON&=0xef; // 波特率不倍增
TR1=1; // 启动定时器1
EA=1; //开总中断
ES=1; //串行中断允许
P0=0x3f;
P2=0x00;
i=0;
j=0;
add=0;
}
/*******核实接收的数据*********/
void Check()
{
Divide();
if(temp1[0]==12&&temp1[4]==15)
{
while(!add)
{Display();}
}
else
{
P2=0x00;
P0=0x79;
}
}
/********将接收数据进行分解*********/
void Divide()
{
for(j=0;j<5;j++)
{
temp[3*j]=temp1[j]/16;
temp[3*j+1]=temp1[j]%16;
temp[3*j+2]=0x10;
}
}
/********显示接收到的数字********/
void Display()
{
for(i=0;i<3;i++)
{
for(j=(3*i);j<(3*i+3)&&j<8;j++)
{
P0=0x00;
P2=position[j];
P0=figure[temp[j+3]];
}
}
}
/*****发送数据*******/
void Send()
{
for(i=0;i<5;i++)
{
SBUF=temp1[i];
while(!TI);
TI=0;
}
}
/*********中断服务函数**********/
void serial () interrupt 4 using 3 //串口中断
{
temp1[add]=SBUF;
if(RI)
{
RI=0;
add++;
}
}
评论0