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

📄 shewang.c

📁 遥控器测码 程序
💻 C
字号:
//晶振采用12MHz  用 自己做的双面板平台  采用扫描法
//此程序经测试OK,可以放心使用,数码管与lcd1602上显示。
//日期:2009-01-05   21:10
//设计人:佘望胜
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*uchar code Dis_Data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,   
		                0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //数码管的位说明 【ME500】*/
//0xfe=P20  0xfd=P21   0xfb=P22  0xf7=P23  0xef=P24  0xdf=P25  0xbf=P26  0x7f=P27  数码管
//的位说明 【ME500】
uchar data irtab[4]={0x00,0x62,0x21,0x00};   //定义4个数组,用来存储IR码值
uchar code lcd_data_list[]={"0123456789ABCDEF"};   //定义字符表
uchar user[]="User Code:";    //定义字符串
uchar date[]="Data Code:";    //定义字符串
//uchar count_time;             //定义数码管计时用变量
//extern void _nop_(void);
sbit remote=P2^0;
sbit beep=P2^1;
sbit lcd_rs=P3^7;
sbit lcd_rw=P3^6;
sbit lcd_en=P3^5;
void disp();
//====================================================================
/*delay1ms(uint h) //12mhz   刚好999us       
{
uint i,j;
for(i=0;i<h;i++)
	for(j=0;j<121;j++);
}*/
//====================================================================	
delay100us() //12mhz   经过测试刚好100us       
{
uchar i,j;
for(i=5;i>0;i--)
	for(j=8;j>0;j--);
}
//====================================================================	
void delay_beep(uchar k)      
{
uchar i,j;					 // 12MHz   //j=41,经过测试刚好是101us
for(i=k;i>0;i--)
	for(j=10;j>0;j--);
}
//=====================================================================
void delay_lcd(uchar k)      
{
uchar i,j;					 // 12MHz   //j=41,经过测试刚好是101us
for(i=k;i>0;i--)
	for(j=41;j>0;j--);
}
//====================================================================
void Sound()
{
uint k;
	for (k=120;k>0;k--)	    //此k的数值越大,声音就会越响
	{
	beep=~beep;
	delay_beep(6);     //此延时里面的数越大,声音就会持续越长
	}
} 
//===========读32个码值 初始化=========================================                      
read_remote()
{
uchar s,q,k,count;
	if(remote==0)
	{
		for(k=85;k>0;k--)		 //100us重复85次,测得时间8.926ms
			{
			delay100us();       
			if(remote==1){return;}     //再来判断ir是否为低电平,如果是低电平就执行下面的语句    	  
			}
		while(!remote);             //等待4.5ms的高电平
		for(k=23;k>0;k--)       //100us重复23次,测得时间2.416ms
			{
			delay100us();
			if(remote==0){return;}          
			}	
		for(k=15;k>0;k--)     //100us重复16次,测得时间1.681ms
			{				  //100us重复15次,测得时间1.561ms
			delay100us();         
			if(remote==0){return;}   //再判断ir是不是等于0,是就跳出。如果不是就进入while(ir)处进行等待用户码的到了
			}
		while(remote); //等待0
	//===================================开始读32个码======================	
		for(s=0;s<4;s++)      //循环4次读完客户码,客户反吗;数据码,数据反码。
		{
			for(q=0;q<8;q++)  //8位为一个字节
			{
			while(!remote);       //等待4.5ms的高电平
			for(k=9;k>0;k--)	 //100us重复9次,测得时间928us
				{				 //100us重复8次,测得时间825us
				delay100us();  
				}	
			if(remote==1)         //判断ir是不是为高电平
				{
				for(k=10;k>0;k--)	  //100us重复10次,测得时间1.031ms
				{					  //100us重复11次,测得时间1.134ms
				delay100us();   
				}
				count=count>>1;
				count=count|0x80;
				}
			else count=count>>1;
			}
			irtab[s]=count;
			count=0;	
		}        //========================读完了32个码=================================
	if(irtab[0] != ~irtab[1] && irtab[2] != ~irtab[3]){return;}   //核对有没有读到用户误码与数据误码
	disp();     //解码成功后刷新LCD屏
	Sound();    //解码成功后蜂鸣器会响一下
	}
}              //=========================读码完全结束======================         
//===============================================数码管初始化================================================
/*void initial()      //初始化
{
EA=1;
ET1=1;
TMOD=0x10;        //t1方式1
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
TR1=1;
}
//===================================================数码管中断================================================
void time() interrupt 3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
count_time++;    //用来数码管计时用的
			switch(count_time)
		{
		case 1: P0=Dis_Data[irtab[3]%16];       //显示数据反码
				P2=wei[7];                      //数码管的个位
				break;
		case 2: P0=Dis_Data[irtab[3]/16];       //显示数据反码
				P2=wei[6];                      //数码管的十位
				break;
		case 3: P0=Dis_Data[irtab[2]%16];       //显示数据码
				P2=wei[5];                      //数码管的百位
				break;
		case 4: P0=Dis_Data[irtab[2]/16];       //显示数据码
				P2=wei[4];                      //数码管的千位
				break;
		case 5: P0=Dis_Data[irtab[1]%16];       //显示用户反码
				P2=wei[3];                      //数码管的万位
				break;
		case 6: P0=Dis_Data[irtab[1]/16];       //显示用户反码
				P2=wei[2];                      //数码管的十万位
				break;
		case 7: P0=Dis_Data[irtab[0]%16];       //显示用户码
				P2=wei[1];                      //数码管的百万位
				break;
		case 8: P0=Dis_Data[irtab[0]/16];       //显示用户码
				P2=wei[0];                      //数码管的千万位
				count_time=0;                   //计数器清0
				break;
			
		}
}*/
//=========================================LCD============================================
//=========================================LCD============================================
write_command(uchar command)
{
lcd_rs=0;     //指向命令寄存器
delay_lcd(5);
lcd_rw=0;
delay_lcd(5);
lcd_en=1;
delay_lcd(5);
P0=command;
delay_lcd(5);
lcd_en=0;
delay_lcd(5);
lcd_rw=0;
}
//========================================================================================
write_date(uchar date)
{
lcd_rs=1;     //指向数据寄存器
delay_lcd(5);
lcd_rw=0;
delay_lcd(5);
lcd_en=1;
delay_lcd(5);
P0=date;
delay_lcd(5);
lcd_en=0;
delay_lcd(5);
lcd_rw=0;
}
//========================================================================================
initial()
{
beep=0;
write_command(0x38);     //设置显示模式
delay_lcd(8);
write_command(0x01);     //清屏设置
delay_lcd(8);
write_command(0x0c);     //光标显示设置【0x0f光标闪烁,0x0c没有光标】
delay_lcd(8);           //延时,等待LCD初始化充分完成。
//write_command(0x07);   //移屏设置

}
//========================================================================================
void disp()
{
uchar i;
//===================================用户码=============================================
			write_command(0x80);                 //显示屏的第一行,显示用户名
			delay_lcd(5);
				for(i=0;i<10;i++)
				{
				write_date(user[i]);
				delay_lcd(5);
				}
			write_command(0x80+10);              //显示屏的第一行,显示用户码十位
			write_date(lcd_data_list[irtab[0]/16]);
			delay_lcd(5);
			write_command(0x80+11);              //显示屏的第一行,显示用户码个位
			write_date(lcd_data_list[irtab[0]%16]);
			delay_lcd(5);
//===================================用户反码===========================================
			write_command(0x80+13);            //显示屏的第一行+8位置,显示用户反码
			write_date(lcd_data_list[irtab[1]/16]);
			delay_lcd(5);
			write_command(0x80+14);            //显示屏的第一行+9位置,显示用户反码
			write_date(lcd_data_list[irtab[1]%16]);
//====================================数据码=============================================
			write_command(0xc0);                 //显示屏的第二行,显示用户名
			delay_lcd(5);
				for(i=0;i<10;i++)
				{
				write_date(date[i]);
				delay_lcd(5);
				}
			write_command(0xc0+10);              //显示屏的第二行,显示数据码
			write_date(lcd_data_list[irtab[2]/16]);
			delay_lcd(5);
			write_command(0xc0+11);              //显示屏的第二行,显示数据码
			write_date(lcd_data_list[irtab[2]%16]);
//===================================数据反码====================================	
			write_command(0xc0+13);              //显示屏的第二行,显示数据码
			write_date(lcd_data_list[irtab[3]/16]);
			delay_lcd(5);
			write_command(0xc0+14);              //显示屏的第二行,显示数据码
			write_date(lcd_data_list[irtab[3]%16]);
			
			/*for(k=0;k<12;k++)     //移屏
			{
			write_command(0x18);    //从右向左移屏指令
			delay_lcd(50);
			}*/			
}
//=================================================================================



//========================================================================================
void main()
{
initial();
disp();
while(1)
	{
	read_remote();
	}
}   //主函数结束






⌨️ 快捷键说明

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