仿真原理圖如下(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)
2022-7-2 14:39 上傳
點擊文件名下載附件
代碼+仿真
|