# include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 code d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u8 code dp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
u8 code w[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
u8 dat,flag,datavalue=0;
sbit beep=P3^7;
sbit LED=P3^6;
/******************************************************
函数名称: deplay(u16 t)
函数功能: 产生时间延时
入口参数: t
出口参数: 无
备注:
*******************************************************/
void delay(u16 t)
{
u8 i;
while(t--)
{
for (i=0;i<19;i++);
}
}
/*******************************************************
函数名称: beepon()
函数功能: 让蜂鸣器短暂发声用来作为发送和接收数据指示
入口参数: 无
出口参数: 无
备注:
******************************************************/
void beepon()
{
beep=0;
delay(500);
beep=1;
}
/********************************************************
函数名称: LEDflash()
函数功能; 让发光二极管闪耀
入口参数: 无
出口参数: 无
备注:
********************************************************/
void LEDflash()
{
LED=0;
delay(300);
LED=1;
}
/*******************************************************
函数名称: UART_inin()
函数功能; 串行通信初始化函数,做好发送和接收的准备
入口参数: 无
出口参数: 无
备注:
********************************************************/
void UART_init()
{
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
/******************************************************
函数名称: display(u16 k)
函数功能; 显示向pc发出的数据和pc发来的数据
入口参数: k
出口参数: 无
备注:
*****************************************************/
void display(u16 k)
{
P0=d[k/1000];
P2=w[3];
delay(30);
P0=d[k/100%10];
P2=w[2];
delay(30);
P0=d[k/10%10];
P2=w[1];
delay(30);
P0=d[k%10];
P2=w[0];
delay(30);
P1=0x00;
}
/******************************************************
函数名称: send()
函数功能; 向pc发送数据
入口参数: 无
出口参数: 无
备注:
*****************************************************/
void send()
{
ES=0; //暂时关闭串行中断,否则会又会进入中断服务程序,把a=SBUF;flag=1;
flag=0;
SBUF=datavalue;
while(!TI); //如果TI=1,就把它等待
TI=0; //一旦TI=0,就把它清零
ES=1; //闭合串行中断开关
}
/******************************************************
函数名称: main()
函数功能; 初始化串口,连续判断遥控器哪个键按下并做相应的处理
入口参数: 无
出口参数: 无
备注:
*****************************************************/
main()
{
P1=0xff;
UART_init(); //置输入状态
while(1) //串口工作前的准备工作
{
dat=(P1&0x0f); //把遥控器按键状态通过P1口送给变量dat
if(dat==0x08) //遥控器A键按下
{
delay(120);
dat=0;
beepon();
LEDflash();
datavalue++;
dat=0;
send();
}
if(dat==0x02) //C键按下,清零
{
delay(120);
dat=0;
beepon();
LEDflash();
datavalue=0;
send();
}
if(dat==0x01) //按下D键就发送
{
delay(120);
beepon();
LEDflash();
datavalue--;
send();
}
display(datavalue); //将读到的数显示
}
}
/******************************************************
函数名称: serial(void) interrupt 4
函数功能; 通过串行中断服务函数接收从PC发来的数据
入口参数: 无
出口参数: 无
备注: 串行中断的中断号是4
*****************************************************/
void serial(void) interrupt 4
{
RI=0;
datavalue=SBUF; //将串口接收到的数据保存到datavalue变量中
display(datavalue); //显示接收的数据
flag=1; //置收到数据的标志
beepon(); //蜂鸣器响一声
LEDflash(); //发光二极管闪一下
}
|