元件配置及傳感器在原理圖中
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (30.05 KB, 下載次數: 53)
下載附件
2019-5-20 18:03 上傳
0.png (85.89 KB, 下載次數: 61)
下載附件
2019-5-20 18:03 上傳
0.png (7.18 KB, 下載次數: 78)
下載附件
2019-5-20 18:03 上傳
單片機源程序如下:
- #include <reg52.h>
- #include <intrins.H>
- #include "i2c.h"
- #define DataPort2_DuanMa P2 //數碼管段碼數據口
- #define DataPort1_WeiMa P1 //數碼管位碼數據口
- #define uchar unsigned char
- #define uint unsigned int
- #define AddWr 0x90 //寫數據地址
- #define AddRd 0x91 //讀數據地址
- #define Pre_Max 45 //設定氣壓最大值
- #define Pre_Min 10 //設定氣壓最小值
- extern bit ack;
- unsigned char ReadADC(unsigned char Chl);
- bit WriteDAC(unsigned char dat);
- sbit Key_Set=P3^0; //設置
- sbit Key_Add=P3^1; // 加
- sbit Key_Dec=P3^2; //減
- sbit Key_Str=P3^3; //啟動
- sbit Realy_1=P3^6; //繼電器1
- sbit Realy_2=P3^7; //繼電器2
- sbit Led=P0^6; //系統指示燈
- sbit Bee=P0^7; //蜂鳴器
- sbit Led_Red=P0^4;
- sbit Led_Green=P0^5;
- /*******************************************新加***********************************************************************/
-
- sfr ISP_DATA = 0xe2;
- sfr ISP_ADDRH = 0xe3;
- sfr ISP_ADDRL = 0xe4;
- sfr ISP_CMD = 0xe5;
- sfr ISP_TRIG = 0xe6;
- sfr ISP_CONTR = 0xe7;
- void cc(uint addr);//擦除
- void xcx(uint addr,uchar dat);//寫字節
- uchar dcx(uint addr);//讀字節
- void Q0();//關閉ISP
-
- /*擦除一個扇區*/
- void cc(uint addr)
- {
- // 0x83(??<5M) 0x82(??<10M) 0x81(??<20M) 0x80(??<40M)
- ISP_CONTR = 0x83; // ?? IAP ??(ISPEN(ISP_CONTR.7)=1:??????Flash, ?? Flash ???????
- ISP_CMD = 0x03; // ?????"Data Flash/EEPROM?"??????
- ISP_ADDRL = addr; // ISP/IAP????????????,
- ISP_ADDRH = addr>>8; // ISP/IAP?????????????
- EA =0;
- ISP_TRIG = 0x46; // ?ISPEN(ISP_CONTR.7)=1?,?ISP_TRIG???46h,
- ISP_TRIG = 0xB9; // ???B9h,ISP/IAP???????
- _nop_();
- Q0(); // ??ISP/IAP
- }
- /*寫一個字節*/
- void xcx(uint addr,uchar dat)
- {
- ISP_CONTR = 0x83;
- ISP_CMD = 0x02; // ?????"Data Flash/EEPROM?"??????
- ISP_ADDRL = addr;
- ISP_ADDRH = addr>>8;
- ISP_DATA = dat; // ???ISP_DATA
- EA = 0;
- ISP_TRIG = 0x46;
- ISP_TRIG = 0xB9;
- _nop_();
- Q0(); // ??ISP/IAP
- }
- /*讀一個字節*/
- uchar dcx(uint addr)
- {
- uchar dat;
-
- ISP_CONTR = 0x83;
- ISP_CMD = 0x01; // ?????"Data Flash/EEPROM?"?????
- ISP_ADDRL = addr;
- ISP_ADDRH = addr>>8;
- EA = 0;
- ISP_TRIG = 0x46;
- ISP_TRIG = 0xB9;
- _nop_();
- dat = ISP_DATA; // ????
- Q0(); // ??ISP/IAP
- return dat;
- }
- /*關閉ISP操作*/
- void Q0()
- {
- ISP_CONTR = 0; // ??IAP??
- ISP_CMD = 0; // ????,?ISP??
- ISP_TRIG = 0; // ??IAP??, ??ISP??????????
- }
- /***************************************************************************************************************/
- unsigned char code DuanMa[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};// 顯示段碼值0~9
- unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位碼
- unsigned char TempData[6]; //存儲顯示值的全局變量
- uchar Pressure_Flag;
- uchar Time_Flag;
- uchar Flash_Pressure_Flag;
- uchar Flash_Time_Flag;
- uchar Data_IIC,Pressure,Pressure2,Time,Time_Buffer,key_press_num,Key_Set_Num;
- uchar Flag_Str,Flag_Test,Flag_Bee,Flag_Count,Flag_Result,State_Red,State_Green,Flag_GetTime,Flag_Realy_1;
- int Time_500ms,Time_CountDown;
- void Display(unsigned char FirstBit,unsigned char Num);
- void Init_Timer0(void);
- void Init_Timer1(void);
- void DelayUs2x(unsigned char t);//微秒延時函數聲明
- void DelayMs(unsigned char t);//毫秒延時函數聲明
- // void ISR_INT0(void);
- /*------------------------------------------------
- 定時器初始化子程序
- ------------------------------------------------*/
- void Init_Timer1(void)
- {
- TMOD |= 0x10; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
- TH1=0x00; //給定初值,這里使用定時器最大值從0開始計數一直到65535溢出
- TL1=0x00;
- EA=1; //總中斷打開
- ET1=1; //定時器中斷打開
- TR1=1; //定時器開關打開
- }
- /*------------------------------------------------
- 顯示數據處理函數1
- ------------------------------------------------*/
- void Display_Data_Operation1(void)
- {
- TempData[0]=DuanMa[(Pressure2)/100];
- TempData[1]=DuanMa[((Pressure2)%100)/10];
- TempData[2]=DuanMa[((Pressure2)%100)%10];
- TempData[3]=DuanMa[Time/100];
- TempData[4]=DuanMa[(Time%100)/10];
- TempData[5]=DuanMa[(Time%100)%10];
- }
- /*------------------------------------------------
- 顯示數據處理函數2
- ------------------------------------------------*/
- void Display_Data_Operation2(void)
- {
- TempData[0]=DuanMa[Pressure/100];
- TempData[1]=DuanMa[(Pressure%100)/10];
- TempData[2]=DuanMa[(Pressure%100)%10];
- TempData[3]=0xff;
- TempData[4]=0xff;
- TempData[5]=0xff;
- }
- /*------------------------------------------------
- 顯示數據處理函數3
- ------------------------------------------------*/
- void Display_Data_Operation3(void)
- {
- TempData[0]=0xff;
- TempData[1]=0xff;
- TempData[2]=0xff;
- TempData[3]=DuanMa[Time/100];
- TempData[4]=DuanMa[(Time%100)/10];
- TempData[5]=DuanMa[(Time%100)%10];
- }
- /*------------------------------------------------
- 顯示數據處理函數4
- ------------------------------------------------*/
- void Display_Data_Operation4(void)
- {
- TempData[0]=DuanMa[Pressure/100];
- TempData[1]=DuanMa[(Pressure%100)/10];
- TempData[2]=DuanMa[(Pressure%100)%10];
- TempData[3]=DuanMa[Time/100];
- TempData[4]=DuanMa[(Time%100)/10];
- TempData[5]=DuanMa[(Time%100)%10];
- }
- /*------------------------------------------------
- 主函數
- ------------------------------------------------*/
- void main (void)
- {
- Flag_Str=0;
- Flag_Test=0;
- Pressure = dcx(0x2000);
- Time= dcx(0x2004);
- EA=1; //全局中斷開
- // EX0=1; //外部中斷0開
- // IT0=1; //0電平觸發 1邊沿觸發
- Realy_1=1;
- Realy_2=1;
- Init_Timer0();
- Init_Timer1();
- while (1)
- {
- Data_IIC=ReadADC(0);
- Pressure2=(Data_IIC-11)*113/255;
-
- if(!Key_Add && Pressure_Flag==1) //如果檢測到低電平,說明按鍵按下
- {
- DelayMs(10); //延時去抖,一般10-20ms
- if(!Key_Add&& Pressure_Flag==1) //再次確認按鍵是否按下,沒有按下則退出
- {
- while(!Key_Add&& Pressure_Flag==1)
- {
- key_press_num++;
- DelayMs(10); //10x100=1000ms=1s
- if(key_press_num==90) //大約1s
- {
- key_press_num=0; //如果達到長按鍵標準
- //則進入長按鍵動作
- while(!Key_Add && Pressure_Flag==1) //這里用于識別是否按
- //鍵還在按下,如果按
- //下執行相關動作,否則退出
- {
- // if(Vol<99) //加操作
- Pressure++;
- if(Pressure>Pre_Max)
- {
- Pressure=Pre_Min;
- }
- DelayMs(80);//用于調節長按循環操作
- //的速度,可以自行調整此值以便達到最佳效果
- }
- }
- }
- key_press_num=0;//防止累加造成錯誤識別
- Pressure++;
- if(Pressure>Pre_Max)
- {
- Pressure=Pre_Min;
- }
- }
- }
- if(!Key_Dec && Pressure_Flag==1) //如果檢測到低電平,說明按鍵按下
- {
- DelayMs(10); //延時去抖,一般10-20ms
- if(!Key_Dec && Pressure_Flag==1) //再次確認按鍵是否按下,沒有
- //按下則退出
- {
- while(!Key_Dec && Pressure_Flag==1)
- {
- key_press_num++;
- DelayMs(10);
- if(key_press_num==100) //大約1s
- {
- key_press_num=0;
- while(!Key_Dec && Pressure_Flag==1)
- {
- if(Pressure>Pre_Min) //減操作
- Pressure--;
- DelayMs(80);
- //用于調節長按循環操作的速度
- }
- }
- }
- key_press_num=0;//防止累加造成錯誤識別
- if(Pressure>Pre_Min) //減操作
- Pressure--;
- }
- }
- if(!Key_Add && Time_Flag==1) //如果檢測到低電平,說明按鍵按下
- {
- DelayMs(10); //延時去抖,一般10-20ms
- if(!Key_Add && Time_Flag==1) //再次確認按鍵是否按下,沒有按下則退出
- {
- while(!Key_Add && Time_Flag==1)
- {
- key_press_num++;
- DelayMs(10); //10x100=1
- if(key_press_num==100) //大約1s
- {
- key_press_num=0; //如果達到長按鍵標準
- //則進入長按鍵動作
- while(!Key_Add && Time_Flag==1) //這里用于識別是否按
- //鍵還在按下,如果按
- //下執行相關動作,否則退出
- {
- Time++;
- if(Time>600)
- {
- Time=0;
- }
- DelayMs(50);//用于調節長按循環操作
- //的速度,可以自行調整此值以便達到最佳效果
- }
- }
- }
- key_press_num=0;//防止累加造成錯誤識別
- Time++;
- if(Time>600)
- {
- Time=0;
- }
- }
- }
- if(!Key_Dec && Time_Flag==1) //如果檢測到低電平,說明按鍵按下
- {
- DelayMs(10); //延時去抖,一般10-20ms
- if(!Key_Dec && Time_Flag==1) //再次確認按鍵是否按下,沒有
- //按下則退出
- {
- while(!Key_Dec && Time_Flag==1)
- {
- key_press_num++;
- DelayMs(10);
- if(key_press_num==100) //大約1s
- {
- key_press_num=0;
- while(!Key_Dec && Time_Flag==1)
- {
- if(Time>0) //減操作
- Time--;
- DelayMs(50);
- //用于調節長按循環操作的速度
- }
- }
- }
- key_press_num=0;//防止累加造成錯誤識別
- if(Time>0) //減操作
- Time--;
- }
- }
- /*------------------------------------------------
- 按設置鍵,保存數據,循環設置參數
- ------------------------------------------------*/
-
- if((!Key_Set) &&(Flag_Count==0) && (Flag_Str==0)&&(Flag_Bee==0)&& (State_Red==0) && (State_Green==0) ) //如果檢測到低電平,說明按鍵按下,并且啟動標志為零
- {
- DelayMs(10); //延時去抖,一般10-20ms
- if((!Key_Set) &&(Flag_Count==0)&& (Flag_Str==0)&&(Flag_Bee==0)&& (State_Red==0)&& (State_Green==0)) //再次確認按鍵是否按下,并且啟動標志為零,沒有按下則退出
- {
- while((!Key_Set)&&(Flag_Count==0)&& (Flag_Str==0)&&(Flag_Bee==0)&& (State_Red==0)&& (State_Green==0));//如果確認按下按鍵等待按鍵釋放,沒有釋放則一直等待
- {
- Key_Set_Num++;
- if(Key_Set_Num>2)
- {
- Key_Set_Num=0;
- }
- // EX0=1;
- // IT0=1;
- cc(0x2000);
- xcx(0x2000,Pressure); // ?EEPROM?2002h??2
- xcx(0x2004,Time);
- EA = 1;
- }
- }
- }
- /*------------------------------------------------
- 設置時的三種循環狀態
- ------------------------------------------------*/
- if(Key_Set_Num==0)
- {
- Pressure_Flag=0;
- Time_Flag=0;
- Flash_Pressure_Flag=0;
- Flash_Time_Flag=0;
- }
-
- if(Key_Set_Num==1)
- {
- Pressure_Flag=1;
- Time_Flag=0;
- Flash_Pressure_Flag=1;
- Flash_Time_Flag=0;
- }
-
- if(Key_Set_Num==2)
- {
- Pressure_Flag=0;
- Time_Flag=1;
- Flash_Pressure_Flag=0;
- Flash_Time_Flag=1;
- }
- /*------------------------------------------------
- 按下啟動且啟動標志置0,不合格狀態置0,則啟動氣泵,并把啟動標志置1
- ------------------------------------------------*/
- if( (!Key_Str) && (Flag_Str==0) &&(State_Red==0) &&(Flag_Count==0)) //如果檢測到低電平,說明按鍵按下,并且啟動標志為零
- {
- DelayMs(10); //延時去抖,一般10-20ms
- if((!Key_Str) && (Flag_Str==0) &&(State_Red==0) &&(Flag_Count==0) ) //再次確認按鍵是否按下,并且啟動標志為零,沒有按下則退出
- {
- while((!Key_Str)&& (Flag_Str==0) &&(State_Red==0)&&(Flag_Count==0) )//如果確認按下按鍵等待按鍵釋放,沒有釋放則一直等待
- {
- Flag_Realy_1=1;
- Flag_Str=1;
- }
- }
- }
- if((Pressure2<Pressure)&&(Flag_Realy_1==1))
- {
- Realy_1=0;
- }
-
-
- /*------------------------------------------------
- 同時按下 加 減 ,清除報警狀態
- ------------------------------------------------*/
- if( (!Key_Add) &&(!Key_Dec) ) //如果檢測到低電平,說明按鍵按下,并且啟動標志為零
- {
- DelayMs(10); //延時去抖,一般10-20ms
- if( (!Key_Add) &&(!Key_Dec) ) //再次確認按鍵是否按下,并且啟動標志為零,沒有按下則退出
- {
- while( (!Key_Add) &&(!Key_Dec) )//如果確認按下按鍵等待按鍵釋放,沒有釋放則一直等待
- {
- Led_Red=1;
- Bee=1;
- State_Red=0;
- Flag_Count=0;
- Time=Time_Buffer;
- Realy_1=1;
- }
- }
- }
-
- /*------------------------------------------------
- 如果實時壓力 > 設定壓力 ,且啟動標志置1,那么,關閉氣泵,把時間放入緩存
- ------------------------------------------------*/
- if( (Pressure2>(Pressure))&&(Flag_Str==1)&&(Flag_Realy_1==1) )
- {
- Realy_1=1;
- Flag_Realy_1=0;
- Time_Buffer=Time;
- Flag_Bee=1;//充氣完成的聲音提醒
- Flag_Test=1;//檢測開始的標志
- Flag_Str=0; //啟動標志置0
- }
-
-
- if(Flag_Bee==1)//聲音提醒
- {
- Bee=0;
- DelayMs(500);
- DelayMs(500);
- Bee=1;
- Flag_Bee=0;
- }
-
- if(Flag_Test==1)//開始檢測
- {
- Time=0;//初始化時間
- Time_CountDown=0;
- Flag_GetTime=1;
- Flag_Test=0;
- Flag_Count=1;
- }
- if(Flag_Count==1)//計數標志置1,時間開始從0計數到設定值
- {
- Time=Time_CountDown/2;
- }
- if((Time==Time_Buffer)&&(Flag_GetTime==1))//計時完成,結果標志置1
- {
- Flag_Count=0;
- Flag_Result=1;
- Flag_GetTime=0;
- }
- /*------------------------------------------------
- 經過一段時間后,如果壓力小了,說明不合格,亮紅燈,蜂鳴器長響,不合格標志置1
- ------------------------------------------------*/
-
- if((Flag_Count==1) &&(Pressure2*10 < Pressure*8) )
- {
- Flag_Result=0;
- Led_Red=0;
- Bee=0;
- State_Red=1;
- }
-
-
-
-
-
-
- /*------------------------------------------------
- 經過一段時間后,如果壓力沒減小,說明合格,合格標志置1
- ------------------------------------------------*/
- if((Flag_Result==1) &&(Pressure2*10 > Pressure*9) )
- {
- State_Green=1;
- }
- /*------------------------------------------------
- 合格標志置1后,且結果標志置1,則發出合格提示
- ------------------------------------------------*/
- if((State_Green==1) && (Flag_Result==1))
- {
- Led_Green=0;
- Realy_2=0;
- Bee=0;
- DelayMs(500); //第一響
- Bee=1;
- DelayMs(300);
- Bee=0; //第二響
- DelayMs(500); //第二響
- Bee=1;
- Led_Green=1;
- DelayMs(500);
- Realy_2=1;
- Flag_Result=0;
- State_Green=0;
- Time=Time_Buffer;
- }
-
- }
- }
- /*------------------------------------------------
- 讀AD轉值程序
- 輸入參數 Chl 表示需要轉換的通道,范圍從0-3
- 返回值范圍0-255
- ------------------------------------------------*/
- unsigned char ReadADC(unsigned char Chl)
- {
- unsigned char Val;
- Start_I2c(); //啟動總線
- SendByte(AddWr); //發送器件地址
- if(ack==0)return(0);
- SendByte(0x40|Chl); //發送器件子地址
- if(ack==0)return(0);
- Start_I2c();
- SendByte(AddWr+1);
- if(ack==0)return(0);
- Val=RcvByte();
- NoAck_I2c(); //發送非應位
- Stop_I2c(); //結束總線
- return(Val);
- }
-
-
-
-
- /*------------------------------------------------
- us延時函數
- 含有輸入參數 unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
- 長度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延時函數
- 含有輸入參數 unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延時1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- /*數碼管顯示函數*/
- void Display(unsigned char FirstBit,unsigned char Lenth)
- {
- static unsigned char i=0;
- DataPort2_DuanMa=0; //清空段碼數據,防止重影
- DataPort1_WeiMa=WeiMa[i+FirstBit]; //取位碼
- DataPort2_DuanMa=TempData[i]; //取顯示數據,段碼
- i++;
- if(i==Lenth)
- i=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
測漏儀工程.rar
(674.25 KB, 下載次數: 53)
2019-5-20 11:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|