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

📄 lhj.c

📁 自己单片机板c程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg52.h>
#include <intrins.h>


#define 	W24C02		0xA0
#define     R24C02		0xA1
#define  MSB       0x80
#define  LSB       0x01


/********************/
sbit SDA=P3^6;
sbit SCL=P3^7;
sbit hwx=P3^3;
sbit SPK=P3^4;
sbit JDQ=P3^5;
sbit SCL2=P1^3;
sbit SDA2=P1^4;
sbit CS2=P1^6;
sbit RST = P1^5;// DS1302片选			5脚


void ReadKey(void);   //扫描键盘 返回键值
void leday(void);	//5个空指令
void delay(void);
void display(unsigned char *lp,unsigned char lc);
void displaystr(unsigned char *lp,unsigned char lc);
unsigned char l_key=0xFF;
unsigned char l_keytmp=0;
unsigned char l_cmenu=0;
void _24c02menu(void);

void _24c02wdate(unsigned char tmp);
void I2C_write(unsigned char tmp);
unsigned char I2C_read();
void I2C_ACK(bit tmp);
void I2C_start(void);
void I2C_stop(void);
unsigned char l_address=0;
void ad0831menu(void);
unsigned char ad0831read(void);
unsigned char l_cad8031menu=0;
void ds1302menu(void);
unsigned char l_cds1302menu=0;
void ds1302play(unsigned char tmp);
void hongwai(void);
void jdq(void);

void Write_Ds1302_byte(unsigned char temp); 
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );

void Read_RTC(void);//read RTC 
void Set_RTC(void);//set RTC 

unsigned char l_tmpdisplay[8]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0};
unsigned char l_tmpdate[8]={0x00,0x06,0x03,0x18,0x0c,0x07,0x06,0};
unsigned char l_lhj[66];
unsigned char l_lhjc=0;
unsigned char l_timer=3;
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; 
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

code unsigned char LHJ[3]={0x38,0x76,0x0e};
code unsigned char _24C02[5]={0x5b,0x66,0x39,0x3f,0x5b};
code unsigned char AD0831[6]={0x77,0x5e,0x3f,0x7f,0x4f,0x06};
code unsigned char DS1302[6]={0x5e,0x6d,0x06,0x4f,0x3f,0x5b};
code unsigned char JDQSTR[3]={0x0e,0x5e,0x67};
code unsigned char ON[2]={0x3f,0x37};
code unsigned char OFF[3]={0x3f,0x71,0x71};
code unsigned char Wdate[5]={0x1c,0x5e,0x77,0x31,0x79};
code unsigned char Rdate[5]={0x77,0x5e,0x77,0x31,0x79};

code unsigned char table[]=
			{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
			//共阴数码管 0-9 - 空 表
/********************/		

     
//==================================键盘程序
code unsigned char key_tab[17]={0xed,0x7e,0x7d,0x7b,
								0xbe,0xbd,0xbb,0xde,
								0xdd,0xdb,0x77,0xb7,
								0xee,0xd7,0xeb,0xe7,0XFF};



//=============       
void main(void)  
{
	 Set_RTC();
	RST=0;
	EA=1;			//开启总中断
 	  EX0=1;  		//开启外部中断 0
	EX1=1;
	IT1=1;
 	  IT0=1;        // 设置成 下降沿触发方式
	RI=1;
	
	RCAP2L = 0xD8;
	RCAP2H = 0xFF;
	TL2=0XD8;
	TH2=0XFF;
	T2CON=0X34;	
	SCON=0X50;
	ES=1;
	P0=0xf0;
	  while(1)
	  {	  
		displaystr(LHJ,3);			//主菜单显示LHJ,等待按键
		if (l_key==0x0E){
			P2=0;
			l_key=0xff;
			l_cmenu=0;
			while (1){	
				if(l_key==0x0c){
					l_key=0xff;
					break;
				}			
				switch(l_cmenu){
					case 0:displaystr(_24C02,5);break;
					case 1:displaystr(AD0831,6);break;
					case 2:displaystr(DS1302,6);break;
					case 3:displaystr(JDQSTR,3);break;
				}
				
				switch(l_key){
				case 0x0a:				//按A或B键,显示不同采单内容
					l_key=0xff;
					if(l_cmenu>0)
						l_cmenu--;
				break;
				case 0x0b:
					l_key=0xff;
					if (l_cmenu<3)
						l_cmenu++;
				break;				
				case 0x0e:
					l_key=0xff;					
					switch(l_cmenu){
					case 0: l_address=0;_24c02menu();break;		//相应的内容调用相应函数
					case 1: ad0831menu();break;					
					case 2: ds1302menu();break;
					case 3: jdq();break;
					}
				break;
				}	
			
			}
		}
	   }
} 
void ReadKey(void)						//读键盘值
{
	unsigned char i,j,key;
	j=0xfe;
	key=0xff;
	for (i=0;i<4;i++){
		P0=j;
		//leday();
		if ((P0&0xf0)!=0xf0){
			key=P0;
			break;
		}
		j=_crol_(j,1);
	}
	if (key==0xff){
		l_keytmp=0xff;
		//l_key=0xff;
		P0=0xf0;
		EX0=1;
		SPK=1;
		return;
	}
	SPK=0;	
	if(l_keytmp==key){
		TH0=0X2E;			
		TL0=0;
		TR0=1;		
	   	return;
	}
	TH0=0X2E;			
	TL0=0;
	TR0=1;					
	l_keytmp=key;
	for(i=0;i<17;i++){
		if (key==key_tab[i]){
			l_key=i;
			break;
		}
	}
			
}  
void key_scan()   interrupt 0    //外部中断 0  的优先级最高 							
{	
	EX0=0;

	TMOD&=0XF1;
	TH0=0X00;
	TL0=0X00;
	ET0=1;	
	TR0=1;
	
	
} 
void hongwai(void)   interrupt 2     //外部中断 1  做为红外线接收
{
	unsigned char i,j,tmp;
	unsigned int tmp2;
	//EX1=0;
	hwx=1;
	j=33;
	i=0;
	tmp2=0;
	while(!hwx){
	tmp2++;
	if(tmp2==1000)			
		break;
	}
	if(tmp2<1000){
		EX1=1;
		return;
	}
	P2=0x76;	
	while(j){
		tmp=0;
		l_lhj[i]=1;
		while(!hwx){
			l_lhj[i]++;
			delay();
			tmp++;
			if(tmp==250)
				break;
		}
		i++;
		tmp=0;
		l_lhj[i]=1;
		while(hwx){
			l_lhj[i]++;
			delay();
			tmp++;
			if(tmp==250)
				break;
		}
		i++;		
		j--;
	}
	l_lhj[0]+=170;	//补回在刚开始接收时作判断失去的时间,是为了可以在电脑上显示接近正确波形
	i=255;
	while(i){
	tmp=255;
	while(tmp){
	tmp--;
	}
	i--;
	}
	//IE1=0;	
	//EX1=1;	
}
void timer0_isr(void) interrupt 1
{
	TR0=0;	
	ReadKey();
	
}
void timer0_isr1(void) interrupt 3	//定时器2,我们用来输出二极管发光,不同的数据输出各种花样
{									//本程序针对24C02读出的数据进行64个数据循规蹈矩环输出
	//TL1=0x01;
	//TH1=0x01;
	//TR1=1;
	TF1=0;
	if(l_tmpdate[2]>4){
		l_tmpdate[2]=0;
	if(l_tmpdate[0]==0){
		P2=~l_lhj[l_tmpdate[1]];
		l_tmpdate[1]++;
		if(l_tmpdate[1]==64)
			l_tmpdate[1]=0;
	}	
	
		l_tmpdate[0]++;
	if(l_tmpdate[0]>=l_timer)
		l_tmpdate[0]=0;
	}
	l_tmpdate[2]++;
	//ET1=0;
	//display(l_lhj,8);
}
void com_isr(void) interrupt 4      //串口中断,与电脑连接,处理相应指令
{
	unsigned char i,j,tmp;
	if(RI!=1)
	return;
	RI=0;
	tmp=SBUF;
	if(tmp==0X01){//LED8
		Read_RTC();
		SBUF=0X01;
		while(!TI){}
		TI=0;   //	
		for(i=0;i<7;i++){
			SBUF=l_tmpdate[i];
			while(!TI){}
			TI=0;
		}
	return;
	}
	if((tmp&0xf0)==0x10){//读端口
		switch(tmp&0x0f){
		case 0:i=P0;break; 	//P0
		case 1:i=P1;break;	//P1
		case 2:i=P2;break;	//P2
		case 3:i=P3;break;	//P3
		}
		SBUF=0X10;
		while(!TI){}
		TI=0;   //	
		SBUF=i;
		while(!TI){}
		TI=0;
		return;
	}
	if((tmp&0xf0)==0x20){//写端口
		ES=0;
		SBUF=0X20;
		while(!TI){}
		TI=0;   //	
		while(!RI){}
		RI=0;
		i=SBUF;	
		switch(tmp&0x07){
		case 0:P0=i;break;		//P0
		case 1:P1=i;break; 	//P1
		case 2:P2=i;break;		//P2
		case 3:P3=i;break;		//P3
		}
		SBUF=0Xff;
		while(!TI){}
		TI=0;   //	
		ES=1;
		return;
	}
	if((tmp&0xf0)==0x30){//读24CX
		switch(tmp&0x0f){
		case 0:break;//24c01
		case 1:		//24c02
			SBUF=0X30;
			while(!TI){}
			TI=0;   //	
			I2C_start();
			I2C_write(W24C02);
			I2C_ACK(0);
			I2C_write(0);
			I2C_ACK(1);
			I2C_stop();

			I2C_start();
			I2C_write(R24C02);					
			for(i=0;i<32;i++){
			for(tmp=0;tmp<8;tmp++){
				I2C_ACK(0);
				SBUF=I2C_read();
				while(!TI){}
				TI=0;
				}
			}		
			I2C_ACK(1);
			I2C_stop();			
			break;
		}
	return;
	}
	if((tmp&0xf0)==0x40){//写24CX
		ES=0;
		switch(tmp&0x0f){
		case 0:break;
		case 1:			
		for(i=0;i<32;i++){
			SBUF=0X40;
			while(!TI){}
			TI=0;			
			for(j=0;j<8;j++){
				while(!RI){}			
				RI=0;	
				l_tmpdate[j]=SBUF;

			}
			I2C_start();
			I2C_write(W24C02);
			I2C_ACK(0);
			I2C_write(i*8);	
			for(j=0;j<8;j++){			
				I2C_ACK(0);
				I2C_write(l_tmpdate[j]);						
			}
			I2C_ACK(1);
			I2C_stop();
			leday();
			leday();
			leday();
			leday();
			leday();
		}
		SBUF=0X41;
			while(!TI){}
			TI=0;
		break;
		}
		ES=1;
	return;
	}
	if((tmp&0xf0)==0x50){//读AD0831
		SBUF=0X50;
		while(!TI){}
		TI=0;   //	
		SBUF=ad0831read();
		while(!TI){}
		TI=0;
		return;
	}
	if((tmp&0xf0)==0x60){//红外线		
		SBUF=0x60;
		while(!TI){}
		TI=0;
		if(l_lhj[0]==0){
		SBUF=0X01;
		while(!TI){}
		TI=0;
		return;
		}
		for (i=0;i<66;i++){
			SBUF=l_lhj[i];
			while(!TI){}
			TI=0;
		}
		l_lhj[0]=0;
		return;
	}
		
}
void leday(void)								//空5个指令
{
	_nop_();_nop_();_nop_();_nop_();_nop_();
}
void delay(void)								
{
	unsigned char i=13;
	while(i)
		i--;
}
void display(unsigned char *lp,unsigned char lc)//显示
{
	unsigned char i;
	P2=0;
	P1=P1&0xF8;
	for(i=0;i<lc;i++){
	P2=table[lp[i]];
	delay();
	P2=0;
	if(i==7)
		break;
	P1++;
	}
}
void displaystr(unsigned char *lp,unsigned char lc)//显示
{
	unsigned char i;
	P2=0;
	P1=P1&0xF8;
	for(i=0;i<lc;i++){
	P2=lp[i];
	delay();
	P2=0;
	if(i==7)
		break;
	P1++;
	}
}


void _24c02menu(void)		//进入24C02菜单的操作,256字节分四段读取每段64字节(因89S52的RAM有限,
							//所以我们只能用到64个RAM空间),按A键或B键来选择哪一段
{							//读取某一段的数据后,我们启动定时器2做相应处理
	unsigned char i,j,tmp=0;
	P2=0;
	l_key=0xfe;
	while (1){		
		if(l_key==0x0c){
			l_key=0xff;
			TR1=0;
			ET1=0;
			break;
		}
		switch(l_key){
		case 0x0a:
			l_key=0xff;
			if(tmp>0){
				tmp--;
				l_key=0xfe;
			}
		break;
		case 0x0b:
			l_key=0xff;
			if(tmp<3){
				tmp++;
				l_key=0xfe;

⌨️ 快捷键说明

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