tag 标签: lcd1602

相关帖子
相关博文
  • 热度 3
    2022-5-25 16:19
    713 次阅读|
    1 个评论
    使用LabVIEW来玩耍Arduino-Day6-液晶时钟
    实验4.5 RGB调色、实验4.6 简易示波器、实验4.7 数据采集卡、实验4.8 单个舵机的控制、实验4.9 多个舵机的控制都是LIAT中的示例,可以直接在安装好的LabVIEW路径下找到这些实验的VI文件,具体的路径是“LabVIEW路径 \ vi.lib\LabVIEW Interface for Arduino\Palette Examples”,我的路径是“D:\Program Files (x86)\National Instruments\LabVIEW 2021\vi.lib\LabVIEW Interface for Arduino\Palette Examples”。 所以今天就完成实验4.10 液晶时钟,LINX这个工具包没有提供LCD1602的VI,所以这次就用LIAT来完成这个实验。在LabVIEW中编程之前别忘了按照Day4中的介绍,用低版本的Arduino IDE烧录LIFA_Base这个工程编译后的hex。 (1)实验目的 利用LIAT中的LCD显示函数库,通过LabVIEW软件获取电脑上的时钟并传输给Arduino Uno控制板,将时间数据显示在LCD1602液晶显示屏上,实现一个液晶时钟。 (2)硬件连接 将1602液晶显示屏的电源线VDD和VSS分别接至Arduino Uno控制板上的5V和GND引脚上;背光电源线A通过限流电阻接至+5V,K直接接至地端;对比度调节V0通过电位器实现分压;读写控制信号RW直接接至地端;RS、Enable信号线接至Arduino Uno控制板数字引脚D12和D11上;液晶数据接口D4、D5、D6和D7分别接至Arduino Uno控制板数字引脚D5、D4、D3、D2,如图4-33所示。 我的接线超乱,这里就不放了,按照这个文字说明是可以连接成功的。 (3)程序设计 LabVIEW前面板: 程序框图: LabVIEW程序首先通过选择好的串口号与Arduino Uno控制板建立连接,然后调用液晶函数库中的LCD Configure 4-bit和LCD Init以配置液晶的管脚连接并将液晶初始化为16×2,接着进入While循环中通过“获取日期/时间字符串”节点获得当前的时间日期并调用LCD Set Cursor Position和LCD Print实现在第一行显示日期和在第二行显示时间,再通过调用LCD Display Power实现液晶的闪烁。最后,断开与Arduino Uno控制板的连接。 (4)实验与演示 点击运行按钮,LabVIEW程序开始执行,可以看到1602液晶屏幕上第一行显示当前的日期,第二行显示当前的时间,包括时分秒。同时,液晶以1秒为周期进行周期性闪烁。 最后有关于LCD1602的一些知识可以参考( LCD1602液晶使用介绍--(完整版)_gussu-毛虫的博客-CSDN博客_lcd1602 )。
  • 热度 13
    2014-11-13 20:47
    609 次阅读|
    0 个评论
    LCD1602.h /***********************************************************  文件名称: LCD1602.h 作 者: 终神晓 时间: 2014/11/12/22:48 版 本: V1.0 说 明: LCD1602的头文件 修改记录: 无 ***********************************************************/ #ifndef __LCD1602_H__ #define __LCD1602_H__   #include   sbit RS = P1^3; /* RS=1,命令;RS=0,数据 */ sbit RW = P1^4; /* RW=1,读;RW=0,写 */ sbit EN = P1^5;     sbit wx = P2^6; /* 数码管与LCD1602管脚冲突 */ sbit dx = P2^7;    #define DataPort P0   #define RS_CLR RS = 0 #define RS_SET RS = 1   #define RW_CLR RW = 0 #define RW_SET RW = 1   #define EN_CLR EN = 0 #define EN_SET EN = 1   void DelayUs2x(unsigned char t); void DelayMs(unsigned char t); void SMG_Clear_Display(void); bit LCD1602_Check_Busy(void); void LCD1602_Write_Command(unsigned char command); void LCD1602_Write_Data(unsigned char Data); void LCD1602_Write_Char(unsigned char x,unsigned char y,unsigned char Data); void LCD1602_Write_String(unsigned char x,unsigned char y,unsigned char *s); void LCD1602_Clear_Screen(void); void LCD1602_Init(void);   #endif   LCD1602.c   /***********************************************************  文件名称: LCD1602.c 作 者: 终神晓 时间: 2014/11/12/22:48 版 本: V1.0 说 明: LCD1602的驱动函数 基本操作时序:   读状态  输入:RS=L,RW=H,E=H                               输出:DB0~DB7=状态字 写指令 输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码  输出:无 读数据  输入:RS=H,RW=H,E=H                              输出:DB0~DB7=数据 写数据  输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据   输出:无 修改记录: 无 ***********************************************************/ #include"LCD1602.h"  #include"intrins.h"   /******************us延时函数*******************/ void DelayUs2x(unsigned char t) { while(--t); /* T = t x 2 + 5 uS*/ }   /******************ms延时函数*******************/ void DelayMs(unsigned char t) { while(t--)  /*1ms*/ { DelayUs2x(245); DelayUs2x(245); } } /********清除数码管的显示*********************/ void SMG_Clear_Display(void) { P0 = 0x00; wx = 1; wx = 0;   P0 = 0x00; dx = 1; dx = 0; }   /****************判忙函数**********************/       bit LCD1602_Check_Busy(void) { DataPort = 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_();   EN_SET; return (bit) (DataPort 0x80); }   /************写命令函数***********************/   void LCD1602_Write_Command(unsigned char command) { while(LCD1602_Check_Busy()); /*忙则等待*/ RS_CLR; RW_CLR;     EN_SET;   DataPort = command; _nop_(); EN_CLR; }   /***************写数据函数********************/   void LCD1602_Write_Data(unsigned char Data) { while(LCD1602_Check_Busy()); /*忙则等待*/ RS_SET; RW_CLR;     EN_SET;   DataPort = Data; _nop_(); EN_CLR; }   /***************写字符函数*******************/ void LCD1602_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if(y == 0) { LCD1602_Write_Command(0x80 + x); /*LCD1602第一行*/ } else { LCD1602_Write_Command(0xC0 + x);   /*LCD1602第二行*/ } LCD1602_Write_Data(Data); }   /***************写字符串函数*******************/ void LCD1602_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if(y == 0) { LCD1602_Write_Command(0x80 + x); /*LCD1602第一行*/ } else { LCD1602_Write_Command(0xC0 + x); /*LCD1602第二行*/ } while(*s) { LCD1602_Write_Data( *s ); s++; } }   /***************清屏函数*******************/ void LCD1602_Clear_Screen(void) { LCD1602_Write_Command(0x01); DelayMs(5); }   /***************LCD1602初始化函数*******************/ void LCD1602_Init(void) { SMG_Clear_Display(); /*清除数码管上的乱码*/ LCD1602_Write_Command(0x38); /*显示模式设置*/ DelayMs(5); LCD1602_Write_Command(0x38); DelayMs(5); LCD1602_Write_Command(0x38); DelayMs(5); LCD1602_Write_Command(0x38); LCD1602_Write_Command(0x08); /*显示关闭*/ LCD1602_Write_Command(0x01);    /*显示清屏*/  LCD1602_Write_Command(0x06);   /*显示光标移动设置*/ DelayMs(5); LCD1602_Write_Command(0x0C); /*显示开及光标设置*/ LCD1602_Clear_Screen(); /*清屏*/ }     main.c   /***********************************************************  文件名称: main.c 作 者: 终神晓 时间: 2014/11/12/22:48 版 本: V1.0 说 明: 在LCD1602第一行上显示LCD1602 Display,第二行显示 By Croesus ^_^. 修改记录: 无 ***********************************************************/ #include"reg52.h" #include"LCD1602.h"   void main(void) { LCD1602_Init(); while(1) { LCD1602_Write_String(0,0,"LCD1602 Display"); LCD1602_Write_String(1,1,"By Croesus"); LCD1602_Write_Char(13,1,'^'); LCD1602_Write_Char(14,1,'_'); LCD1602_Write_Char(15,1,'^'); while(1); } }
  • 热度 24
    2014-4-21 12:05
    2328 次阅读|
    5 个评论
    一般来说,C语言头文件的格式为: #ifndef _头文件名_H_ #define   _头文件名_H_ //代码部分,一般为函数声明,变量定义,常数设置等 #endif //头文件的具体内容,如函数定义等。          当使用include包含头文件时,用引号“”或尖括号意思不一样。只用引号“”时,首先搜索工程文件所在目录,然后再搜索编译器头文件所在目录。而当使用尖括号时,搜索编译器头文件所在目录,再搜索工程文件所在目录。一般来说,包含自己编写的头文件时,用双引号“”,而包含编译器自带的头文件时,用尖括号。 下面以LCD1602为例,在codeversion AVR中写头文件lcd.h:(当包含头文件时,只需添加#include"lcd.h") #ifndef  _LCD_H_ #define _LCD_H_ /*************************************************************** LCD1602管脚定义 1             GND       2             VCC 3             VEE 4             RS            PD4 5             RW            PD5  6             E             PD6 7-14       DB0~DB7        PB0~PB7 15           LEDA+ 16           LEDK- ***************************************************************/ void delay_xms(unsigned char m);       //定义延时x ms的延时函数 void LCD_write_data(unsigned char data);   //LCD写字节函数 void LCD_write_cmd(unsigned char cmd);   //LCD写命令函数 void LCD_gotoxy(unsigned char x,unsigned char y);   //LCD开始显示的位置坐标函数 void LCD_puts(unsigned char *str); //LCD输出字符串函数 void LCD_init(); //LCD初始化函数,清屏,光标归位(0,0),且光标不闪烁不显示。 #endif //============延时1ms函数================= #define RS PORTD.4 #define RW PORTD.5 #define EN PORTD.6 void delay_xms(unsigned char m)        {     unsigned int i;     while(m--)             //延时xms         for(i=0;i1714;i++){ }    //延时1ms    } /********************************************************* *******************LCD写数据函数*************************/ void LCD_write_data(unsigned char data) {    EN=0;    RS=1;    PORTB=data;          //送数据    EN=1;    delay_xms(1);    EN=0;  } /******************************************************** *****************LCD写命令函数***************************/ void LCD_write_cmd(unsigned char cmd) {     EN=0;     RS=0;     PORTB=cmd;         //送命令码     EN=1;     delay_xms(1);     EN=0; } /********************************************************* ******************LCD显示位置函数************************/ void LCD_gotoxy(unsigned char x,unsigned char y) {      unsigned char addr;      switch(x)      {         case 0: addr=0x00+y;break;     //x=0时,即开始显示位置为:0行y列        case 1: addr=0x40+y;break;     //x=1时,即开始显示位置为:1行y列        default: addr=0x00;            //若x超出范围,则默认从0行0列开始显示      }      LCD_write_cmd(addr|0x80);    //写显示位置命令,设置显示起始位置 } /********************************************************* ****************LCD输出字符串函数************************/ void LCD_puts(unsigned char *str) {    unsigned char i=0;    for(i=0;str !='\0';i++)    //输出字符串    {       LCD_write_data(str );       delay_xms(1);    }  } /*************************************************************** *******************LCD初始化*******************************/ void LCD_init() {     DDRD.4=1;        //设PD4~PD6为输出     DDRD.5=1;     DDRD.6=1;     DDRB=0xff;         //PB各口设为输出     LCD_write_cmd(0x38);        //2行,5*7点阵/每字符     delay_xms(1);     LCD_write_cmd(0x01);        //LCD清屏     delay_xms(1);     LCD_write_cmd(0x06);        //字符输入模式;地址增量,显示屏不动,字符后移     delay_xms(1);     LCD_write_cmd(0x0c);        //显示开,光标不显示不闪烁     delay_xms(1);     //RW=0; }    
  • 热度 13
    2014-3-11 14:26
    1184 次阅读|
    1 个评论
    附件中有完整的报告,好像不能显示图片。。。   唐 山 学 院 测控系统原理课程设计         题    目     家庭防盗报警器设计     系   (部)         XXXXXXXXXX        班    级        XXXXXXXXXXXX        姓    名          XXXXXXX           学    号        XXXXXXXXXX          指导教师        刘XXX    张XX        2014 年 2月  24日至  3月 7 日 共  2 周   2014年 3 月 7 日             课程设计成绩评定表 出勤 情况 出勤天数    缺勤天数   成 绩 评 定 出勤情况及设计过程表现(20分)   课设答辩(20分)   设计成果(60分)   总成绩(100分)   提问 (答辩) 问题 情况 1、 在protel中找不到自己用到的元件的库怎么办?答:对应原理图可以在原理图的library中画,PCB对应自己选用元件的尺寸画PCB的library。 2、 程序中如果产生喇叭鸣响就不能检测按键怎么办?答:中断实现喇叭鸣响。 综 合 评 定                          指导教师签名:                                   年    月    日     测控系统原理 课程设计任务书 一. 设计题目、内容及要求 运用所学单片机、模拟和数字电路、以及测控系统原理与设计等方面的知识,设计出一个家庭防盗防火报警器,能对门窗未关闭进行报警、对室内烟火信号进行报警,可通过定时开关灯模拟主人在家,完成门窗开关信号、烟火信号的检测电路、显示及键盘接口电路等部分的软、硬件设计。 家庭防盗防火报警器要求如下: 1)2路门开报警;4路窗开报警; 2)手工解除报警; 3)能显示是哪一路报警; 4)手工打开和解除警戒; 5)每天晚上定时开灯,模拟主人在家,灯最大负载400W,定时时间可人工设置。   二. 要求的设计成果(课程设计说明书、图纸等) 1)硬件部分包括前置信号处理单元(放大电路,调制解调电路、滤波电路等)、 A/D转换、微处理器(MCU)、键盘、显示等; 2)软件部分包括键盘扫描、A/D转换、数字滤波、标度变换、显示等; 3)用PROTEUS软件仿真实现; 4)用Protel画出系统的硬件电路图; 5)撰写设计说明书一份(不少于2000字),阐述系统的工作原理和软、硬件设计方法,重点阐述系统组成框图、硬件原理设计和软件程序流程图。说明书应包括封面、任务书、目录、摘要、正文、参考文献(资料)等内容,以及硬件电路图和软件程序框图等材料。 三. 进程安排   序号         课程设计各阶段名称           日期、周次 1           资料查阅                     2014年2月24日,1周 总体设计,硬件设计           2014年2月25,26日,1周 2           绘制电路图                   2014年2月27,28日,1周 3           绘制软件程序流程图,编写软件 2014年3月3,4日,2周 4           软、硬件仿真调试             2014年3月5日,2周 5           撰写设计说明书               2014年3月6,7日,2周   四. 主要参考资料 1.王福瑞等.《单片微机测控系统设计大全》.北京航空航天大学出版社,1999 2.《现代测控技术与系统》 韩九强 清华大学出版社 2007.9 3.《智能仪器》 程德福,林君主编 机械工业出版社 2005年2月 4.《测控仪器设计》浦昭邦,王宝光主编 机械工业出版社 2001 5.基于AT89C51单片机的数字电压表的设计,黄亮,电子制作,2006.10 ,25-27 6.Keil C51帮助文档 指导教师(签名): 教研室主任(签名):                                         摘 要 本系统采用了自制的红外发射和接收电路,它的制作简单、成本低、安装比较方便。采用红外发射二极管发射红外信号,通过红外接收头接收红外信号。这种防盗器安装隐蔽,不易被盗贼发现。 本设计包括硬件和软件设计两个部分。硬件部分包括单片机控制电路、LCD显示电路、按键控制电路、红外探头电路、驱动执行报警电路、LED显示电路等部分组成。处理器采用52系列单片机AT89C52,整个系统是在系统软件控制下工作的。   关键词:单片机;红外传感器;LCD显示;报警电路                                             目录 一、需求分析与设计思路 1 二、总体方案设计 1 1)软件与硬件分工说明 1 2) 硬件总体框图; 1 3) 软件结构图 2 三、 详细设计 2 1)用Proteus系统仿真 2 2)元件清单及元件选择及参数选择的依据 3 3)protel硬件电路图 4 4) 软件流程图 7 5)程序清单 9 四、使用说明 19 1)性能和功能介绍 19 2)各操作开关、按钮、指示灯、显示器等的作用介绍 19 3)使用操作步骤 19 4)故障处理 20           一、需求分析与设计思路 随着社会的不断进步和科学技术、经济的不断发展,人们生活水平得到很大的提高,对私有财产的保护意识在不断的增强,因而对防盗措施提出了新的要求。本设计就是为了满足现代住宅防盗的需要而设计的家庭式电子防盗系统。 就目前市面上装备主要有压力触发式防盗报警器、开关电子防盗报警器和压力遮光触发式防盗报警器等各种报警器,但这几种比较常见的报警器都存在一些缺点。而本设计中所使用的红外线是不可见光,有很强的隐蔽性和保密性,因此在防盗、警戒等安保装置中得到了广泛的应用。当检测到人通过时会产生一个低电平跳变,通过单片机检测到该信号,并做出一定的处理。 (1)该设计包括硬件和软件设计两个部分。模块划分为LCD显示、单片机最小系统、键盘控制、红外线发射接收模块、主人是否在家的定时模块、报警等模块的模拟电路及其子函数。 (2)本红外线防盗报警系统的模拟仿真内容有通过按键来模拟红外模块检测到信号,当信号产生以后进行自动报警,并且报警指示灯亮,LCD显示部分显示报警产生位置。按下警戒开关后,表示警戒的喇叭响,同时,警戒指示灯亮,LCD显示警戒进行中。当警戒解除再次按下按键解除警戒时,LCD显示警戒解除,指示灯熄灭,喇叭停止鸣叫。按下解除报警开关时,报警解除,报警指示灯熄灭,LCD显示安全。(此过程主人在不在家都工作)。 二、总体方案设计 1)软件与硬件分工说明  硬件部分主要用于LCD显示、喇叭鸣响、指示灯指示、定时灯指示、按键信号的采集、控制信号采集,软件部分主要用于LCD数据写入、按键按下监控、喇叭鸣响频率、定时灯定时时间控制、以及协调硬件之间的配合。 2)硬件总体框图; 系统组成框图2—1 3)软件结构图      三、详细设计 1)用Proteus系统仿真 模块划分为LCD显示、单片机最小系统、键盘控制、红外线发射接收模块、主人是否在家的定时模块、报警等模块的模拟电路及其子函数。 就此设计的核心模块来说,单片机就是设计的中心单元,所以此系统也是单片机应用系统的一种应用。单片机应用系统也是有硬件和软件组成。硬件包括单片机、输入/输出设备、以及外围应用电路等组成的系统,软件是各种工作程序的总称。单片机应用系统的研制过程包括总体设计、硬件设计、软件设计等几个阶段。 从设计的要求来分析该设计须包含如下结构:红外发射接收电路、报警电路、表示主人是否在家的灯泡电路、单片机、复位电路及显示部分组成。  处理器采用52系列单片机AT89C52。整个系统是在系统软件控制下工作的。设置在监测点上的红外发射电路发射红外信号后,接收电路接收电信号,当有人进入遮挡后产生电信号,经信号调理电路送至单片机。在单片机内,经软件查询、识别判决等环节实时发出入侵报警状态控制信号,并显示入侵位置,指示灯指示报警。人工按下警戒开关,进行警戒,警戒喇叭响起。警戒解除后,按下警戒开关,解除警戒。系统回到初始状态。 Proteus程序运行图 2)元件清单及元件选择及参数选择的依据   LCD1602——用于显示家庭防盗系统的运行情况,结构简单,价格低廉,可以满足显示要求。   AT89C52单片机——处理各种电信号,价格便宜,结构简单,满足系统要求。   2个sounder——用于报警和警戒,声音大,易吸引人的注意力。   发光二极管2个——指示是否显示报警和警戒。   1个二极管——用于电流反向保护。   9个按键——6个用于模拟红外传感器模块,2个用于控制关闭报警和打开、关闭警戒,1个用于复位系统。   三极管——用于驱动定时灯。   1个继电器——用于小电流控制大电流。   400W灯泡——用于指示主人是否在家。   电阻,电容若干,1个晶振。 3)protel硬件电路图 1、总图内容: 2、课设内容:   3、红外发射接收内容:   4、红外传感器模块 本设计采用红外发射管发射红外信号,接收管接收到红外信号被遮挡后产生低电平触发报警处理。其工作电路原理及设计电路如图4所示, D11发射红外信号Q14接收红外信号,当信号被人遮挡后OUT1输出低电平,进入单片机从而检测出有人入侵。 红外传感器原理图     5、时钟电路的设计 18和19分别为单片机的XTAL1和XTAL2,XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。 因为一个机器周期含有6个状态周期,而每个状态周期为2个振荡周期,所以一个机器周期共有12个振荡周期,如果外接石英晶体振荡器的振荡频率为12MHZ,一个振荡周期为1/12us,故而一个机器周期为1us 。如图6所示为时钟电路。 时钟电路图   6、复位电路的设计 复位方法一般有上电自动复位和外部按键手动复位,单片机在时钟电路工作以后, 在RESET端持续给出2个机器周期的高电平时就可以完成复位操作 。例如使用晶振频率为12MHz时,则复位信号持续时间应不小于2us 。本设计采用的是外部手动按键复位电路。如图7示为复位电路。 复位电路图   7、 警戒、报警电路及指示电路的设计 指示灯LED0和LED1分别接在P0.0和P1.7口,LS1和LS2分别接在P1.5和P1.6口,用来报警和警戒。LED灯分别指示报警和警戒的情况。   发光二极管警戒、报警电路和指示电路图 8、 LCD显示电路设计 LCD1602的16个引脚接到对应的16个引脚上。 LCD显示电路图 9、按键控制电路 按键分别接在P0.1和P0.2口,用来控制警戒和解除报警。 按键控制电路图 10、定时灯指示主人是否在家电路设计  R10左侧接入P0.3通过单片机来控制灯的亮灭,继电器驱动灯泡。   定时灯电路图     4)软件流程图 主函数程序框图 按键扫描程序框图   按键处理程序框图   中断程序框图     5)程序清单        程序分为三个文件,主要为main.c包含主函数和中断函数LCD1602.C包含1602的驱动函数,QITA.C包含按键检测,按键处理,单片机初始化和铃声函数,以及两个头文件lcd1602.h和qita.h用来对应文件的函数声明。一下是各个文件内容。 Main.c: #include "qita.h" uchar code Prompt0 = "zhu:chuang 2    men an quan     "; uchar code Prompt2 = "zhu:chuang 4    men an quan     "; uchar code Prompt4 = "zhu:men 2       chuang an quan  "; uchar code Prompt6 = "jing bao        jie chu !~  ^_^ "; uchar code Prompt8 = "jing jie        jie chu.....    "; uchar code Prompt11 ,Prompt1 ,Prompt3 ; extern uchar code Prompt5 ,Prompt7 ,Prompt9 ; extern uint JIE,JISHI,ala1,ala2;   //输入状况扫描 int key_scan(void) { if((CHUANG1CHUANG2CHUANG3CHUANG4)==0) { Delayms(10); if((CHUANG1CHUANG2CHUANG3CHUANG4)==0) {   if(CHUANG1==0){while((CHUANG1)==0);return 1;} if(CHUANG2==0){while((CHUANG2)==0);return 2;} if(CHUANG3==0){while((CHUANG3)==0);return 3;} if(CHUANG4==0){while((CHUANG4)==0);return 4;} } } if((MEN1MEN2)==0) { Delayms(10); if((MEN1MEN2)==0) { if(MEN1==0){while((MEN1)==0);return 5;} if(MEN2==0){while((MEN2)==0);return 6;} } } if((JIE_BAOJING_JIE)==0) { Delayms(10); if((JIE_BAOJING_JIE)==0) { if(JIE_BAO==0){while((JIE_BAO)==0);return 7;} if(JING_JIE==0) { while((JING_JIE)==0); JIE=!JIE; return 8; } } } return 0; } //输入处理 void key_deal(int i) {  switch(i)  {   case 1: ShowString(0,0,Prompt0); ShowString(0,1,Prompt0+16); ala1=1; ZHI_SHI1=0; break; case 2: ShowString(0,0,Prompt1); ShowString(0,1,Prompt1+16); ala1=1; ZHI_SHI1=0; break;     case 3: ShowString(0,0,Prompt2); ShowString(0,1,Prompt2+16); ala1=1; ZHI_SHI1=0; break; case 4: ShowString(0,0,Prompt3); ShowString(0,1,Prompt3+16); ala1=1; ZHI_SHI1=0; break; case 5: ShowString(0,0,Prompt4); ShowString(0,1,Prompt4+16); ala1=1; ZHI_SHI1=0; break; case 6: ShowString(0,0,Prompt5); ShowString(0,1,Prompt5+16); ala1=1; ZHI_SHI1=0; break; case 7: ala1=0; ZHI_SHI1=1; ShowString(0,0,Prompt7); ShowString(0,1,Prompt7+16); Delayms(1000); ShowString(0,0,Prompt6); ShowString(0,1,Prompt6+16); break; case 8: jing_jie(); break; default: ShowString(0,0,Prompt11); ShowString(0,1,Prompt11+16); break;  } } void jing_jie(void) { if(JIE!=0) { ala2=1; ZHI_SHI2=0; ShowString(0,0,Prompt8); ShowString(0,1,Prompt8+16); } if(JIE==0) { ala2=0; ZHI_SHI2=1; ShowString(0,0,Prompt9); ShowString(0,1,Prompt9+16); if(ala1==0) { ShowString(0,0,Prompt6); ShowString(0,1,Prompt6+16); } } } void Init_IO(void) { B_BAO_JING=1; B_JING_JIE=1; ZHU_REN=1; ZHI_SHI2=1; ZHI_SHI1=1; TMOD = 0x11; TH0  = 0XF5; TL0  = 0X05; TH1  = 0X35; TL1  = 0X05; IE   = 0x8A; TR0  = 1; TR1  = 1; } void Alarm(uchar t) {   uchar i,j; for(i=0;i20;i++) {   B_BAO_JING = ~B_BAO_JING; for(j=0;j;j++); } } void Alarm_jie(uchar t) {   uchar i,j; for(i=0;i20;i++) {   B_JING_JIE = ~B_JING_JIE; for(j=0;j;j++); } } void Alarm1(void) //bao jing {   Alarm(90); Alarm(120); } void Alarm2(void) { Alarm_jie(80); Alarm_jie(50); } LCD1602.C: #include "LCD1602.h" void Delayms(uint ms) {   uchar i; while(ms--) {   for(i=0;i120;i++); } }   uchar Busy_Check() {   uchar LCD_Status; RS = 0; RW = 1; EN = 1; Delayms(1);     LCD_Status = LCD_DATA; EN = 0; return LCD_Status; } void Write_LCD_Command(uchar cmd) {   while((Busy_Check()0x80)==0x80); RS = 0; RW = 0; EN = 0; LCD_DATA = cmd; EN = 1; Delayms(1); EN = 0; } void Write_LCD_Data(uchar dat) {   while((Busy_Check()0x80)==0x80); RS = 1; RW = 0; EN = 0; LCD_DATA = dat; EN = 1; Delayms(1); EN = 0; } void Initialize_LCD() {   Write_LCD_Command(0x38); Delayms(1); Write_LCD_Command(0x01); Delayms(1); Write_LCD_Command(0x06); Delayms(1); Write_LCD_Command(0x0c); Delayms(1); } void ShowString(uchar x,uchar y,uchar *str) {   uchar i = 0; if(y == 0) Write_LCD_Command(0x80 | x); if(y == 1) Write_LCD_Command(0xc0 | x); for(i=0;i16;i++) {   Write_LCD_Data(str ); } } QITA.H: #include"LCD1602.h" int key_scan(void); void key_deal(int i); void jing_jie(void); void Init_IO(void); void Alarm(uchar t); void Alarm1(void); void Alarm_jie(uchar t); void Alarm2(void); LCD1602.H: #include  #include  #define uchar unsigned char #define uint unsigned int #define LCD_DATA P2 sbit RS = P1^0; sbit RW = P1^1; sbit EN = P1^2; sbit MEN1 = P1^3; sbit MEN2 = P1^4; //ru  门口是否有人经过 sbit B_BAO_JING = P1^5; //chu 报警 sbit B_JING_JIE = P1^6; //chu 警戒 sbit ZHI_SHI2 = P0^0; //chu 指示是否警戒 sbit ZHI_SHI1 = P1^7; //chu 指示是否报警 sbit JIE_BAO = P0^1; //ru  解除警报 sbit JING_JIE = P0^2; //ru,开和关警戒 sbit ZHU_REN =P0^3; //chu,表示主人 sbit CHUANG1 = P0^4; sbit CHUANG2 = P0^5; sbit CHUANG3 = P0^6; sbit CHUANG4 = P0^7;  //ru窗口是否有人经过 void Delayms(uint ms); uchar Busy_Check(); void Write_LCD_Command(uchar cmd); void Write_LCD_Data(uchar dat); void Initialize_LCD(); void ShowString(uchar x,uchar y,uchar *str); 四、使用说明 1)性能和功能介绍    此次设计的家庭防盗报警器,是基于at89c52单片机设计的家庭防盗报警系统。利用6路红外传感器采集信号,2个喇叭分别报警和警戒,2个指示灯分别指示报警和警戒情况,一个定时灯模拟显示主人是否在家,LCD显示系统工作状态。 2)各操作开关、按钮、指示灯、显示器等的作用介绍 P04-P07和P13、P14分别接红外模块,P01和P02分别接解除报警和打开、解除警戒,P00和P17指示灯指示警戒和报警,P16和P15分别接警戒和报警喇叭,P2口接LCD1602的数据口,RS、RW、E分别接P10、P11、P12,模拟家中主人的定时灯引脚接P03。 3)使用操作步骤 按下模拟红外模块的开关,系统检测到入侵,报警指示灯亮,报警喇叭响;按下警戒开关,警戒喇叭模拟警戒,警戒指示灯亮;再次按下警戒开关,关闭警戒,警戒指示灯灭;按下解除报警开关,解除报警;LCD实时显示系统工作状态。 4)故障处理 由于本系统是电子式的,所以不会产生机械损坏。一般损坏方式为电路损坏,需用万用表逐点测试,借助程序调试,排除故障。    
相关资源