找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3611|回复: 4
收起左侧

求帮助 51单片机的金属探测Proteus仿真程序有问题

[复制链接]
ID:587714 发表于 2019-7-28 15:34 | 显示全部楼层 |阅读模式
求大神帮助
设计一个智能金属探测仪系统,测量到金属时,蜂鸣器响指示灯闪
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #include "LCD1602.h"
  3. #include "STCEEPROM.h"
  4. #define uchar unsigned char
  5. #define uint  unsigned int

  6. bit flag;             //定义标志位,确定是否到了1s
  7. unsigned long x,x1;  
  8. uchar T0count;        //从T0的计数单元中读取计数的数值
  9. uchar timecount;  

  10. sbit LED   = P2^0;//LED引脚定义
  11. sbit Speak = P1^5;//蜂鸣器引脚定义

  12. sbit KEY1 = P1^3;//按键1
  13. sbit KEY2 = P1^4;//按键2

  14. void Timer(void);

  15. //延时函数
  16. void Delay_ms(uint jj)
  17. {
  18.         uint ii;
  19.         while(jj--)
  20.                 for(ii=0;ii<125;ii++);
  21. }
  22. void main()           //函数功能:主函数
  23. {         
  24.         unsigned char  Data[5],Data2[5];
  25.         unsigned char  a_a;
  26.   
  27.         Timer(); //定时器初始化
  28.     LCD1602_init();//液晶初始化
  29. //////////////////////////0123456789ABCDEF
  30.     LCD1602_Disp_ZF(0x80,"NowFreq:     KHz",16);
  31.     LCD1602_Disp_ZF(0x80+0X40,"SetFreq:     KHz",16);
  32.     LED = 1; //关闭LED和蜂鸣器
  33.     Speak = 1;
  34.         EA=0;        
  35.         a_a=ISP_READ(0x2cc0);
  36.         if(a_a != 2)                //新的单片机初始单片机内问eeprom
  37.         {
  38.                 x1=100*100+150000;
  39.                 a_a = 2;
  40.                         ISP_ERASE(0x2cc0);                //注意:字节编程时必须要先要擦除整个扇区        
  41.                         ISP_PROGRAM(0x2cc0, a_a);
  42.                         ISP_ERASE(0x2c00);                //注意:字节编程时必须要先要擦除整个扇区        
  43.                         ISP_PROGRAM(0x2c00, (x1-150000)/100);
  44.         }        
  45.         x1=ISP_READ(0x2c00)*100+150000;//预设阈值为(100*100+130000)160000KHz
  46.         //x1=70000;
  47.         EA=1;
  48.         while(1)
  49.         {
  50.         
  51.                 if(flag==1)                  
  52.                 {
  53.                         flag=0;                        //清标志位
  54.                         if(KEY1&&KEY2)
  55.                                 x=T0count*65536+TL0*256+TH0;   //取得时间宽度参数      
  56.                         timecount=0;
  57.                         T0count=0;
  58.                         TH0=1;
  59.                         TL0=0;
  60.                         TR0=1;         //TR0=1,控制开关闭合,计数脉冲进入T1计数器,启动计数
  61.                         
  62.                 }

  63.                 Data[0]='0'+x/100000;
  64.                 Data[1]='0'+(x/10000)%10;
  65.                 Data[2]='0'+(x/1000)%10;     
  66.         Data[3]='.';
  67.                 Data[4]='0'+(x/100)%10;     
  68.                 LCD1602_Disp_ZF(0x88,Data,5);            //频率

  69.                 if(!KEY1)
  70.                 {
  71.                         Delay_ms(100);
  72.                         if(!KEY1)
  73.                         {
  74.                         x1=x1+1000;//阈值加1000
  75.                         EA=0;
  76.                         ISP_ERASE(0x2c00);                //注意:字节编程时必须要先要擦除整个扇区        
  77.                         ISP_PROGRAM(0x2c00, (x1-150000)/100);
  78.                         EA=1;
  79.                         }

  80.                 }
  81.                 if(!KEY2)
  82.                 {
  83.                         Delay_ms(100);
  84.                         if(!KEY2)
  85.                         {
  86.                         x1=x1-1000;//阈值减1000
  87.                         EA=0;
  88.                         ISP_ERASE(0x2c00);                //注意:字节编程时必须要先要擦除整个扇区        
  89.                         ISP_PROGRAM(0x2c00, (x1-150000)/100);
  90.                         EA=1;
  91.                         }
  92.                 }
  93.                 Data2[0]='0'+x1/100000;
  94.                 Data2[1]='0'+(x1/10000)%10;
  95.                 Data2[2]='0'+(x1/1000)%10;     
  96.         Data2[3]='.';
  97.                 Data2[4]='0'+(x1/100)%10;     
  98.                 LCD1602_Disp_ZF(0x88+0x40,Data2,5);            //阈值频率
  99.         
  100.         if(x>x1)//判断,发现金属
  101.                 {
  102.                         LED = 0; //打开LED和蜂鸣器
  103.                         Speak = 0;
  104.             Delay_ms(200);
  105.                         LED = 1; //关闭LED和蜂鸣器
  106.                         Speak = 1;
  107.                 }
  108.    
  109.         }
  110.             
  111.   }


  112. void t0() interrupt 1 using 0      //T0中断服务
  113. {  
  114. T0count++;                      //对P3。4口的脉冲进行计数
  115. }

  116. void t1(void) interrupt 3 using 0       //T1中断服务
  117. {   
  118. TH1=(65536-3689)/256;               //计数初值重装载
  119.     TL1=(65536-3689)%256;
  120.     timecount++;

  121.     if(timecount==2490)
  122.     {  TR0=0;
  123.         timecount=0;
  124.         flag=1;                       // 置标志
  125.     }  
  126. }

  127. void Timer(void)
  128. {
  129.     TMOD=0x15;       //T0工作为16位计数器(方式1),T1工作方式为16位定时器
  130.     TH0=0;                     //计数为65536                     
  131.     TL0=0;                     //
  132.     TH1=(65536-4000)/256;     //定时器采用定时4ms. 初值为4000
  133.     TL1=(65536-4000)%256;
  134.     TR1=1;   //TR1=1,控制开关闭合,计数脉冲进入T1计数器,启动定时
  135.     TR0=1;   //TR0=1,控制开关闭合,计数脉冲进入T1计数器,启动计数
  136.     ET0=1;                    //定时器0开中断 必须关闭!!!!
  137.     ET1=1;                    //定时器1开中断
  138.     EA=1;                     //CPU开中断

  139. }
复制代码
0.png
现在无法仿真,求帮助
金属探测器.zip (105.2 KB, 下载次数: 84)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:598766 发表于 2019-8-10 11:37 | 显示全部楼层
能 不能解释下原理呢。小白求解。
回复

使用道具 举报

ID:687791 发表于 2020-1-27 14:45 | 显示全部楼层
不行,缺少元件库
回复

使用道具 举报

ID:321150 发表于 2020-2-25 09:28 | 显示全部楼层
垃圾,不能显示,没用
回复

使用道具 举报

ID:543059 发表于 2021-3-6 18:38 | 显示全部楼层
我会一直卡死在中断里
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表