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

📄 psensor.c

📁 光电传感器和蜂鸣器控制 理解ZLG7290键盘与显示控制芯片相关函数的控制和使用方法
💻 C
字号:
     /*******************************************************************/ 
      /*                                                                         
      /* 深圳信息职业技术学院电子通信系                                              
      /*  
      /* 《单片机程序设计实践教程》项目例程 
      /*                                                       
      /* 第12章 基础项目. '光电传感器和嗡鸣器控制'演示程序                                                                   
      /*                                                                         
      /* 功能:将厚纸片插在4个光电传感器的任一凹槽内,8个LED数码管显示相应传感器编号,
      /* 并用8个LED发光管显示相应的传感器数值,同时嗡鸣器发出声响
      /* 演示过程:将程序下载执行后,将厚纸片插在4个光电传感器的任一凹槽内即可看到演示效果 */
  	   /* 存在问题:无;
      /* 邮箱: panxn@sziit.com.cn  */ 
      /* 作者:潘晓宁   */ 
      /*                     */ 
      /* 修改时间: 2008/8/7                 */ 
      /*                                */ 
      /*【版权】Copyright(C)PanXiaoNing All Rights Reserved             */ 
      /*【声明】此程序仅用于学习与参考   
      /*                                                                    */ 
      /*******************************************************************/ 

#include "I2C.h"
#include "ZLG7290.h"
#include  <absacc.h>
#include  <intrins.h>


#define  uchar  unsigned  char
#define  uint  unsigned  int

#define  PA8255  XBYTE[0x3ffc]        //8255端口A的地址
#define  PB8255  XBYTE[0x3ffd]        //8255端口B的地址
#define  PC8255  XBYTE[0x3ffe]        //8255端口C的地址
#define  COM8255  XBYTE[0x3fff]       //8255命令字的地址

sbit  cs138=P1^6 ;                    //74HC138的选通端口
sbit  Sensor01=P1^2 ;                 //传感器1的输入端口
sbit  Sensor02=P1^3 ;                 //传感器2的输入端口
sbit  Sensor03=P1^4 ;                 //传感器3的输入端口
sbit  Sensor04=P1^5 ;                 //传感器4的输入端口

uchar Sflag1,Sflag2,Sflag3,Sflag4;    //定义4个传感器的状态储存变量

void DispValue(char x, unsigned char dat);
void  delay(uchar);

/*********************************主函数***************************************/
void  main(void)
{  cs138=0;                              //选通74HC138的使能端
   COM8255=0x80;                         //8255的初始化,PA,PC口为输出
   PC8255=0x00;                          //禁止嗡鸣器发声
   PA8255=0xff;                          //所有LED灯全灭

   while(1)
  {
     Sflag1=(uchar)Sensor01;             //将传感器1的输入端口状态储存在指定变量中
	 Sflag2=(uchar)Sensor02;             //将传感器2的输入端口状态储存在指定变量中
	 Sflag3=(uchar)Sensor03;             //将传感器3的输入端口状态储存在指定变量中
	 Sflag4=(uchar)Sensor04;             //将传感器4的输入端口状态储存在指定变量中

	 if(!(Sflag1&Sflag2&Sflag3&Sflag4)) PC8255|=0x01;   //有变量为0的情况出现,允许嗡鸣器发声
    else PC8255&=0;                       //禁止嗡鸣器发声

    switch(Sflag1)                        //判断传感器1的输入状态
	 {
	    case 0:PA8255&=0x3f;                //光电信号被挡,点亮D17和D16灯
	           DispValue(0,11);             //在数码管1,2位显示11
			     break;
	    case 1:PA8255|=0xc0;                //光电信号无遮挡,熄灭D17和D16灯
		        ZLG7290_Download(0,0,0,31);  //强制熄灭数码管1
			     ZLG7290_Download(1,0,0,31);  //强制熄灭数码管2
	  	        break;
		default:break;
	 }
    switch(Sflag2)                        //判断传感器2的输入状态
	 {
	    case 0:PA8255&=0xcf;                //光电信号被挡,点亮D15和D14灯
		        DispValue(2,22);             //在数码管3,4位显示22
			     break;
	    case 1:PA8255|=0x30;                //光电信号无遮挡,熄灭D15和D14灯
		        ZLG7290_Download(2,0,0,31);  //强制熄灭数码管3
			     ZLG7290_Download(3,0,0,31);  //强制熄灭数码管4
	  	        break;
		default:break;
	 }
    switch(Sflag3)                        //判断传感器3的输入状态
	 {
	    case 0:PA8255&=0xf3;                //光电信号被挡,点亮D13和D12灯
		        DispValue(4,33);             //在数码管5,6位显示33
   			  break;
	    case 1:PA8255|=0x0c;                //光电信号无遮挡,熄灭D13和D12灯
		        ZLG7290_Download(4,0,0,31);  //强制熄灭数码管5
			     ZLG7290_Download(5,0,0,31);  //强制熄灭数码管6
	  	        break;
		default:break;
	 } 
    switch(Sflag4)                        //判断传感器4的输入状态
	 {
	    case 0:PA8255&=0xfc;                //光电信号被挡,点亮D11和D10灯
		        DispValue(6,44);             //在数码管7,8位显示44
   			  break;
	    case 1:PA8255|=0x03;                //光电信号无遮挡,熄灭D11和D10灯
		        ZLG7290_Download(6,0,0,31);  //强制熄灭数码管7
			     ZLG7290_Download(7,0,0,31);  //强制熄灭数码管8
	  	        break;
		default:break;
	  }
     delay(140);                          //延时大约140ms
   }  
}
/*********************************主函数结束************************************/

void DispValue(char x, unsigned char dat)
//ZLG7290的10进制字节显示函数,dat:要显示的数据,取值0~99;x:显示位置,取值0~6
{
	unsigned char d;
	d = dat / 10;                 //取x位的10进制显示数
	ZLG7290_Download(x,0,0,d);    //在x位不闪烁、熄灭小数点点亮数字d,此函数由项目中的ZLG7290.c规定
	d = dat - d * 10;             //取x+1位的10进制余数的显示数
	ZLG7290_Download(x+1,0,0,d);  //在x+1位不闪烁、熄灭小数点点亮数字d,此函数由项目中的ZLG7290.c规定
}

void  delay(uchar  x)              // 延时,系统主频为11.0592MHz
{  uchar k;
   while(x--)                      //延时大约x毫秒钟
     for(k=0;k<125;k++){}
}

⌨️ 快捷键说明

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