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

📄 main.c

📁 LIN总线的串行通信源程序 通过编译成功
💻 C
字号:
#include "reg932.h"

#define CONID 	0x42//00h-10h
#define STAID 	0x92
#define CMDID 	0xe2

#define MODE0 	0
#define MODE1	1
#define MODE2 	2
#define MODE3	3

#define uint8 unsigned char 

extern  void AutoBaudrateAdj();
extern void ISP_INI();

sbit TX=P1^0;
sbit RX=P1^1;
//sbit SLNP=P0^3;
sbit LED1=P0^1;
sbit LED2=P0^2;
sbit LED3=P0^3;
sbit LED4=P0^4;
sbit LED5=P0^5;

sbit ISP_BIT=P2^1;

bit	l_flg_recgood=0;
bit l_flg_timeok=0;
bit led_all_light=1;

uint8 l_sys_mode;
uint8 l_rec_data[10];
uint8 l_ledsta=2;
uint8 l_ledsep=0x8;
uint8 time=1;
uint8 flash=0;
unsigned int sleep_cout=0;
void delay();
void delayNS(unsigned int k);
uint8 checksum8(uint8 *chk8,uint8 num);
bit l_rce_data(void);
void l_send_back(uint8 * data_ptr,uint8 num);
void l_cmd_handle();
void l_sta_handle();
void l_con_handle();
void l_rtc_init();

void Int1_Isr() interrupt 2
{//uint8 i;
	EX1=0;
	ISP_BIT=0;
	switch (l_sys_mode)
	{
		case MODE0:
			TH0=255-((255-TH1)*160)/256;
			TL0=255-((255-TH1)*160)%256;//检测第11位的电平。
			TR0=1;
			sleep_cout=0;
			while(TF0==0);
			TF0=0;
			TR0=0;
			if(RX==0)
				l_sys_mode=MODE1;	
			break;
			
		case MODE1:
			AutoBaudrateAdj();
			if(TH1<0X80)
			{
				TH1=0XFD;
				l_sys_mode=0;
			}
			else
				l_sys_mode=MODE2;//可以增加一些条件
			break;
		case MODE2:
			TH0=0;
			TL0=0;
			TR0=1;
			while(RI==0&&TF0==0);
			TR0=0;
			if(TF0==0)
			{
				RI=0;
				l_rec_data[0]=SBUF;
				if(l_rec_data[0]==CONID)//增加可睡眠和命令
				{
					l_sys_mode=MODE3;
				}
				else if(l_rec_data[0]==CMDID)
				{
					l_sys_mode=MODE3;
				}
				else if(l_rec_data[0]==STAID)
				{
					l_sys_mode=MODE3;
				}
				else if(l_rec_data[0]==0x80)
				{
					l_sys_mode=MODE3;
				}
				else
					l_sys_mode=MODE0;
				
			}
			else
			{
				TF0=0;
				l_sys_mode=MODE0;
			}
			
			break;

		case MODE3:
			break;
        default : break;

	}
	if(l_sys_mode!=MODE3)
	{
		IE1=0;
		EX1=1;
	}
	ISP_BIT=1;
}
main()
{
	unsigned int cout=0;
	delay();
  	P2M1 = 0x00;			// 初始化端口
  	P2M2 = 0x00; 
	P1M1=0;
	P1M2=1;
	P0M1 = 0x00;			// 初始化端口
  	P0M2 = 0x00;
 	if(ISP_BIT==0)
	{
		ISP_INI();
		delay();
		LED3=0;
		while(1);
	}
	P0=0XAA;
	delayNS(100);
	P0=0X55;
	delayNS(100);
	P0=0XFF;
	l_sys_mode=0;
	TMOD=0X21;
	TH1=0XFD;
	PX1=1;
	IP0H=0X02;
	IT1=1;
	EX1=1;
	EA=1;
	l_rtc_init();
	while(1)
	{
		if(l_sys_mode==MODE3)
		{
			EX1=0;
			if(l_rec_data[0]==CMDID||(l_rec_data[0]==0x80))
			{
				l_flg_recgood=l_rce_data();
			}
			else if(l_rec_data[0]==STAID)
			{	
				IE1=0;
				EX1=0;
				l_sta_handle();
			}
			else if(l_rec_data[0]==CONID)
			{	
				IE1=0;
				EX1=0;
				l_con_handle();
			}
			if(l_flg_recgood)
			{
				IE1=0;
				EX1=0;
			}
			else 
			{
				TR1=0;
				IE1=0;
				EX1=1;
				l_sys_mode=MODE0;
				TR1=0;
			}
		
		}
		if(l_flg_recgood)
		{
			if(l_rec_data[0]==CMDID)
			{
				l_cmd_handle();
			}
			else if(l_rec_data[0]==0x80)
			{
				sleep_cout=1999;
			}
			TR1=0;
			IE1=0;
			EX1=1;
			l_sys_mode=MODE0;
			l_flg_recgood=0;
			TR1=0;
		}
		if((RTCCON&0x80)==0x80)
		{
			RTCCON&=0x63;
			if(time==l_ledsep)
				{
					l_flg_timeok=1;
					time=0;
				}
			else
				time++;
			sleep_cout++;
			if(sleep_cout==2000)
			{
				P0=0XFF;
				PCON=PCON|0X03;
			}
		}
		if((l_flg_timeok==1)&&(led_all_light==1))
		{
			switch(l_ledsta&0x03)
			{
				case 2 :
					if(flash!=0)
						flash=flash<<1;
					else
						flash=0x01;
					break;
				case 3 :
					if(flash!=0)
						flash=flash>>1;
					else
						flash=0x80;
					break;
				default : 
					break;
			}
			l_flg_timeok=0;
			P0=flash^0xff;
		}
	}
}
void delay()
{
unsigned char i,j;
for(i=0;i<110;i++)
for(j=0;j<110;j++);

}
void delayNS(unsigned int k)
{
unsigned char i,j;
for(;k>0;k--)
for(i=0;i<110;i++)
for(j=0;j<110;j++);

}
uint8 checksum8(uint8 *chk8,uint8 num)
{
uint8 temp=0;
	for( ;num>0;num--)
	{
		temp=temp+*chk8;
		if(temp<*chk8)
			temp++;
		chk8++;
	}
	return(0xff-temp);	
}
bit l_rce_data(void)
{
uint8 ii,temp;
	TH0=0;
	TL0=0;//可以增加选项
	TR0=1;
	while(RI==0&&TF0==0);
	TR0=0;
	if(TF0==0)
	{
		RI=0;
		l_rec_data[1]=SBUF;
		if(l_rec_data[0]==CMDID)
			temp=5;
		else 
			temp=3;
		for(ii=2;ii<=temp;ii++)
		{	
			TH0=0;
			TR0=1;
			while(RI==0&&TF0==0);
			TR0=0;
			if(TF0==0)
			{
				RI=0;
				l_rec_data[ii]=SBUF;
			}
			else
			{
				TF0=0;
				break;
			}	
		}
		if(l_rec_data[temp]==checksum8(&l_rec_data[1],temp-1))
		{
			l_rec_data[temp]=0;//清除校验和
			return 1;
		}
		l_rec_data[temp]=0;//清除校验和
		return 0;	
	}
	else
	{
		TF0=0;
		return(0);
	}
}
void l_send_back(uint8 * data_ptr,uint8 num)
{
uint8 temp;
	EX1=0;
	SCON=0X40;
	for(temp=0;temp<num;temp++)
	{
		SBUF=*data_ptr;
		while(TI==0);
		TI=0;
		data_ptr++;
	}
	data_ptr=data_ptr-num;
	SBUF=checksum8(data_ptr,num);
	while(TI==0);
	TI=0;
	SCON=0X50;
	IE1=0;
	//EX1=1;
}
void l_cmd_handle()
{
	l_ledsta=l_rec_data[1]&0x03;
	l_ledsep=(l_rec_data[1]&0xf0)>>4;
	if(l_ledsep==0)
	{
		led_all_light=0;
		P0=0;
	}
	else
		led_all_light=1;
	flash=0;
	time=0;
}
void l_sta_handle()
{
	l_rec_data[1]=(l_ledsep<<4)+l_ledsta;
	l_send_back(&l_rec_data[1],2);
}
void l_con_handle()
{
	l_rec_data[1]=1;
	l_rec_data[2]=0;
	l_send_back(&l_rec_data[1],2);
}
void l_rtc_init()
{

RTCH=0x3;
RTCL=0Xff;
RTCCON=0X63;//??
PWDRT=0;
//EWDRT=1;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -