|
求大神幫助
設(shè)計一個智能金屬探測儀系統(tǒng),測量到金屬時,蜂鳴器響指示燈閃
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (16.49 KB, 下載次數(shù): 59)
下載附件
2019-7-28 19:17 上傳
0.png (4.84 KB, 下載次數(shù): 56)
下載附件
2019-7-28 19:17 上傳
單片機(jī)源程序如下:
- #include<reg52.h>
- #include "LCD1602.h"
- #include "STCEEPROM.h"
- #define uchar unsigned char
- #define uint unsigned int
- bit flag; //定義標(biāo)志位,確定是否到了1s
- unsigned long x,x1;
- uchar T0count; //從T0的計數(shù)單元中讀取計數(shù)的數(shù)值
- uchar timecount;
- sbit LED = P2^0;//LED引腳定義
- sbit Speak = P1^5;//蜂鳴器引腳定義
- sbit KEY1 = P1^3;//按鍵1
- sbit KEY2 = P1^4;//按鍵2
- void Timer(void);
- //延時函數(shù)
- void Delay_ms(uint jj)
- {
- uint ii;
- while(jj--)
- for(ii=0;ii<125;ii++);
- }
- void main() //函數(shù)功能:主函數(shù)
- {
- unsigned char Data[5],Data2[5];
- unsigned char a_a;
-
- Timer(); //定時器初始化
- LCD1602_init();//液晶初始化
- //////////////////////////0123456789ABCDEF
- LCD1602_Disp_ZF(0x80,"NowFreq: KHz",16);
- LCD1602_Disp_ZF(0x80+0X40,"SetFreq: KHz",16);
- LED = 1; //關(guān)閉LED和蜂鳴器
- Speak = 1;
- EA=0;
- a_a=ISP_READ(0x2cc0);
- if(a_a != 2) //新的單片機(jī)初始單片機(jī)內(nèi)問eeprom
- {
- x1=100*100+150000;
- a_a = 2;
- ISP_ERASE(0x2cc0); //注意:字節(jié)編程時必須要先要擦除整個扇區(qū)
- ISP_PROGRAM(0x2cc0, a_a);
- ISP_ERASE(0x2c00); //注意:字節(jié)編程時必須要先要擦除整個扇區(qū)
- ISP_PROGRAM(0x2c00, (x1-150000)/100);
- }
- x1=ISP_READ(0x2c00)*100+150000;//預(yù)設(shè)閾值為(100*100+130000)160000KHz
- //x1=70000;
- EA=1;
- while(1)
- {
-
- if(flag==1)
- {
- flag=0; //清標(biāo)志位
- if(KEY1&&KEY2)
- x=T0count*65536+TL0*256+TH0; //取得時間寬度參數(shù)
- timecount=0;
- T0count=0;
- TH0=1;
- TL0=0;
- TR0=1; //TR0=1,控制開關(guān)閉合,計數(shù)脈沖進(jìn)入T1計數(shù)器,啟動計數(shù)
-
- }
- Data[0]='0'+x/100000;
- Data[1]='0'+(x/10000)%10;
- Data[2]='0'+(x/1000)%10;
- Data[3]='.';
- Data[4]='0'+(x/100)%10;
- LCD1602_Disp_ZF(0x88,Data,5); //頻率
- if(!KEY1)
- {
- Delay_ms(100);
- if(!KEY1)
- {
- x1=x1+1000;//閾值加1000
- EA=0;
- ISP_ERASE(0x2c00); //注意:字節(jié)編程時必須要先要擦除整個扇區(qū)
- ISP_PROGRAM(0x2c00, (x1-150000)/100);
- EA=1;
- }
- }
- if(!KEY2)
- {
- Delay_ms(100);
- if(!KEY2)
- {
- x1=x1-1000;//閾值減1000
- EA=0;
- ISP_ERASE(0x2c00); //注意:字節(jié)編程時必須要先要擦除整個扇區(qū)
- ISP_PROGRAM(0x2c00, (x1-150000)/100);
- EA=1;
- }
- }
- Data2[0]='0'+x1/100000;
- Data2[1]='0'+(x1/10000)%10;
- Data2[2]='0'+(x1/1000)%10;
- Data2[3]='.';
- Data2[4]='0'+(x1/100)%10;
- LCD1602_Disp_ZF(0x88+0x40,Data2,5); //閾值頻率
-
- if(x>x1)//判斷,發(fā)現(xiàn)金屬
- {
- LED = 0; //打開LED和蜂鳴器
- Speak = 0;
- Delay_ms(200);
- LED = 1; //關(guān)閉LED和蜂鳴器
- Speak = 1;
- }
-
- }
-
- }
- void t0() interrupt 1 using 0 //T0中斷服務(wù)
- {
- T0count++; //對P3。4口的脈沖進(jìn)行計數(shù)
- }
- void t1(void) interrupt 3 using 0 //T1中斷服務(wù)
- {
- TH1=(65536-3689)/256; //計數(shù)初值重裝載
- TL1=(65536-3689)%256;
- timecount++;
- if(timecount==2490)
- { TR0=0;
- timecount=0;
- flag=1; // 置標(biāo)志
- }
- }
- void Timer(void)
- {
- TMOD=0x15; //T0工作為16位計數(shù)器(方式1),T1工作方式為16位定時器
- TH0=0; //計數(shù)為65536
- TL0=0; //
- TH1=(65536-4000)/256; //定時器采用定時4ms. 初值為4000
- TL1=(65536-4000)%256;
- TR1=1; //TR1=1,控制開關(guān)閉合,計數(shù)脈沖進(jìn)入T1計數(shù)器,啟動定時
- TR0=1; //TR0=1,控制開關(guān)閉合,計數(shù)脈沖進(jìn)入T1計數(shù)器,啟動計數(shù)
- ET0=1; //定時器0開中斷 必須關(guān)閉。。!
- ET1=1; //定時器1開中斷
- EA=1; //CPU開中斷
- }
復(fù)制代碼
0.png (9.93 KB, 下載次數(shù): 54)
下載附件
2019-7-28 19:18 上傳
現(xiàn)在無法仿真,求幫助
金屬探測器.zip
(105.2 KB, 下載次數(shù): 89)
2019-7-28 15:34 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|