找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4705|回复: 13
收起左侧

基于51单片机超声波水位液位控制系统程序仿真PCB原理图资料 LCD1602显示

  [复制链接]
ID:449323 发表于 2021-1-10 19:27 | 显示全部楼层 |阅读模式
大学四年,最后一个实训,还挺好玩,水泵抽水的快乐,也比较小儿科,很遗憾要暂时告别实训室好好复习准备二战了,还是很喜欢实验室里面奇奇怪怪的波形,每一次都让我惊叹不已,今年找工作期间发现行业女性歧视很严重,我去面试的几家公司里,都说了相似的话,你的简历没什么问题,但是这个行业要面临加班什么的,说女孩子结了婚就不干这行了,有时候也质疑过自我,但是还是坚定想从电子行业发展,希望还有机会在电子行业走下去吧,发个牢骚。
基于51单片机超声波水位液位控制系统LCD1602资料中,我是用水泵抽水,加了一个继电器电路,继电器电路的PCB没有放进去,但是原理图的图片我放进去了,大家自己画一个小模块,我当时拍的视频我也放进去了,方便大家调试,有什么疑问再问吧,希望我还会上黑电子论坛,感谢四年陪伴,致敬电子行业领路人!

制作出来的实物图如下:
11.jpg

水泵驱动电路:
51hei.png 51hei.png

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png 51hei.png
51hei.png

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #include "LCD1602.h"
  4. #include "STCEEPROM.h"
  5. sbit  RX = P3^6;  //定义超声波端口
  6. sbit  TX = P3^7;

  7. sbit LED = P2^0;  //LED
  8. sbit SPEAK = P2^1; //蜂鸣器
  9. sbit Motor = P2^2; //水泵

  10. sbit KEY1 = P1^3;  //设置按键
  11. sbit KEY2 = P1^4;  //加按键
  12. sbit KEY3 = P1^5;  //减按键

  13. unsigned int  time=0;//计时变量
  14. unsigned int  timer=0;//计时变量
  15. unsigned int S=0;//当前值
  16. unsigned int SET_H=100,SET_L=10;//最高值和最低值
  17. bit  flag =0; //测量标志位
  18. unsigned char Table[3],Table1[5];//显示数组
  19. unsigned char KEY_flag=0; //按键选择标志
  20. //延时函数
  21. void Delay_ms(int jj)  //延时函数
  22. {
  23.         int ii;        //延时变量
  24.         while(jj--)//延时n毫秒
  25.                 for(ii=0;ii<116;ii++);//延时1毫秒
  26. }
  27. void Conut(void)         //测量函数
  28.         {
  29.          time=TH0*256+TL0;         //距离计数
  30.          TH0=0;         //定时器清零
  31.          TL0=0;         //定时器清零
  32.        
  33.          S=(time*1.87)/10;     //算出来是CM、转换
  34.          if((S>=700)||flag==1) //超出测量范围显示“-”
  35.          {         
  36.           flag=0; //数据无效标志
  37.          }
  38.          else
  39.          {
  40.           Table1[0]= S/1000+0X30;        //显示当前值
  41.           Table1[1]= S/100%10+0X30;        //显示当前值
  42.           Table1[2]= S/10/10+0X30;        //显示当前值
  43.           Table1[3]= '.';                        //显示当前值
  44.           Table1[4]= S%10+0X30;           //显示当前值
  45.           LCD1602_Disp_ZF(0x88,Table1,5); //显示当前值
  46.         }
  47. }
  48. void main(void)        //主函数
  49. {
  50.     LCD1602_init();//液晶初始化
  51.         //////////////////////0123456789ABCDEF
  52.     LCD1602_Disp_ZF(0x80,"  Now S:     CM ",16);
  53.                                                      //0123456789ABCDEF
  54.     LCD1602_Disp_ZF(0x80+0X40,"Set H:    L:    ",16);
  55.         TMOD=0x11;                   //设T0为方式1,GATE=1;
  56.         TH0=0;                           //定时器清零
  57.         TL0=0;             //定时器清零
  58.         TH1=0xf8;                   //2MS定时
  59.         TL1=0x30;                   //2MS定时
  60.         ET0=1;             //允许T0中断
  61.         ET1=1;                           //允许T1中断
  62.         TR1=1;                           //开启定时器
  63.         EA=1;                           //开启总中断
  64.         EA=0;//关闭中断
  65.         SET_H = ISP_READ(0x2c00)*256+ISP_READ(0x2c01);//读取存储的最大值
  66.         SET_L = ISP_READ(0x2c02)*256+ISP_READ(0x2c03);//读取存储的最小值
  67.         EA=1; //开启总中断
  68.         while(1)//函数循环
  69.         {
  70.                 while(!RX);                    //当RX为零时等待
  71.                 TR0=1;                            //开启计数
  72.                 while(RX);                        //当RX为1计数并等待
  73.                 TR0=0;                                //关闭计数
  74.                 Conut();  //计算显示距离函数
  75.                 /////////////////////////////////////
  76.                 if((S/10>SET_H)||(S/10>SET_H)) //水位过低过高报警,
  77.                 {
  78.                         LED=0;SPEAK=0; //报警
  79.                 }
  80.                 else
  81.                 {
  82.                         LED=1;SPEAK=1; //不报警
  83.                 }
  84.                 ////////////////////////////////
  85.                 if((S/10>SET_H)) //水位过低打开水泵
  86.                 {
  87.                         Motor; //打开
  88.                 }
  89.                 else
  90.                 {
  91.                         LED=1;SPEAK=1; //关闭
  92.                 }       
  93.                 if(!KEY1) //切换设置最大值和最小值
  94.                 {
  95.                         Delay_ms(10);//延时去抖动
  96.                         if(!KEY1)//切换设置最大值和最小值
  97.                         {
  98.                                 KEY_flag++;        //模式选择
  99.                                 ISP_ERASE(0x2c00);                //注意:字节编程时必须要先要擦除整个扇区       
  100.                                 ISP_PROGRAM(0x2c00, SET_H/256);        //记忆存储
  101.                                 ISP_PROGRAM(0x2c01, SET_H);//记忆存储
  102.                                 ISP_PROGRAM(0x2c02, SET_L/256);//记忆存储
  103.                                 ISP_PROGRAM(0x2c03, SET_L);        //记忆存储
  104.                         }
  105.                         while(!KEY1);//等待按键抬起
  106.                 }
  107.                 if(!KEY2)//设置加
  108.                 {
  109.                         Delay_ms(10);//延时去抖动
  110.                         if(!KEY2) //设置加
  111.                         {
  112.                                 if(KEY_flag%2==0)SET_H++; //设置加
  113.                                 if(KEY_flag%2==1)SET_L++; //设置加
  114.                         }
  115.                 }
  116.                 if(!KEY3) //设置减
  117.                 {
  118.                         Delay_ms(10);//延时去抖动
  119.                         if(!KEY3) //设置减
  120.                         {
  121.                                 if(KEY_flag%2==0)SET_H--; //设置减
  122.                                 if(KEY_flag%2==1)SET_L--;//设置减
  123.                         }
  124.                 }
  125.           Table[0]= SET_H/100+0X30;//显示最大值
  126.           Table[1]= SET_H%100/10+0X30;
  127.           Table[2]= SET_H%10+0X30;
  128.           LCD1602_Disp_ZF(0x86+0x40,Table,3);
  129.           Table[0]= SET_L/100+0X30;         //显示最小值
  130.           Table[1]= SET_L%100/10+0X30;
  131.           Table[2]= SET_L%10+0X30;
  132.           LCD1602_Disp_ZF(0x8C+0x40,Table,3);
  133.         }
  134. }

  135. /********************************************************/
  136.      void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  137.   {
  138.     flag=1;                                                         //中断溢出标志
  139.   }
  140. /********************************************************/
  141.    void  zd3()  interrupt 3        
  142.   {
  143.          TH1=0xf8;//2毫秒定时初始化
  144.          TL1=0x30;//2毫秒定时初始化
  145.          timer++;//计数
  146.          if(timer>=100)//计数100次,200毫秒
  147.          {
  148.           timer=0;
  149.           TX=1;                                        //200MS  启动一次模块
  150.           _nop_(); _nop_(); _nop_();
  151.           _nop_(); _nop_(); _nop_();
  152.           _nop_(); _nop_(); _nop_();
  153.           _nop_(); _nop_(); _nop_();
  154.           _nop_(); _nop_(); _nop_();
  155.           _nop_(); _nop_();_nop_();
  156.           _nop_(); _nop_(); _nop_();
  157.           TX=0;
  158.          }
  159.   }
复制代码
51hei.png
所有资料51hei提供下载:
基于51单片机超声波水位液位控制系统LCD1602资料.rar (10.42 MB, 下载次数: 239)

评分

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

查看全部评分

回复

使用道具 举报

ID:848824 发表于 2021-1-24 11:15 | 显示全部楼层
非常感谢,初学者的我测试成功
回复

使用道具 举报

ID:889626 发表于 2021-3-11 11:00 来自手机 | 显示全部楼层
protues仿真中超声波模块体现在哪里了
回复

使用道具 举报

ID:543424 发表于 2021-3-11 21:46 | 显示全部楼层
资料很好,可以学习参考一下
回复

使用道具 举报

ID:7485 发表于 2021-3-12 08:44 | 显示全部楼层
女生能搞到这个样挺好的!继续努力!
回复

使用道具 举报

ID:797416 发表于 2021-3-13 16:22 | 显示全部楼层
小姐姐要继续加油哦  我现在大二  好多人跟我说这个行业对待女性不好  所以我们要更加努力
回复

使用道具 举报

ID:822775 发表于 2021-10-14 10:49 | 显示全部楼层
能不能帮忙讲解一下那个水位探器怎么显示的水位,到现在很懵
回复

使用道具 举报

ID:822775 发表于 2021-10-14 12:15 | 显示全部楼层
主要是没明白你写的这个代码,哎,水位都咯不懂
回复

使用道具 举报

ID:449323 发表于 2021-10-15 09:00 | 显示全部楼层
ahshmj 发表于 2021-3-12 08:44
女生能搞到这个样挺好的!继续努力!

谢谢你,只可惜毕业之后还是老老实实在家准备考编,荒废四年所学了
回复

使用道具 举报

ID:449323 发表于 2021-10-15 09:05 | 显示全部楼层
hlncclb 发表于 2021-3-11 11:00
protues仿真中超声波模块体现在哪里了

轮子转速代替的,Protues里面没有超声比模块直接仿真,建议搭建好硬件进行调试
回复

使用道具 举报

ID:449323 发表于 2021-10-15 09:05 | 显示全部楼层
清北清北 发表于 2021-3-13 16:22
小姐姐要继续加油哦  我现在大二  好多人跟我说这个行业对待女性不好  所以我们要更加努力

你也好好加油哟
回复

使用道具 举报

ID:449323 发表于 2021-10-15 09:15 | 显示全部楼层
wl521520 发表于 2021-10-14 10:49
能不能帮忙讲解一下那个水位探器怎么显示的水位,到现在很懵

我个人理解的你这句话,我感觉我们做的不是一个东西,我说一下我的系统装置大概是这样的,预置好距离,超声波对准水桶里面的水,当超声波检测到距离时,按照预设值做出指令抽水,我们同学当时拍了抖Y视频,我把链接发给你,你可以去看一下整个系统的搭建。
回复

使用道具 举报

ID:449323 发表于 2021-10-15 09:16 | 显示全部楼层
wl521520 发表于 2021-10-14 10:49
能不能帮忙讲解一下那个水位探器怎么显示的水位,到现在很懵

去搜索下这个短视频:
实训的快乐大概就是,水泵抽水玩了三四次,玩得不亦乐乎
回复

使用道具 举报

ID:822775 发表于 2021-10-29 21:14 | 显示全部楼层
这个超声波检测距离是不是要对着水面,然后有一段距离,,然后探测的是水桶里面的距离
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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