仿真原理图如下(proteus8.10仿真工程文件可到本帖附件中下载)
单片机源程序如下:
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
sbit SCL=P1^4; //SCL定义为P1口的第3位脚,连接ADC0832SCL脚
sbit DO=P1^5; //DO定义为P1口的第4位脚,连接ADC0832DO脚
sbit CS=P1^3; //CS定义为P1口的第4位脚,连接ADC0832CS脚
sbit beep = P3^3; //蜂鸣器IO口定义
sbit key= P1^7; //开关
uchar shuiwei; //水位
uchar s_high = 90;//水位报警参数
uint flag_250ms ;
/********************************************************************
* 名称 : delay_uint()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_uint(uint q)
{
while(q--);
}
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/***********读数模转换数据********************************************************/
//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的
// 1 0 0 通道
// 1 1 1 通道
unsigned char ad0832read(bit SGL,bit ODD)
{
unsigned char i=0,value=0,value1=0;
SCL=0;
DO=1;
CS=0; //开始
SCL=1; //第一个上升沿
SCL=0;
DO=SGL;
SCL=1; //第二个上升沿
SCL=0;
DO=ODD;
SCL=1; //第三个上升沿
SCL=0; //第三个下降沿
DO=1;
for(i=0;i<8;i++)
{
SCL=1;
SCL=0; //开始从第四个下降沿接收数据
value<<=1;
if(DO)
value++;
}
for(i=0;i<8;i++)
{ //接收校验数据
value1>>=1;
if(DO)
value1+=0x80;
SCL=1;
SCL=0;
}
CS=1;
SCL=1;
if(value==value1) //与校验数据比较,正确就返回数据,否则返回0
return value;
return 0;
}
/****************报警函数***************/
void clock_h_l()
{
if(shuiwei<s_high&&key==0)//水位小于设定值且红外探测器触发
{
beep = 0; //工作
}
else
{
beep = 1; //暂停工作
}
}
/***************主函数*****************/
void main()
{
while(1)
{
shuiwei = ad0832read(1,0); //读出湿度
shuiwei = 99 - shuiwei * 99 / 255;
shuiwei *= 1.3;
if(shuiwei >= 99)
shuiwei = 99;
clock_h_l(); //报警函数
delay_1ms(1);
}
}
注意仿真必须要用Proteus8.10版本才行,如果没有此版本的就不要下载了:
智能饮水机.7z
(149.9 KB, 下载次数: 60)
|