📄 receive.c
字号:
#include <reg51.h>
#include <intrins.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define lcd_bus P1
#define key_bus P0
sbit rt=P2^4;
sbit enable=P2^7;
sbit beep=P2^5;
// lcd
sbit rs=P2^0;
sbit rw=P2^1;
sbit e =P2^2;
uchar offset=0x80;
uchar inte; //整数部分
uchar dec; //小数部分
uint detemp; //年月摄氏度
uchar state=0;
uchar TLL;
uchar THH;
uchar code hanzi[]={0x80,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,
0xf,0x9,0xf,0x9,0xf,0x9,0x11,0,
0x1C,0x14,0x1C,0x0,0x0,0x0,0x00,0x00,
0x06,0x08,0x10,0x10,0x10,0x08,0x06,0x00};
uchar code str1[]="temperature is:";
uchar code str2[]="welcome";
uchar code str3[]="1:temperature";
uchar code str4[]="2:INPUT TL";
uchar code str5[]="3:INPUT TH";
uchar code str6[]="4:send";
uchar code str7[]="sending";
uchar code key_table[16]={15,0,14,13,7,8,9,12,4,5,6,11,1,2,3,10};
/*****************读按键***************/
uchar getkey()
{
uchar keycode=0xff,temp,i;
key_bus=0x0f;
temp=key_bus&0x0f;
if(temp!=0x0f) //有键按下
{
key_bus=0x7f;
for(i=0;i<4;i++)
{
temp=key_bus&0x0f;
if(temp==0x07)
{
keycode=i*4;
break;
}
else if(temp==0x0b)
{
keycode=i*4+1;
break;
}
else if(temp==0x0d)
{
keycode=i*4+2;
break;
}
else if(temp==0x0e)
{
keycode=i*4+3;
break;
}
key_bus=(key_bus>>1)|0x80;
}
while((key_bus&0x0f)!=0x0f) //等待释放
{
key_bus=0x0f;
}
}
return key_table[keycode];
}
//////////////////////////////////////////
delay(uchar d)
{
while(--d);
}
/**********判断忙标志,返回的是一个位BF**********/
bit lcd_busy(void)
{
uchar bflag;
rs=0;
rw=1;
_nop_();
e=1;
_nop_();
lcd_bus=0xff;
bflag=lcd_bus;
e=0;
return(bit)(bflag&0x80); //BF=1 busy
}
/*********写命令,有两个参数,第一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1:判断;为 0:不判断****************/
void lcd_wrcmd(uchar cmd)
{
while(lcd_busy());
lcd_bus=cmd;
rs=0;
rw=0;
_nop_();
e=1;
_nop_();
_nop_();
e=0;
}
/************向液晶片写数据***************/
void lcd_wrdata( uchar lcddata)
{
while(lcd_busy());
lcd_bus=lcddata;
rs=1;
rw=0;
_nop_();
e=1;
_nop_();
_nop_();
e=0;
}
/****************初始化***************/
void lcd_ini(void)
{
lcd_wrcmd(0x38);
delay(100);
lcd_wrcmd(0x0c);
delay(100);
lcd_wrcmd(0x06);
delay(100);
lcd_wrcmd(0x01);
delay(100);
}
//////////////////////////////////////////////
//
// 生成汉字子模函数
// 当lcd_wrdata(0);显示第一个汉字
// 当lcd_wrdata(1);显示第二个汉字
//
//////////////////////////////////////////////
lcd_h()
{
uchar i;
lcd_wrcmd(0x40);
for(i=0;i<32;i++) lcd_wrdata(hanzi[i]);
}
receivedata() interrupt 4 //接收中断
{ uchar temp;
static bit flag_inte=0,flag_dec=0; //整数部分和小数部分的标志
temp=SBUF;
if(flag_dec==1)
{
dec=temp; //接收小数部分
flag_dec=0; // 清除小数标志
}
if(flag_inte==1)
{inte=temp; //接收整数部分
flag_inte=0; // 清除整数标志
}
if(temp==0xfe) flag_dec=1; //表示下面发送的是小数部分
if(temp==0xff) flag_inte=1; //表示下面发送的是整数部分
RI=0; //清除中断标志
}
senddata(unsigned char dat) //串口发送数据
{SBUF=dat;
while(TI==0);
TI=0;
}
serial_init() //串口初始化
{
SCON=0X50; /* SCON: 串口方式1, 8位异步通信,接收使能*/
TMOD=0x20; /*波特率发生需用定时器1:TMOD: 定时器1, 8位自动重装 */
PCON= 0x80; //双倍时钟
TH1=0xfd; /* TH1:自动重装值,19200baud ,晶振11.0592MHz */
TL1=0xfd;
TR1=1; /* TR1:启动定时器1 */
ES=1;
EA=1;
}
void tempdisplay(void)
{
uchar i,r=0,j,iii;
uchar stra[3];
uchar xiaoshu[4];
lcd_wrcmd(0x0f);
lcd_wrcmd(0x81);
for(j=0;j<16;j++)lcd_wrdata(str1[j]);
while(1)
{ if(inte<TLL||inte>=THH)
beep=1;
else beep=0;
detemp=dec*625;
xiaoshu[0]=detemp/1000+'0';
xiaoshu[1]=detemp%1000/100+'0';
xiaoshu[2]=detemp%100/10+'0';
xiaoshu[3]=detemp%10+'0';
stra[0]=inte/100+'0';
stra[1]=inte%100/10+'0';
stra[2]=inte%10+'0';
if(stra[0]=='0')
r=1;
lcd_wrcmd(0xc2+r);
for(i=r;i<3;i++)
lcd_wrdata(stra[i]);
lcd_wrdata('.');
for(i=0;i<4;i++)
lcd_wrdata(xiaoshu[i]);
delay(100);
lcd_wrdata(2);
lcd_wrdata(0x43);
for(i=0;i<4;i++)
lcd_wrdata(' ');
iii=getkey();
if(iii==1)
enable=!enable;
if(iii==13)
{
state=1;
lcd_wrcmd(0x0c);
lcd_wrcmd(1);
lcd_wrcmd(0x80);
break;
}
}
}
welcome()
{
uchar temp=0x12,w;
lcd_wrcmd(0x0c);
lcd_wrcmd(0x82);
for(w=0;w<strlen(str2);w++)
lcd_wrdata(str2[w]);
lcd_h();
lcd_wrcmd(0xc4);
lcd_wrdata('2'); lcd_wrdata('0');lcd_wrdata('0');lcd_wrdata('7');
lcd_wrdata(0);
lcd_wrdata('0');lcd_wrdata('8');
lcd_wrdata(1);
while(1)
{
temp=getkey();
if(temp>=0&&temp<=15) //按任意键跳转
{
state=1;
lcd_wrcmd(1);
break;
}
}
}
menu()
{
uchar i,ii,cnt=1;
lcd_wrcmd(0x83);
for(i=0;i<strlen(str3);i++)
lcd_wrdata(str3[i]);
lcd_wrcmd(0xc3);
i=0;
while(str4[i]!='\0')
{
lcd_wrdata(str4[i]);
i++;
}
lcd_wrcmd(0x80);
lcd_wrdata('-');
lcd_wrdata('>');
while(1)
{
ii=getkey();
///////////////////////////翻屏///////////////////////////////
if(ii==15)
{ cnt++;
if(cnt==5) cnt=1;
if(cnt==1)
{ //////////////////////
// -> 1: tempeture
// 2: INPUT TL
/////////////////////
lcd_wrcmd(1);
lcd_wrcmd(0x83); //tempeture
for(i=0;i<strlen(str3);i++)
lcd_wrdata(str3[i]);
lcd_wrcmd(0xc3);
for(i=0;i<strlen(str4);i++)
lcd_wrdata(str4[i]); //INPUT TL
lcd_wrcmd(0x80);
lcd_wrdata('-');
lcd_wrdata('>');
}
if(cnt==2)
{ //////////////////////
// 1: tempeture
// -> 2: INPUT TL
/////////////////////
lcd_wrcmd(1);
lcd_wrcmd(0x83); //tempeture
for(i=0;i<strlen(str3);i++)
lcd_wrdata(str3[i]);
lcd_wrcmd(0xc3);
for(i=0;i<strlen(str4);i++)
lcd_wrdata(str4[i]); //INPUT TL
lcd_wrcmd(0xc0);
lcd_wrdata('-');
lcd_wrdata('>');
}
if(cnt==3)
{ //////////////////////
// 2: INPUT TL
// -> 3: INPUT TH
/////////////////////
lcd_wrcmd(1);
lcd_wrcmd(0x83); //INPUT TL
for(i=0;i<strlen(str4);i++)
lcd_wrdata(str4[i]);
lcd_wrcmd(0xc3);
for(i=0;i<strlen(str5);i++)
lcd_wrdata(str5[i]); //INPUT TH
lcd_wrcmd(0xc0);
lcd_wrdata('-');
lcd_wrdata('>');
}
if(cnt==4)
{ //////////////////////
// 3: INPUT TH
// -> 4:send
/////////////////////
lcd_wrcmd(1);
lcd_wrcmd(0x83); //INPUT TL
for(i=0;i<strlen(str5);i++)
lcd_wrdata(str5[i]);
lcd_wrcmd(0xc3);
for(i=0;i<strlen(str6);i++)
lcd_wrdata(str6[i]); //INPUT TH
lcd_wrcmd(0xc0);
lcd_wrdata('-');
lcd_wrdata('>');
}
}
////////////////////////////////////////////////////////////////
else if(ii==14) //进入接收端各子菜单
{
if(cnt==1) //显示温度
{
state=2;
lcd_wrcmd(1);
break;
}
else if(cnt==2) //输入接收端的下限温度值
{
state=3;
lcd_wrcmd(1);
break;
}
else if(cnt==3) //输入接收端上限温度报警值
{
state=4;
lcd_wrcmd(1);
break;
}
else if(cnt==4) //输入接收端上限温度报警值
{
state=5;
lcd_wrcmd(1);
break;
}
}
}
}
/********输入温度的下限值***************/
input_tl()
{
uchar i,j,n,cnt=0;
uchar TL[3];
for(i=0;i<3;i++)
TL[i]=0;
lcd_wrcmd(0x80);
lcd_wrdata('T');
lcd_wrdata('L');
lcd_wrdata('=');
while(1)
{i=getkey();
if(i<10)
{ cnt++;
if(cnt<=3)
{ TL[cnt-1]=i;
lcd_wrcmd(0x83+cnt-1);
lcd_wrdata(0x30+i);
}
else{
cnt=0;
lcd_wrcmd(0x83);
for(j=0;j<=3;j++)
lcd_wrdata(' ');
lcd_wrcmd(0x83);
}
}
else if(i==12)
{
state=1;
lcd_wrcmd(0x0c);
lcd_wrcmd(1);
lcd_wrcmd(0x80);
n=strlen(TL);
if(TL[2]>=0&&TL[2]<=9)
TLL=TL[0]*100+TL[1]*10+TL[2];
break;
}
}
}
/****************输入温度的上限值***************/
input_th()
{
uchar i,j,n,cnt=0;
uchar TH[3];
for(i=0;i<3;i++)
TH[i]=0;
lcd_wrcmd(0x80);
lcd_wrdata('T');
lcd_wrdata('H');
lcd_wrdata('=');
while(1)
{i=getkey();
if(i<10)
{ cnt++;
if(cnt<=3)
{ TH[cnt-1]=i;
lcd_wrcmd(0x83+cnt-1);
lcd_wrdata(0x30+i);
}
else{
cnt=0;
lcd_wrcmd(0x83);
for(j=0;j<=3;j++)
lcd_wrdata(' ');
lcd_wrcmd(0x83);
}
}
else if(i==12)
{
state=1;
lcd_wrcmd(0x0c);
lcd_wrcmd(1);
lcd_wrcmd(0x80);
n=strlen(TH);
if(TH[2]>=0&&TH[2]<=9)
THH=TH[0]*100+TH[1]*10+TH[2];
break;
}
}
}
send_tlth() //发送上下限值
{ uchar i;
uchar w;
lcd_wrcmd(0x0c);
lcd_wrcmd(0x82);
for(w=0;w<strlen(str7);w++)
lcd_wrdata(str7[w]);
while(1)
{
i=getkey();
senddata(0xfd);
senddata(THH);
senddata(0xfc);
senddata(TLL);
delay(110);
if(i==13)
{
state=1;
lcd_wrcmd(0x0c);
lcd_wrcmd(1);
lcd_wrcmd(0x80);
break;
}
}
}
void main()
{
lcd_bus=0xff;
lcd_ini();
serial_init();
lcd_h();
enable=0;
rt=1;
while(1)
{
if(state==0) welcome();
else if(state==1)
{EA=1;
ES=1;
menu();
}
else if(state==2) tempdisplay();
else if(state==3) input_tl();
else if(state==4) input_th();
else if(state==5)
{EA=0;
ES=0;
send_tlth();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -