⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 模拟接受7219的数据.c

📁 模拟接受max7219的数据
💻 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 + -