专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于51单片机之74HC165实验例程

作者:未知   来源:CaKen的空间   点击数:  更新时间:2014年08月17日   【字体:

 **************************  Copyright(C)CaKe  *****************************************

========================================================================================
==============**文件名    : main.c              ==============
==============**作者      : CaKen              ==============
==============**版本号    : V1.0               ==============
==============**时间      : 2014.08.16               ==============
==============**功能描述  : 74HC165实验测试          ==============
========================================================================================
****************************************************************************************
 
#include <reg52.h>
#include <intrins.h>
 
//SPI 接口
sbit    CLK    = P3^6;    //串行时钟
sbit    IN_PL  = P1^6;     //把数据加载到锁存器中
sbit    IN_Dat = P1^7;     //数据通过P1.7脚移进单片机内处理
 
sbit    RELAY  = P1^4;    //继电器
sbit    BEEP   = P1^5;    //蜂鸣器
 
unsigned char bdata Key;
sbit    K0=Key^0;        //位定义
sbit    K1=Key^1;        //位定义
sbit    K2=Key^2;        //位定义
sbit    K3=Key^3;        //位定义
sbit    K4=Key^4;        //位定义
sbit    K5=Key^5;        //位定义
sbit    K6=Key^6;        //位定义
sbit    K7=Key^7;        //位定义
 
bit  M0 ,K0J;  //位定义
 
*****************************************************************************************
函数名:
调  用:beep();
参  数:
返回值:
结  果:
备  注:蜂鸣器 (让蜂鸣器发出动听声音)
*****************************************************************************************
 
void beep()
{
  unsigned char i,j;
  for (i=0;i<2;i++)
   {
     for (j = 0; j<255; j++)
   {_nop_();}
       BEEP=!BEEP;    //BEEP取反
   }
       BEEP=1;        //关闭蜂鸣器
}
 
****************************************************************************************
函数名:74HC165函数初始化
调  用:HC165_Init();
参  数:
返回值:
结  果:
备  注:IN_PL上升沿,CLK上升沿
****************************************************************************************
 
unsigned long HC165_Init(void)
  unsigned char i;
  unsigned int indata;
  
   IN_PL=0;      //上升沿
   _nop_();                  //短暂延时 产生一定宽度的脉冲
   IN_PL=1;                  //将外部信号全部读入锁存器中
   _nop_();
             
   indata=0;                 //保存数据的变量清0 
   for(i=0; i<8; i++)
    {
   indata=indata<<1;      //左移一位
      if(IN_Dat==1)
     indata=indata+1;  //如果IN_Dat检测到高电平 保存数据的变量加1
      CLK=0;               //时钟置0
        _nop_();    //上升沿
        CLK=1;               //时钟置1  
 }  
   return(~indata);          //将保存数据的变量取反后返回
}
 
 
*****************************************************************************************
函数名:主函数
调  用:main
参  数:
返回值:
结  果:
备  注:74HC165控制八个按键
*****************************************************************************************
 main()
{  
 
  while(1)
  {
    unsigned long Input=HC165_Init();    //调用165驱动程序
  Key=Input&0xff;                     //将数据传给位变量
  RELAY = 1;
     P2 = 0xff;                          //清除
 
    if(K0&K0J)
    M0=~M0;               //实现脉冲输入  大家仔细体会
    K0J=~K0;        
 
 if(M0) {RELAY = 0; P2 = 0x7f; }    //实现脉冲输入
 if(K1) {beep();    P2 = 0xbf;   }    //K1 为1时开启蜂鸣器和2个灯
 if(K2) {beep();    P2 = 0xdf;   }
    if(K3) {beep();    P2 = 0xef;   }
 if(K4) {beep();    P2 = 0xf7;   }
 if(K5) {beep();    P2 = 0xfb;   }
 if(K6) {beep();    P2 = 0xfd;   }
 if(K7) {beep();    P2 = 0xfe;   }
   }     
}
 
 
关闭窗口

相关文章