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

📄 sy3.c

📁 采用红外线传感器
💻 C
字号:
#include <pic.h>
//#include <pic16f87.h>
#include <math.h>
#include <stdio.h>
//#define STORE		RA3
#define SCLK		RA5
#define TK			RB0
//#define KEYZERO	   	RB1
//#define	ADBUSY	   	RC5
#define	LCD_DA   	RB1
#define	LCD_CK   	RB4
#define	LCD_CS   	RB5
#define SVDD		RB6
#define RLAY		RB7
#define ADCLK		RB3
#define	ADCS   		RA0
#define	ADIN		RB2
#define ADOUT	   	RC5
#define LAMP		RA1
#define ALARM		RA4
#define JL_UD	   	RC6///////
#define MR_CS 		RC7

#define LCD_ON 0x8060
#define LCDOFF 0x8000
#define SYS_EN 0x8020
#define BAIS_4 0x8520//LCD相关口的定义结束
unsigned int  j,k,lcdi,w1,lcdj,lcddigit,timetemp,jl_data,dx;
bank2 unsigned char lcdaddr,lcddata,lcdcom,time,adl,sec,err4,INIDATA1,INIDATA2;
bank3 unsigned char lcdid,lcddata1,lcdaddr1,lcdall,adt,errall,alarmall;
bank3 unsigned char digitbit1,digitbit2,digitbit3,digitbit4,err5,thousandbit;
bank3 unsigned char handredbit,tenbit,entriesbit,err1,BITRC4,LAMPCON,chronum,HYADI;
bank2 unsigned long refchzct,gaschzct,gaschzc,refchzc,avg;
union adres
{
	int y1;
	unsigned char adre[2];
}adresult;
unsigned int uo;
union mrunion
{
	int mrdata;
	unsigned char mrlh[2];
}mrall;
union jlunion
{
	int jl;
	unsigned char jllh[2];
}jlall;
union adsht
{
	int y2;
	unsigned char adsh[2];
}adshort;
unsigned int chroave,chroold,chronew,gasmax,gasmin,avgchro;
unsigned int shortave;
bank3 	unsigned int adsumtemp,adsum,chrotemp,refchz,gaschz,Vrefchz,FAINT,gastemp,reftemp;
bank3  double adshttemp,adshtsum;
unsigned char arrlcd[20]={0X07,0X0D,0X03,0X00,0X06,0X0B,0X07,0X0A,//0-3
							0X03,0X06,0X05,0X0E,0X05,0X0F,//4-6
							0X07,0X00,0X07,0X0F,0X07,0X0E};//7-9
bank3  unsigned int  re[5],mrtemp,min,max,num;
//bank2	unsigned int resht[20],chroshort,ttdata;
bank2 unsigned char jlj,jli,jlk,ykj,mr,aml,amh,madata,sendi,sendj;
bank2 unsigned int yki,m,n,ysi,forcenum,keyi,yysi,mr_data,jl_datadis,Vrefchzc;
bank2 unsigned int chrochar,mr_datadis,numini,refmax,refmin,Vrefmax,Vrefmin;
bank2 unsigned char yk_data,yk_add,yk_dec,yk_esc,yk_tab;
bank2 unsigned char keyk,yk_enter,yk_set,yk_data3,yk_data4;//,almini;
bank3 unsigned char errid,recom1,jl_bit,yk_delay,TxData=0X00;
bank3 unsigned char mrdata,yk_t,sendbit;//,recom1;
bank3 unsigned char bk,mrj,RcData,RcFlag,ADSET,adj,adk;
bank2 float FA,FB,FC;													

////////////////////////////遥控接收///////////////////////
void dlay(void)
 {
  #asm
  nop;nop;nop;nop;nop;nop;nop;nop;
  #endasm
 }
void delay_all(unsigned int delaynum)
{	
	for(num=0;num<delaynum;num++){;}
}
///////////////////////////////中断服务子程序//////////////////////////
	
	

//发送LCD的ID和命令控制字,w1=命令字
void LCD_CMD()
{
	LCD_CS = 0;
	for (lcdj=0;lcdj<12;lcdj++)
	{
  	if (w1&0x8000) 
		{
			LCD_DA=1;
		}
   		else 
		{
			LCD_DA=0;
		}
    LCD_CK = 0;
    LCD_CK = 1;
    w1 <<= 1;
	}
	LCD_CS = 1;
	LCD_DA = 1;
}

//初始化LCD
void LCD_SETUP(void)
{	
  w1 = LCD_ON;
  LCD_CMD();
  w1 = SYS_EN;
  LCD_CMD();
  w1 = BAIS_4;
  LCD_CMD();
}

//发送显示数据引导
void LCD_WRITE_HEAD(void)
{
	LCD_DA = 1;    //1
	LCD_CK = 0;
	LCD_CK = 1;

	LCD_DA = 0;    //0
	LCD_CK = 0;
	LCD_CK = 1;

	LCD_DA = 1;    //1
	LCD_CK = 0;
	LCD_CK = 1;
}

//LCD送4位显示码
//输入: lcddata = 4位
//      lcdaddr = 偏移地址
void lcd_addr()
{
	LCD_CS = 0;
	LCD_WRITE_HEAD();
	for (lcdi=0;lcdi<6;lcdi++)
 	{ 
    	if (lcdaddr & 0x20) 
		{
			LCD_DA = 1;
		}
    	else 
		{
			LCD_DA = 0;
		}
		LCD_CK = 0;
    	LCD_CK = 1;
    	lcdaddr <<= 1;
	}
}

void lcd_data()
{
	LCD_CS=0;
	for (lcdi=0;lcdi<4;lcdi++) 
	{ 
   	if (lcddata&0x08) 
		{
			LCD_DA=1;
		}
   	else 
		{
			LCD_DA=0;
		}
   	LCD_CK=0;
   	LCD_CK=1;
   	lcddata<<=1;
	}
	LCD_CS = 1;
}

//////LCD全显子程序//////
void lcd_display(lcdall)
{
	CLRWDT();
	LCD_CS = 1;
	LCD_CS = 0;
	lcdaddr = 0x00;
	lcddata = lcdall;
	for(k=0;k<0x20;k++)
	{
		lcdaddr1=lcdaddr;
		lcd_addr();
		lcddata1=lcddata;
		lcd_data();
		lcdaddr1=lcdaddr1+1;
		lcdaddr=lcdaddr1;
		lcddata=lcddata1;
	}
	LCD_CS=1;
}
//////////////////////////////////////////
//函数名称:digit_bit1(digitbit1)
//输入参数:位对应的数据digitbit1
//				 
//输出参数:无
//函数功能:显示第一位数据
//////////////////////////////////////////
void digit_bit1(digitbit1)
{	
	CLRWDT();
	LCD_CS = 0;
	lcdaddr = 0X00;
	digitbit1 = digitbit1*2;
	lcddata = arrlcd[digitbit1];
	lcd_addr();
	lcd_data();
	lcdaddr = 0x01;
	digitbit1 = (digitbit1 + 1);
	lcddata = arrlcd[digitbit1];
	lcd_addr();
	lcd_data();
	LCD_CS = 1;
}
	
//////////////////////////////////////////
//函数名称:digit_bit2(digitbit2)
//输入参数:位对应的数据digitbit2
//				 
//输出参数:无
//函数功能:显示第二位数据
//////////////////////////////////////////
void digit_bit2(digitbit2)
{	
	CLRWDT();
	LCD_CS = 0;
	lcdaddr = 0X02;
	digitbit2 = digitbit2*2;
	lcddata = arrlcd[digitbit2];
	lcd_addr();
	lcd_data();
	lcdaddr = 0x03;
	digitbit2 = (digitbit2 + 1);
	lcddata = arrlcd[digitbit2];
	lcd_addr();
	lcd_data();
}
//////////////////////////////////////////
//函数名称:digit_bit3(digitbit3)
//输入参数:位对应的数据digitbit3
//				 
//输出参数:无
//函数功能:显示第三位数据
//////////////////////////////////////////
void digit_bit3(digitbit3)
{	
	CLRWDT();
	LCD_CS = 0;
	lcdaddr = 0X06;
	digitbit3 = digitbit3*2;
	lcddata = arrlcd[digitbit3];
	lcd_addr();
	lcd_data();
	lcdaddr = 0x07;
	digitbit3 = (digitbit3 + 1);
	lcddata = arrlcd[digitbit3];
	lcd_addr();
	lcd_data();
}
//////////////////////////////////////////
//函数名称:digit_bit4(digitbit4)
//输入参数:位对应的数据digitbit4
//				 
//输出参数:无
//函数功能:显示第四位数据
//////////////////////////////////////////
void digit_bit4(digitbit4)
{	
	CLRWDT();
	LCD_CS = 0;
	lcdaddr = 0X09;
	digitbit4 = digitbit4*2;
	lcddata = arrlcd[digitbit4];
	lcd_addr();
	lcd_data();
	lcdaddr = 0x0A;
	digitbit4 = (digitbit4 + 1);
	lcddata = arrlcd[digitbit4];
	lcd_addr();
	lcd_data();
}

////////////////////////////
//函数名称:digit_dispiay
//输入参数:要显示的数lcddigit
//输出参数:无
//函数功能:显示一个四位的数据
////////////////////////////
void digit_display(lcddigit)
{
	thousandbit = (lcddigit/1000);
	lcddigit = (lcddigit%1000);
	handredbit = (lcddigit/100);
	lcddigit = (lcddigit%100);
	tenbit = (lcddigit/10);
	entriesbit = (lcddigit%10);
	
	//digit_bit1(00);
	if(thousandbit ==0)
	{
		lcdaddr = 0x00;
		lcddata = 0x00;
		lcd_addr();
		lcd_data();
		lcdaddr = 0x01;
		lcddata = 0x00;
		lcd_addr();
		lcd_data();
		
		if(handredbit == 0)
		{	
			lcdaddr = 0x02;
			lcddata = 0x00;
			lcd_addr();
			lcd_data();
			lcdaddr = 0x03;
			lcddata = 0x00;
			lcd_addr();
			lcd_data();
			if(tenbit == 0)
			{
				lcdaddr = 0x06;
				lcddata = 0x07;
				lcd_addr();
				lcd_data();
				lcdaddr = 0x07;
				lcddata = 0x0D;
				lcd_addr();
				lcd_data();
				if(entriesbit == 0)
				{
					lcdaddr = 0x09;
					lcddata = 0x07;
					lcd_addr();
					lcd_data();
					lcdaddr = 0x0A;
					lcddata = 0x0D;
					lcd_addr();
					lcd_data();					
				}
				else
				{
					digit_bit4(entriesbit);
				}
			}
			else
			{
				digit_bit3(tenbit);
				digit_bit4(entriesbit);
			}
		}
		else
		{
			digit_bit2(handredbit);
			digit_bit3(tenbit);
			digit_bit4(entriesbit);
		}
	}
	else
	{
		digit_bit1(thousandbit);
		digit_bit2(handredbit);
		digit_bit3(tenbit);
		digit_bit4(entriesbit);	
	}
}
/////////////////////////////////////////////////

////////////////////////////////采样//////////////////////////
void lcd_clr(void)
{
	CLRWDT();
	lcdaddr = 0x01;lcddata = 0x00;//清0						
	lcd_addr();lcd_data();
	lcdaddr = 0x02;lcddata = 0x00;//清0						
	lcd_addr();lcd_data();
	lcdaddr = 0x03;lcddata = 0x00;
	lcd_addr();lcd_data();
	lcdaddr = 0x06;lcddata = 0x00;//清0						
	lcd_addr();lcd_data();
	lcdaddr = 0x07;lcddata = 0x00;
	lcd_addr();lcd_data();
	lcdaddr = 0x09;lcddata = 0x00;//清0						
	lcd_addr();lcd_data();
	lcdaddr = 0x0A;lcddata = 0x00;
	lcd_addr();lcd_data();
	CLRWDT();
}
//////////////////////按键处理子程序////////////////////////

///////////////////////4~20mA发送子程序//////////////////

/////////////////////////////主程序///////////////////////
void main()
{
//	OPTION = 0XCE;//0XCD;//初始化
	STATUS = 0X00;
	T1CON	 = 0X00;
	PIR1	 = 0X00;	
	TRISA  = 0X00;//RA0,RA1,RA2为采样输入
	TRISB  = 0X05;//RB0为遥控接受设为输入	
	RA4=0;//while(1){;}
	TRISC  = 0X00;
	PORTC =0X00;
	GIE=1;PEIE=1;
	PIR1=0X00;
	PIE1=0X20;
	T1CON  = 0X00;
	
	TMR1IE = 0;		
	TMR1ON = 0;		
	INTE = 0;		
	ADIE = 0;		
	//ADCON0 = 0X41;
	//ADCON1 = 0X80;	
	//ADCON1 = 0X86;	
	//ADCON1 = 0X82;
	CLRWDT();
	LCD_SETUP();
	CLRWDT();	
	lcd_display(0xff);
	lcdaddr = 0x11;
	lcddata = 0x00;
	lcd_addr();
	lcd_data();
	CLRWDT();
	delay_all(30000);
	CLRWDT();	
	delay_all(30000);
	CLRWDT();
	delay_all(30000);
	CLRWDT();
	delay_all(30000);
	CLRWDT();	
	lcd_display(0x00);
	INTE = 1;			//外部中断打开1111111	
	ADIF = 0;	
	ADCON0 = (ADCON0&0XFB);
	lcdaddr = 0x0C;
	lcddata = 0x04;
	lcd_addr();
	lcd_data();
	lcdaddr = 0x10;
	lcddata = 0x08;
	lcd_addr();
	lcd_data();
	yk_t = 1;
	jl_bit = 0;
	SVDD = 1;BITRC4=0X00;LAMPCON=0X00;
	//GIE=1;PEIE=1;TMR1IF=0;TMR1IE=1;T1CON=0X20;TMR1L=0X00;
	//TMR1H=0XD3;TMR1L=0X9C;T1CON=0X21;RC5=0;
	//ADCON1 = 0X86;	    	
	CHS0 = 0;
	CHS1 = 0;
	CHS2 = 0;
	ADIE=0;RC5=0;chroave=0x00;
	ADCS=1;ADCLK=1;ADOUT=1;max=0x00;gaschz=0x0000;refchz=0x0000;
	chronum=0;
	LAMP=1;HYADI=0X00;avg=0x00;avgchro=0x00;
	
	while(1)
	{	LAMP=1;
		delay_all(1000);//delay_all(500);
			/*gaschzct=gaschzc*9499;
			refchzct=refchzc*12514;
			if(refchzct!=0)
			{
		FA=((float)gaschzct)/((float)refchzct);}
		FA=2.3089-FA*2.3089;
		if(FA<0X00){FA=0X00;}
		FB=47.67054*FA*FA+112.35265*FA;
		if(FA!=0.58048){FC=0.58048-FA;}
		
		FA=(FB*10)/FC;
		if(FA<0){FA=0x00;}
		FAINT=(unsigned int)FA;
		
		chrochar=FAINT;	

		HYADI=HYADI+1;
		avg=avg+chrochar;
		if(HYADI==100)
		{avgchro=avg/100;HYADI=0;avg=0x00;}
		if(avgchro>0)
		{
			lcdaddr = 0x08;
			lcddata = 0x02;
			lcd_addr();
			lcd_data();			
		}
		else
		{
			lcdaddr = 0x08;
			lcddata = 0x00;
			lcd_addr();
			lcd_data();
		}	
//		if(KEYZERO==0)
//		{
//			delay_all(10);
//			}
		digit_display((unsigned int)avgchro);*/		
		//digit_display(gaschzc);
		delay_all(5000);//delay_all(10000);
		CLRWDT();	
		LAMP=0;delay_all(10000);delay_all(5000);//delay_all(10000);//delay_all(10000);
		//delay_all(350);
		CLRWDT();	
	}
		
}

⌨️ 快捷键说明

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