您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于红外的自动升旗系统
1、红外程序#includereg51.hsbitIRIN=P3^2;//红外接收器数据线sbitBEEP=P1^5;voidIRdelay(charx);//x*0.14MSunsignedcharIRCOM[7];externunsignedcharY0;externvoiddisplay(unsignedcharKey_Val);/*************中断初始化*****************/voidIRInit()//中断初始化{IE|=0x81;//允许总中断中断,使能INT0外部中断TCON|=0x01;//触发方式为脉冲负边沿触发IRIN=1;//I/O口初始化}/************驱动蜂鸣器*****************/voidbeep()//驱动蜂鸣器{unsignedchari;for(i=0;i100;i++){IRdelay(6);BEEP=!BEEP;//BEEP取反}BEEP=1;//关闭蜂鸣器}/**********外中断处理红外信号**************/voidIR_IN(void)interrupt0{unsignedcharj,k,N=0;EX0=0;IRdelay(5);if(IRIN==1){EX0=1;return;}//确认IR信号出现while(!IRIN)//等IR变为高电平,跳过9ms的前导低电平信号。{IRdelay(1);}for(j=0;j4;j++)//收集四组数据{for(k=0;k8;k++)//每组数据有8位{while(IRIN)//等IR变为低电平,跳过4.5ms的前导高电平信号。{IRdelay(1);}while(!IRIN)//等IR变为高电平{IRdelay(1);}while(IRIN)//计算IR高电平时长{IRdelay(1);N++;if(N=30){EX0=1;return;}//0.14ms计数过长自动离开。}//高电平计数完毕IRCOM[j]=IRCOM[j]1;//数据最高位补“0”if(N=8){IRCOM[j]=IRCOM[j]|0x80;//数据最高位补“1”}N=0;}}if(IRCOM[2]!=~IRCOM[3]){//校验数据EX0=1;return;}beep();EX0=1;}/*********简单延时*****************/voidIRdelay(unsignedcharx)//x*0.14MS{unsignedchari;while(x--){for(i=0;i13;i++){}}}2、12864驱动代码/********************************************************************************描述:**12864标准字库液晶演示数据P0,控制管脚参见头文件*********************************************************************************/#includereg52.h#includeintrins.h#include12864.h//#includekey.hucharcodeDIS1[]={红外遥控旗帜系统};//汉字所占的位置应该是奇数列开头,否则显示的是乱码ucharcodeDIS2[]={当前模式:};ucharcodeDIS3[]={当前状态:};ucharcodeDIS4[]={红外键值:};ucharcodeDIS5[]={自动};ucharcodeDIS6[]={手动};ucharcodeDIS7[]={向上};ucharcodeDIS8[]={向下};/*******************************************************************//*函数功能:延时函数*//*入口参数ms(延时值)*//*******************************************************************/voiddelay(uintms){while(ms--){uchari;for(i=0;i150;i++){_nop_();_nop_();_nop_();_nop_();}}}/*******************************************************************///*函数功能:检查LCD忙状态*///*注意:lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。*/*//*******************************************************************/bitlcd_busy(){bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;NOP();result=(bit)(P2&0x80);LCD_EN=0;return(result);}/*******************************************************************//*函数功能:写指令数据到LCD*//*入口参数cmd*//*RS=L,RW=L,E=高脉冲,D0-D7=指令码*//*******************************************************************/voidlcd_wcmd(ucharcmd){while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P2=cmd;NOP();LCD_EN=1;NOP();LCD_EN=0;}/*******************************************************************//*函数功能:写显示数据到LCD*//*入口参数:dat*//*RS=H,RW=L,E=高脉冲,D0-D7=数据*//*******************************************************************/voidlcd_wdat(uchardat){while(lcd_busy());LCD_RS=1;LCD_RW=0;LCD_EN=0;P2=dat;NOP();LCD_EN=1;NOP();LCD_EN=0;}/*******************************************************************//*函数功能:LCD初始化设定*//*入口参数:无返回值:无*//*******************************************************************/voidlcd_init(){LCD_PSB=1;//并口方式LCD_RST=0;//液晶复位delay(3);LCD_RST=1;delay(3);lcd_wcmd(0x34);//扩充指令操作delay(5);lcd_wcmd(0x30);//基本指令操作delay(5);lcd_wcmd(0x0C);//显示开,关光标delay(5);lcd_wcmd(0x01);//清除LCD的显示内容delay(5);}/*********************************************************//*函数功能:设定显示位置*//*入口参数:x(行)Y(列)*//*********************************************************/voidlcd_pos(ucharX,ucharY){ucharpos;if(X==1){X=0x80;}elseif(X==2){X=0x90;}elseif(X==3){X=0x88;}elseif(X==4){X=0x98;}pos=X+Y;lcd_wcmd(pos);//显示地址}/**********************************************************清屏函数**入口参数:无返回值:无**********************************************************///voidclr_screen()//{//lcd_wcmd(0x34);//扩充指令操作//delay(5);//lcd_wcmd(0x30);//基本指令操作//delay(5);//lcd_wcmd(0x01);//清屏//delay(5);//}/**********************************************************静态显示(用于显示无需实时刷新的界面)**入口参数:无返回值:无**********************************************************/voidjingtaixianshi(){uchari;lcd_pos(1,0);//设置显示位置为第1行for(i=0;i16;i++)//显示4个中文字则设置为8{lcd_wdat(DIS1[i]);delay(3);}lcd_pos(2,0);//设置显示位置为第2行for(i=0;i10;i++){lcd_wdat(DIS2[i]);delay(3);}lcd_pos(3,0);//设置显示位置为第3行for(i=0;i10;i++){lcd_wdat(DIS3[i]);delay(3);}lcd_pos(4,0);//设置显示位置为第3行for(i=0;i10;i++){lcd_wdat(DIS4[i]);delay(3);}}/**********************************************************函数功能:实时刷新运行状态显示**入口参数:无返回值:无**********************************************************/voidlcd_frash_state_display(){uchari;//自动正转lcd_pos(2,5);//设置显示位置为第2行for(i=0;i4;i++){lcd_wdat(DIS5[i]);delay(3);}lcd_pos(3,5);//设置显示位置为第3行for(i=0;i4;i++){lcd_wdat(DIS7[i]);delay(3);}flag_display=0;//状态刷新完毕,将标志为置0;}/**********************************************************函数功能:实时刷新输入值显示**入口参数:无返回值:无**********************************************************/voidlcd_frash_state_display1()//自动反转{uchari;lcd_pos(2,5);//设置显示位置为第2行for(i=0;i4;i++){lcd_wdat(DIS5[i]);delay(3);}lcd_pos(3,5);//设置显示位置为第3行for(i=0;i4;i++){lcd_wdat(DIS8[i]);delay(3);}flag_display=0;}voidlcd_frash_state_display2()//手动正转{uchari;lcd_pos(2,5);//设置显示位置为第2行for(i=0;i4;i++){lcd_wdat(DIS6[i]);delay(3);}lc
本文标题:基于红外的自动升旗系统
链接地址:https://www.777doc.com/doc-2576257 .html