计算机应用 | 古代文学 | 市场营销 | 生命科学 | 交通物流 | 财务管理 | 历史学 | 毕业 | 哲学 | 政治 | 财税 | 经济 | 金融 | 审计 | 法学 | 护理学 | 国际经济与贸易
计算机软件 | 新闻传播 | 电子商务 | 土木工程 | 临床医学 | 旅游管理 | 建筑学 | 文学 | 化学 | 数学 | 物理 | 地理 | 理工 | 生命 | 文化 | 企业管理 | 电子信息工程
计算机网络 | 语言文学 | 信息安全 | 工程力学 | 工商管理 | 经济管理 | 计算机 | 机电 | 材料 | 医学 | 药学 | 会计 | 硕士 | 法律 | MBA
现当代文学 | 英美文学 | 通讯工程 | 网络工程 | 行政管理 | 公共管理 | 自动化 | 艺术 | 音乐 | 舞蹈 | 美术 | 本科 | 教育 | 英语 |

IC卡门禁系统-机电毕业论文网(3)

2013-07-29 01:07
导读:出 全为0的扫描码F0H,然后从行检测口PD4~PD7输入行检测信号,中要有一列信号不为1,即PD口不为F0H,则表示有键按下。 3.5.2 查询按下键所在的行、列位置
出 全为0的扫描码F0H,然后从行检测口PD4~PD7输入行检测信号,中要有一列信号不为1,即PD口不为F0H,则表示有键按下。 

  3.5.2  查询按下键所在的行、列位置。单片机将得到的信号取反,PD4~PD7口中为了的位便是按键所在的列,确定行位置原理相同。

  3.5.3  键的抖动处理。当用手按下一个键时,往往会出现所按键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况;在释放一个键时,也会出现类似的情况这就是键抖动。抖动的持续时间不一,通常不会大于10ms。若抖动问题不解决,就会引起对闭合键的多次读入。解决键抖动最方便的方法就是:当发现有键按下后,不要立即进行逐行扫描,而是延时10ms后现进行。由于键按下的时间持续上百ms,延时后再扫描也不迟。

  3.6  字符型LCD显示模块 液晶显示器以其微功耗、体积小、重量轻、超薄型等诸多其他显示器件无法比拟的优点,在袖珍式登记表和低功耗系统中,得到越来越广泛的应用。本系统使用液晶显示模块作为人机交换界面显示,采用四线接法,大大节省了单片机的I/O口。

  4系统软件设计

  4.1  系统总体理论设计方框图 本系统最主要的部分是软件,所有的控制都是由单片机程序控制实现。上电开机后,LCD显示器第一行显示“Jason  Janito”,第二行显“Total : 卡数/83”;然后门禁系统进入等待状态,等待期间不断检测是否有卡插入或按键按下,若有卡插入则验证该卡,若有键按下,在输入正确密码后进入设置菜单。整体操作流程图如图8所示。

 SHAPE  \* MERGEFORMAT  

图8  整体流程图

  4.2  IC电话卡验证、显示及减钱程序

  当系统检测到有IC卡插入时,CPU Atmega8首先将IC卡内的全部数据读出并存储在数组IC_Codes_8[16]内,然后将数组与预先存储在EEPROM中的IC卡数据作比较,如果全部数据相同则表示该卡允许放行,以绿灯提示,并将IC电话卡内的余额显示在液晶显示器上;如果此时按下确定键,则进入IC卡减钱程序,在提示处输入要减去的金额(每次最多可减0.9元),按下确定键即可。部分程序如下:

void Read_Card ( void )         // 读卡程序(读取IC电话卡内的数据)

(科教作文网http://zw.ΝsΕAc.Com编辑整理)


{
   unsigned char  I = 0 , j = 0 , k = 0 ,    // 循环用变量                                IC_Codes_2[128] = { 0 } ;   // IC卡内128bit数据
   for( i = 0 ; i < 16 ; i++ )
   {
      IC_Codes_8[i] = 0 ;     // 上次读卡的全局变量数据清除
   }
 
   Reset_0 ;                     // IC电话卡复位
   CLK_0 ;                
   delay_nms(10) ;                      // 延时10ms
 
   Reset_1 ;              //   为使地址计数器复位到0,先让Reset端变高。
   delay_nus(8) ;        //  紧跟着一个Clock脉冲(从低到高再降到0),
   CLK_1 ;            //  Reset重新变低,把Clock脉冲包住。随着Reset
   delay_nus(44) ;       //  端变低,地址0单元的数据从I/O上输出。对应
   CLK_0 ;            //  Clock端的每个脉冲,其上升沿使地址计数器增加。
   delay_nus(8) ;       //   其下降沿使被选通地址单元的数据从I/O上输出。
   Reset_0 ;             //  地址计数器增加到127后返回到0。

(科教作文网 zw.nseac.com整理)


   delay_nus(5) ;      
   if ( ( PINB & 0x02 ) == 0 )
   {
         IC_Codes_2[0] = 0 ;       //   读取IC卡地址0的数据(数据为0时)
   }
   else                    
   {                    
         IC_Codes_2[0] = 1 ;       //   读取IC卡地址0的数据(数据为1时)

   }
   delay_nus(27) ;                      // 延时27us
 
   for ( i = 1 ; i < 128 ; i++ )
   {
      CLK_1 ;
      delay_nus(40) ;                //  IC卡时钟脉冲
      CLK_0 ;
      delay_nus(20) ;
      if ( ( PINB & 0x02 ) == 0 )    
         {
            IC_Codes_2[i] = 0 ;   //  读取IC卡地址1~127的数据(数据为0时)
         }
         else
         {                      
            IC_Codes_2[i] = 1 ;   //  读取IC卡地址1~127的数据(数据为1时) (科教范文网 lw.AsEac.com编辑整理)
         }
         delay_nus(20) ;
   }
   for( i = 0 ; i < 16 ; i++ )     //  将128bit 数据按顺序转换成16个字节
   {              
      for ( j = 0 ; j < 8 ; j++ )    
         {                  //  把16个字节存储到数组IC_Codes_8[16]
         IC_Codes_8[i] |= ( IC_Codes_2[k] << ( 8 - j ) ) ;
             k++ ;
         }
   }
}

  4.3  液晶显示与键盘扫描程序单片机应用系统通常都需要进行人—机对话。其中包括人对应用系统的状态干预与数据输入,应用系统向操作者显示状态与运行结果等信息。显示器与键盘是单片机应用系统中最常用的人—机交互设备。本系统应用到的液晶显示与键盘扫描程序如下:4.3.1  液晶显示程序(主要部分):                                          // 液晶显示器命令、数据写入函数     // 命令形参   //  数据形参               void LCD_write_char( unsigned command , unsigned data )
{
   unsigned command_temp , data_temp ;       // 变量定义
 
   command_temp = command ;     //  命令传递 (转载自http://zw.NSEaC.com科教作文网)
   data_temp = data ;             //  数据传递
   delay_nus(16) ;                  //  延时16us
 
   if( command == 0 )         //   如果命令为0则写入数据
   {
      LCD_RS_PORT |= LCD_RS ;  // RS=1
      LCD_DATA_PORT& = 0Xf0 ;         // 初始化I/O口
      LCD_DATA_PORT |= ( ( data_temp & 0xf0 ) >> 4 ) ; 
      LCD_en_write() ;         //  调整位置后写高四位数据
      LCD_DATA_PORT &= 0Xf0 ;        // 初始化I/O口
      LCD_DATA_PORT |= data_temp & 0x0f ;  
      LCD_en_write() ;          //  写低四位数据
   }
   else                    //   如果命令为1则写入命令
   {
      LCD_RS_PORT& = ~LCD_RS ;   // RS=0
      LCD_DATA_PORT &= 0Xf0 ;        //

上一篇:基于PXI总线的高速数字传输模块设计及正交解调 下一篇:没有了