求大神帮助
设计一个智能金属探测仪系统,测量到金属时,蜂鸣器响指示灯闪
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- #include "LCD1602.h"
- #include "STCEEPROM.h"
- #define uchar unsigned char
- #define uint unsigned int
- bit flag; //定义标志位,确定是否到了1s
- unsigned long x,x1;
- uchar T0count; //从T0的计数单元中读取计数的数值
- uchar timecount;
- sbit LED = P2^0;//LED引脚定义
- sbit Speak = P1^5;//蜂鸣器引脚定义
- sbit KEY1 = P1^3;//按键1
- sbit KEY2 = P1^4;//按键2
- void Timer(void);
- //延时函数
- void Delay_ms(uint jj)
- {
- uint ii;
- while(jj--)
- for(ii=0;ii<125;ii++);
- }
- void main() //函数功能:主函数
- {
- 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; //关闭LED和蜂鸣器
- Speak = 1;
- EA=0;
- a_a=ISP_READ(0x2cc0);
- if(a_a != 2) //新的单片机初始单片机内问eeprom
- {
- x1=100*100+150000;
- a_a = 2;
- ISP_ERASE(0x2cc0); //注意:字节编程时必须要先要擦除整个扇区
- ISP_PROGRAM(0x2cc0, a_a);
- ISP_ERASE(0x2c00); //注意:字节编程时必须要先要擦除整个扇区
- ISP_PROGRAM(0x2c00, (x1-150000)/100);
- }
- x1=ISP_READ(0x2c00)*100+150000;//预设阈值为(100*100+130000)160000KHz
- //x1=70000;
- EA=1;
- while(1)
- {
-
- if(flag==1)
- {
- flag=0; //清标志位
- if(KEY1&&KEY2)
- x=T0count*65536+TL0*256+TH0; //取得时间宽度参数
- timecount=0;
- T0count=0;
- TH0=1;
- TL0=0;
- TR0=1; //TR0=1,控制开关闭合,计数脉冲进入T1计数器,启动计数
-
- }
- 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); //注意:字节编程时必须要先要擦除整个扇区
- ISP_PROGRAM(0x2c00, (x1-150000)/100);
- EA=1;
- }
- }
- if(!KEY2)
- {
- Delay_ms(100);
- if(!KEY2)
- {
- x1=x1-1000;//阈值减1000
- EA=0;
- ISP_ERASE(0x2c00); //注意:字节编程时必须要先要擦除整个扇区
- 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)//判断,发现金属
- {
- LED = 0; //打开LED和蜂鸣器
- Speak = 0;
- Delay_ms(200);
- LED = 1; //关闭LED和蜂鸣器
- Speak = 1;
- }
-
- }
-
- }
- void t0() interrupt 1 using 0 //T0中断服务
- {
- T0count++; //对P3。4口的脉冲进行计数
- }
- void t1(void) interrupt 3 using 0 //T1中断服务
- {
- TH1=(65536-3689)/256; //计数初值重装载
- TL1=(65536-3689)%256;
- timecount++;
- if(timecount==2490)
- { TR0=0;
- timecount=0;
- flag=1; // 置标志
- }
- }
- void Timer(void)
- {
- TMOD=0x15; //T0工作为16位计数器(方式1),T1工作方式为16位定时器
- TH0=0; //计数为65536
- TL0=0; //
- TH1=(65536-4000)/256; //定时器采用定时4ms. 初值为4000
- TL1=(65536-4000)%256;
- TR1=1; //TR1=1,控制开关闭合,计数脉冲进入T1计数器,启动定时
- TR0=1; //TR0=1,控制开关闭合,计数脉冲进入T1计数器,启动计数
- ET0=1; //定时器0开中断 必须关闭!!!!
- ET1=1; //定时器1开中断
- EA=1; //CPU开中断
- }
复制代码
现在无法仿真,求帮助
金属探测器.zip
(105.2 KB, 下载次数: 89)
|