3.4四位独立按键及声光报警
3.4.1四位独立按键
四位独立按键如电路图3-6,按键无动 作,对应端口为高电平。当按键按下,单片 机检测到低电平,按程序实现相应动作。
图3-6独立按键
3.4.2 led灯和蜂鸣器
图3-7 8个共阳极led灯 图3-8蜂鸣器
当给测量电压超过上下限时8个led开始闪烁,同时,蜂鸣器发出滴滴的声音。当看到这一现象是说明测量电压超限,应注意调节电压。
8
四、系统软件设计
4.1软件实现流程图
开始
数码管显示,对应通 道。显示上下限(默 认零,但上下限都为0 时不报警)显示对应 通道电压 单片机通过IIC总线给PCF8591发送命令,让PCF8591开始工作。 单片机通过中断程序定时采样(默认采样通道为通道0) Led D1亮,其余熄灭,蜂鸣器无动作 否 D1熄灭,如果 是 单片机判断 按键 按下K2,设置K4是否按 报警电压下下? 限,调节范围 0-4V,按下K3 是 设置电压上限K1是否 单片机判 否 调节范围按下? 断K1是否 单片1-5V。设置时机采 否按下? 数码管,显示集 上下变化 8591 的0通 是 道值,退出上下限设置,完成上下限设置 是 显示 单片机给PCF8591,发8个数 送指令,使采集通道在码管闪 单片机判断0-34个通道中切换并采烁,蜂 否 电压是否在集电压。数码管显示对应鸣器, 设定范围? 通道,显示对应电压 发出滴 滴声。 数码 是否设置上下限不影响,通道选择,及对应通道 管,显电压值,上下限,可在任意时刻设置。定时器T1, 是示通控制单片机采样频率,定时器T0控制数码管扫道,上不报警,正常定时采描。下载好程序,上电开始工作执行相应功能,下限,集,数码管显示,电断电及结束。 对应通压,通道,上下限。 道电压 9
4.2 IIC总线在实训中的应用
4.2.1单片机与PCF8591芯片之间IIC总线应用程序
void init() //初始化总线 SCL 和SDA 都拉成高电平 {
SCL=1;//时钟线 _nop();
SDA=1;//数据线
_nop();_nop();_nop();_nop();_nop(); }
void start()//开始信号 {
SDA=1; SCL=1;
_nop();_nop();_nop();_nop();_nop(); SDA=0;
_nop();_nop();_nop();_nop();_nop(); SCL=0; }
void stop()//终止信号 {
SDA=0; SCL=1;
_nop();_nop();_nop();_nop();_nop(); SDA=1;
_nop();_nop();_nop();_nop();_nop(); SDA=0; }
void ack()//发送应答 {
uchar i; SDA=0; SCL=1;
_nop();_nop();_nop();_nop(); while((SDA==1)&&(i<255))i++; SCL=0;
_nop();_nop();_nop();_nop(); }
void noack()//发送非应答 {
SDA=1; SCL=1;
10
_nop();_nop();_nop();_nop(); SCL=0; SDA=0; }
void sendbaty(uchar da)//发送字节 {
uchar i,temp; temp=da;
for(i=0;i<8;i++) {
temp=temp<<1; SCL=0;
_nop();_nop();_nop();_nop(); SDA=CY;
_nop();_nop();_nop();_nop(); SCL=1;
_nop();_nop();_nop();_nop(); }
SCL=0;
_nop();_nop();_nop();_nop(); SDA=1;
_nop();_nop();_nop();_nop(); }
unsigned char readbaty()//读字节 {
uchar i,temp; SCL=0;
_nop();_nop();_nop();_nop(); SDA=1;
for(i=0;i<8;i++) {
SCL=1;
_nop();_nop();_nop();_nop(); temp=(temp<<1)|SDA; SCL=0;
_nop();_nop();_nop();_nop(); }
_nop();_nop();_nop();_nop(); return temp; }
void DAC(uchar Data) {
start();
sendbaty(0x90); //写入芯片地址
11
ack();
sendbaty(0x40); //写入控制位 ack();
sendbaty(Data); //写数据 ack(); stop(); }
unsigned char ReadADC(uchar Chl) {
uchar Data;
start(); //写入芯片地址 sendbaty(0x90); ack();
sendbaty(0x40|Chl);//写入选择的通道ch1(1.2.3.4通道) ack(); start();
sendbaty(0x91); //读入地址 ack();
Data=readbaty(); //读数据 SCL=0; noack(); stop();
return Data; //返回值 }
4.3完整程序见附录3
12