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

📄 red.c

📁 C8051F040单片机开发与C语言编程-例子
💻 C
字号:
///////////红外编码解码调试程序/////////////
///////////red.c///////////////////////////
#include "mylcd.h"
#include "stdio.h"
union intchar{
	uint tempval;
	struct {uchar hi;uchar low;}bytek;
}tcf;
uint k=0;
uint j;
idata uint codelen;
sbit sigin=P0^7;//p0.7
sbit sigout=P0^5;//p0.5
bit isodd;
sbit keydown=P5^7;
bit sig;
bit iserror;
bit detectend;
xdata uint sigdata[400];
xdata uchar flashrd[20];
idata uint head0;
void resett0(void);
uint  readt0(void);
void error();
extern bit isline0;
void dispini(){	//lcd显示初始化
	delay1ms(100);
	SFRPAGE=0xf;
	lcdcs=0;         
	lcdrs=1;
	lcdrw=1;
	delay1ms(30);
	sendc(0x38);//8位,2行,5*7字体
	delay1ms(100);
	sendc(0x0c);//显示开,光标关;不闪
	delay1ms(100);
	sendc(0x06);//增量方式,现不移动
	delay1ms(100);
	sendc(0x01);//清屏
	delay1ms(100);
}
uchar scankey(){//扫描键值函数
	uchar  c;
	SFRPAGE=0X0F;
	c=P5;
	c=c&0xf8;//电路中有按键按下是低电平
	if(c==0x0f8)
		return(0);
	delay1ms(20);
	switch(c){
	case 0xd8:
		return 4;
	case 0xe8:
		return 2;
	case 0xf0:
		return 3;
	case 0xb8:
		return 1;
	case 0x78:
		return 5;
	default: return 0;//此行事实上包含了对串键的处理
	}
}
void config(){
//看门狗禁止
	WDTCN = 0x07;	
    WDTCN = 0xDE;   
   	WDTCN = 0xAD;
	SFRPAGE = 0x0F;
//交叉开关配置,CEX0-CEX05配置在P0.0-P0.5
	XBR0 = 0x10;	
	XBR1 = 0x00;	
	XBR2 = 0x40;
 	XBR3 = 0x00;   
//管脚输出配置,P0口为开漏输出,其中P0.0接上拉电阻,驱动超声波控制信号
 	SFRPAGE = 0x0F;
    P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口为开漏输出
    P1MDOUT = 0x00; 
    P2MDOUT = 0x00; 
    P3MDOUT = 0x00; 
    P4MDOUT = 0x00; //P4口为开漏
    P5MDOUT = 0x07; 
    P6MDOUT = 0x00; 
    P7MDOUT = 0x00; 
    P1MDIN = 0xFF;  //所有端口为数字输入,没有模拟输入端口
    P2MDIN = 0xFF;  
    P3MDIN = 0xFF; 
//晶振配置,采用内部晶振8分频
	SFRPAGE = 0x0F;
 	CLKSEL = 0x00;  
	OSCXCN = 0x00;	
	OSCICN = 0x84;	
}
void decode(){//接收红外线代码
testagain:
	j=0;
	sigin=1;
	codelen=0;
	iserror=0;
	EA=0;
	k=0;
	SFRPAGE=0x00;
	while(1){
		sig=sigin;
		if(!sig)
			break;
	}
	resett0();
	TF0=0;
	detectend=0;
	sig=sigin;
	while(!sig){
		if(TF0){
			TF0=0;
			error();
			break;
		}
		sig=sigin;	
	}
	if(iserror){
		head0=readt0();
		head0=0xffff;
		iserror=0;
		}
	else{
		head0=readt0();
		}
	tcf.tempval=head0;
	sigdata[j]=tcf.tempval;
	j++;
	while(1){
		sig=sigin;
		while(sig){
			if(TF0){
				TF0=0;
				if(j<15){//若接收的代码长度小于15/2=7个,则认为接收到的为干扰信号
				//重新开始检测
					iserror=1;
					goto testagain;
					}
				else{         
					error();
					}
			
			}
			sig=sigin;
		}
		if(iserror){
			tcf.tempval=readt0();
			tcf.tempval=0xffff;
			iserror=0;
			}
		else{
			tcf.tempval=readt0();
		}
		sigdata[j]=tcf.tempval;
		j++;
		sig=sigin;
		while(!sig){
			if(TF0){
				TF0=0;
				error();
				break;
				}
			sig=sigin;	
		}
		tcf.tempval=readt0();
		if(iserror){
			tcf.tempval=0xffff;
			iserror=0;
			}
		sigdata[j]=tcf.tempval;
		j++;
		if(j>399)
			goto testend;
	}
	testend:;
}
void pca0ini(){//38KHZ频率输出
	SFRPAGE = 0x00;
	PCA0MD = 0x08;       
    PCA0CN = 0x40;      
	PCA0CPM0=0X46;
	PCA0CPH0=38;
	PCA0CPM1=0X46;
	PCA0CPH1=38;
}
void encode(void){//发送红外代码
	SFRPAGE=0x0f;
	SFRPAGE=0x00;
	pca0ini();
	TR0=0;
	sigout=0;
	isodd=0;
	for(k=0;k<400;k++){
		TR0=0;
		tcf.tempval=0xffff-sigdata[k];
		TH0=tcf.bytek.hi;
		TL0=tcf.bytek.low;
		TF0=0;
		TR0=1;
		if(isodd){
			sigout=0;
			isodd=0;
			while(!TF0);
			
			}
		else{
			isodd=1;
			sigout=1;
			while(!TF0);
		}
	}
	sigout=0;
	SFRPAGE=0x0f;
}
void error(){
	iserror=1;
}
void resett0(void){
	SFRPAGE=0x00;
	TH0=0;
	TL0=0;
	TR0=1;
}
uint  readt0(void){
	uint tmp;
	SFRPAGE=0x00;
	TR0=0;
	tmp=(uint)TH0*256;
	tmp+=TL0;
	resett0();
	return tmp;
}
void t0ini(){
	SFRPAGE=0x00;
	CKCON=0x00;
	TMOD=0x11;
	TCON=0x01;
}
void main(){
	uint tk=0;
	config();
	dispini();
	sigout=0;
	t0ini();
	EA=0;
	while(1){
		isline0=1;
		printf("\nKEY1 TO DECODE");
		printf("\nKEY3 TO SEND");
		while(scankey()==0);
		if(scankey()==1){
			key1start:
			printf("\nready to decode?");
			if(scankey()==5){
				printf("\nexit now...");
				while(scankey()==5);
				goto key1end;
			}
			if(scankey()==2){
				printf("\nnow decode...");
				decode();
				printf("\n\ncompelete");
				goto key1end;
			}
			goto key1start;
			key1end:;
		}
		if(scankey()==3){
			key2start:
			printf("\nready to send?");
			if(scankey()==5){
				printf("\nexit now...");
				while(scankey()==5);
				goto key2end;
			}
			if(scankey()==2){
				printf("\nnow send...");
				encode();
				EA=EA;//多一条指令,以便编译器能顺利编译发送两次代码
				encode();
				printf("\n\ncompelete");
				goto key2end;
			}
			goto key2start;
			key2end:;
		}	
	}
}

⌨️ 快捷键说明

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