📄 模拟接受7219的数据.c
字号:
#include"AT89x051.H"
#include"intrins.h"
#define nop _nop_()
#define uchar unsigned char
sbit k_mod =P1^4;
sbit k_off =P1^5;
sbit k_add =P1^6;
sbit k_sub =P1^7;
sbit h1 =P3^7; //l_cool
sbit h2 =P3^5; //l_heat
sbit h3 =P1^0; //l_dry
sbit h4 =P3^4; //l_fan
sbit clk =P1^1;
sbit cs =P1^2;
sbit din =P1^3;
sbit h5=P3^3;
uchar mod,b,c,d,f;
bdata uchar mod_h,a,e;
sbit mod_h0=mod_h^0; //定义位变量
sbit mod_h1=mod_h^1;
sbit mod_h2=mod_h^2;
sbit mod_h3=mod_h^3;
sbit a0=a^0;
sbit a1=a^1;
sbit a2=a^2;
sbit a3=a^3;
sbit a4=a^4;
sbit a5=a^5;
sbit a6=a^6;
sbit a7=a^7;
sbit e0=e^0;
sbit e1=e^1;
sbit e2=e^2;
sbit e3=e^3;
sbit e4=e^4;
sbit e5=e^5;
sbit e6=e^6;
sbit e7=e^7;
//延时函数
void dlms(unsigned int x)
{uchar i;
while(x--){
for(i=0;i<125;i++)
{;}
}
}
//初始化程序
void init()
{
TMOD=0x20; // TMOD: timer 1, mode 2, 8-bit reload
TH1= 0Xf4; // TH1: reload value for 1200 baud @ 11.0592MHz
TL1= 0Xf4;
PCON=0X00;
SCON=0X50;
EA=0;
TR1 = 1;
ES=0;
}
//7219模拟接受,比较难做,方法是一位移位的接受做成这样比较难看
uchar recive_7219()
{
do { while(cs==0); //因为为查询,所以有可能此时cs为低
while(cs); //因为为查询,所以有可能此时cs为高
//退出高后就是低,此时即可jieshou
while(clk); //clk为高时等待其为低,
while(!clk);a7=0; //clk为低时空循环,退出循环即位上升沿立即接受shuju
while(clk);
while(!clk);a6=0;
while(clk);
while(!clk);a5=0;
while(clk);
while(!clk);a4=0;
while(clk);
while(!clk);a3=din;
while(clk);
while(!clk);a2=din;
while(clk);
while(!clk);a1=din;
while(clk);
while(!clk);a0=din;
while(clk);
while(!clk);e7=din;
while(clk);
while(!clk);e6=din;
while(clk);
while(!clk);e5=din;
while(clk);
while(!clk);e4=din;
while(clk);
while(!clk);e3=din;
while(clk);
while(!clk);e2=din;
while(clk);
while(!clk);e1=din;
while(clk);
while(!clk);e0=din;
b=a;}
while(b!=0x01); //高8位为寄存器地址,如果不等于0x01,
//继续循环直到为0x01退出
c=e;
do { while(cs==0);
while(cs);
while(clk);
while(!clk);a7=0;
while(clk);
while(!clk);a6=0;
while(clk);
while(!clk);a5=0;
while(clk);
while(!clk);a4=0;
while(clk);
while(!clk);a3=din;
while(clk);
while(!clk);a2=din;
while(clk);
while(!clk);a1=din;
while(clk);
while(!clk);a0=din;
while(clk);
while(!clk);e7=din;
while(clk);
while(!clk);e6=din;
while(clk);
while(!clk);e5=din;
while(clk);
while(!clk);e4=din;
while(clk);
while(!clk);e3=din;
while(clk);
while(!clk);e2=din;
while(clk);
while(!clk);e1=din;
while(clk);
while(!clk);e0=din;
b=a;}
while(b!=0x02);
d=e;
f=(c*10+d); //数据打包,转成10进制
return f; //返回数据
}
/***************************循环方式的接受*********************/
uchar recive_72191()
{uchar i,j;
do
{while(cs==0);
while(cs);
for(i=0;i<=3;i++)
{while(clk); //clk为高时等待其为低,
while(!clk);a0=0;
a<<=1;}
for(i=0;i<=3;i++)
{while(clk); //clk为高时等待其为低,
while(!clk);a0=din;
a<<=1;}
for(j=0;j<=7;j++)
{while(clk); //clk为高时等待其为低,
while(!clk);e0=din;
e<<=1;}
b=a;}
while(b!=0x01);
c=e;
do
{while(cs==0);
while(cs);
for(i=0;i<=3;i++)
{while(clk); //clk为高时等待其为低,
while(!clk);a0=0;
a<<=1;}
for(i=0;i<=3;i++)
{while(clk); //clk为高时等待其为低,
while(!clk);a0=din;
a<<=1;}
for(j=0;j<=7;j++)
{while(clk); //clk为高时等待其为低,
while(!clk);e0=din;
e<<=1;}
b=a;}
while(b!=0x02);
d=e;
f=(c*10+d); //数据打包,转成10进制
return f; //返回数据
}
/****************************************************/
//主函数
main()
{
init(); //初始化
mod_h=0xff; //初始化MOD-H变量
/***************************************************/
while(1)
{
if(RI){RI=0;mod=SBUF;} //接受线控板数据
mod_h0 = h1; //取得模式灯状态
mod_h1 = h2;
mod_h2 = h3;
mod_h3 = h4;
ES=0;SBUF=mod_h;while(!TI);TI=0;ES=1; //发送模式灯代码
/********************************************/
if(mod==0xe0) //温度模式服务程序
{mod=0;
ES=0;SBUF=recive_7219();while(!TI);TI=0;ES=1;}
/************************************************/
if(mod==0xb3) //温度+服务程序
{if(k_add) //其中有温度读取发送程序
{k_add=0;dlms(50);k_add=1;mod=0;
ES=0;SBUF=recive_7219();
while(!TI);TI=0;ES=1;}}
/************************************************/
if(mod==0xb1) //模式服务程序
{if(k_mod)
{k_mod=0;dlms(200);k_mod=1;mod=0;}}
/**********************************************/
if(mod==0xb2) //开关服务程序
{if(k_off) //开关后有温度变化,所以需要采集温度
{k_off=0;dlms(200);k_off=1;mod=0;
ES=0;SBUF=recive_7219();while(!TI);TI=0;ES=1;}}
/**************************************************/
if(mod==0xb4) //温度-服务程序
{if(k_sub) //其中有温度读取发送程序
{k_sub=0;dlms(50);k_sub=1;mod=0;
ES=0;SBUF=recive_7219();
while(!TI);TI=0;ES=1;}}
/**************************************************/
/*以下为转换板检测原线控板(本控器)的按键程序,
此程式可以做到原版操作后现有的通信板可以与原版同步,完全兼容员线控板*/
if(k_sub==0) //温度-,与温度有关
{dlms(1);
if(k_sub==0)
{ES=0;SBUF=recive_7219();
while(!TI);TI=0;ES=1;}
}
if(k_add==0) //温度+,与温度有关
{dlms(10);
if(k_add==0)
{ES=0;SBUF=recive_7219();
while(!TI);TI=0;ES=1;}
}
if(k_off==0) //关开机键,与温度有关
{dlms(1);
if(k_off==0)
{ES=0;SBUF=recive_7219();
while(!TI);TI=0;ES=1;}
}
}
}
/************************************************************************/
// 此文件需与startup.a51连接,使用编译器keilc51-v7。09版,编译。
//电路板使用11.0592mhz的频率,采用max232epe芯片,通信波特率2400,全双工方式。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -