📄 psensor.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 + -