找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6175|回复: 3
收起左侧

51单片机液位监控系统 proteus仿真及源程序

[复制链接]
ID:137190 发表于 2016-9-27 13:05 | 显示全部楼层 |阅读模式
给51黑电子论坛的坛友们分享一个51单片机做的液位监控系统的proteus仿真,下面是原理图:
0.png
按键:
0.png
液位监控系统程序流程图:
0.png
液位监控系统的部分源程序预览:
  1. #include <reg51.h>
  2. #include <DS18B20.h>
  3. #include <LCD1602.h>
  4. #include <TLC2543.h>

  5. #define        uchar        unsigned char
  6. #define uint        unsigned int

  7. sbit PWM=P2^4;                //电机PWM输出端口
  8. sbit SW=P2^5;                //电机正反转控制端口
  9. sbit K1=P3^0;                //功能设置按键
  10. sbit K2=P3^1;                //加按键
  11. sbit K3=P3^2;                //减按键

  12. uchar ratio=10;                //PWM占空比
  13. uchar count=0;                //PWM定时计数
  14. uchar func=0;                //系统功能,0当前状态,1上下限设置,2电机转速
  15. uchar high=150,low=50,height=0;
  16. uchar LCD_Buf1[16]={"W = 000.0m"};
  17. uchar LCD_Buf2[16]={"T = 000.0C"};
  18. uchar LCD_Buf3[16]={"H = 150.0m"};
  19. uchar LCD_Buf4[16]={"L = 050.0m"};
  20. uchar LCD_Buf5[16]={"Full = 384r/m"};
  21. uchar LCD_Buf6[16]={"Now  = 000r/m"};


  22. //------------------------------------------------------
  23. //显示温度及液位
  24. //------------------------------------------------------
  25. void Display_HT(void)
  26. {
  27.         uint volt,t;
  28.         //电压值显示数据处理
  29.         volt=TLC2543(0)*50.0/4095*102.3/2.5;
  30.         LCD_Buf1[4]=volt/1000+'0';
  31.         LCD_Buf1[5]=volt/100%10+'0';
  32.         LCD_Buf1[6]=volt/10%10+'0';
  33.         LCD_Buf1[8]=volt%10+'0';
  34.         //温度值显示数据处理
  35.         t=ReadTemperature();
  36.         LCD_Buf2[4]=t/1000+'0';
  37.         LCD_Buf2[5]=t/100%10+'0';
  38.         LCD_Buf2[6]=t/10%10+'0';
  39.         LCD_Buf2[8]=t%10+'0';

  40.         LCD_Buf2[15]='A';
  41.         //刷新LCD数据
  42.         LCD_Display_String(0,0,LCD_Buf1);
  43.         LCD_Display_String(0,1,LCD_Buf2);
  44. }

  45. //------------------------------------------------------
  46. //上限设置程序
  47. //------------------------------------------------------
  48. void High_Set()
  49. {
  50.         uint x;
  51.         if(K2==0)                                //加按键
  52.         {        Delay(10);
  53.                 if((K2==0)&&(high<102))
  54.                         high++;
  55.                 while(K2==0);
  56.         }
  57.         if(K3==0)                                //减按键
  58.         {        Delay(10);
  59.                 if((K3==0)&&(high>low))
  60.                         high--;
  61.                 while(K3==0);
  62.         }
  63.         //上限显示数据处理
  64.         x=high*10;
  65.         LCD_Buf3[4]=x/1000+'0';
  66.         LCD_Buf3[5]=x/100%10+'0';
  67.         LCD_Buf3[6]=x/10%10+'0';
  68.         LCD_Buf3[8]=x%10+'0';

  69.         LCD_Buf4[15]='B';
  70.         //刷新LCD数据
  71.         LCD_Display_String(0,0,LCD_Buf3);
  72.         LCD_Display_String(0,1,LCD_Buf4);
  73. }

  74. //------------------------------------------------------
  75. //下限设置程序
  76. //------------------------------------------------------
  77. void Low_Set()
  78. {
  79.         uint x;
  80.         if(K2==0)                                //加按键
  81.         {        Delay(10);
  82.                 if((K2==0)&&(low<high))
  83.                         low++;
  84.                 while(K2==0);
  85.         }
  86.         if(K3==0)                                //减按键
  87.         {        Delay(10);
  88.                 if((K3==0)&&(low>1))
  89.                         low--;
  90.                 while(K3==0);
  91.         }
  92.         //下限显示数据处理
  93.         x=low*10;
  94.         LCD_Buf4[4]=x/1000+'0';
  95.         LCD_Buf4[5]=x/100%10+'0';
  96.         LCD_Buf4[6]=x/10%10+'0';
  97.         LCD_Buf4[8]=x%10+'0';

  98.         LCD_Buf4[15]='C';
  99.         //刷新LCD数据
  100.         LCD_Display_String(0,0,LCD_Buf3);
  101.         LCD_Display_String(0,1,LCD_Buf4);
  102. }

  103. //------------------------------------------------------
  104. //显示电机全速与当前转速
  105. //------------------------------------------------------
  106. void Display_Motor()
  107. {
  108.         uint x;
  109.         //电机当前转速显示数据处理
  110.         switch(ratio)
  111.         {
  112.                 case 100:        x=384;break;
  113.                 case 43:        x=192;break;
  114.                 case 26:        x=115;break;
  115.                 case 0:                x=0;       
  116.         }
  117.         LCD_Buf6[7]=x/100+'0';
  118.         LCD_Buf6[8]=x/10%10+'0';
  119.         LCD_Buf6[9]=x%10+'0';

  120.         LCD_Buf6[15]='D';
  121.         //刷新LCD数据
  122.         LCD_Display_String(0,0,LCD_Buf5);
  123.         LCD_Display_String(0,1,LCD_Buf6);

  124. }
  125. //------------------------------------------------------
  126. //K1按键扫描及系统功能
  127. //------------------------------------------------------
  128. void Func_Choice()               
  129. {
  130.         if(K1==0)
  131.         {        Delay(10);
  132.                 if(K1==0)
  133.                         func=(++func)%4;
  134.                 while(K1==0);
  135.         }
  136.         switch(func)
  137.         {
  138.                 case 0:        Display_HT();break;
  139.                 case 1:        High_Set();break;
  140.                 case 2: Low_Set();break;
  141.                 case 3: Display_Motor();
  142.         }
  143. }


  144. //------------------------------------------------------
  145. //电机转速和转向控制
  146. //------------------------------------------------------
  147. void Motor()
  148. {
  149.         uchar l;
  150.         l=TLC2543(0)*5.0/4095*102.3/2.5;
  151.         if(l<low)                        //低于下限正转
  152.         {
  153.                 SW=0;
  154.                 if(l<low*0.1)        ratio=100;
  155.                 if((l>=low*0.1)&&(l<low*0.3))        ratio=42;
  156.                 if(l>=low*0.3)        ratio=26;       
  157.         }
  158.         else if(l>high)                //高于上限反转
  159.         {       
  160.                 SW=1;
  161.                 if(l<high+(204.7-high)*0.7)                ratio=26;
  162.                 if((l>=high+(204.7-high)*0.7)&&(l<high+(204.7-high)*0.9))        ratio=43;
  163.                 if(l>=high+(204.7-high)*0.9)        ratio=100;       
  164.         }
  165.         else
  166.                 ratio=0;
  167. }


  168. //------------------------------------------------------
  169. //定时中断初始化程序
  170. //------------------------------------------------------
  171. void T0_Init()
  172. {
  173.         TMOD=0x01;                                        //设置T0工作方式2
  174.         TH0=(65535-500)/256;                //定时1000us
  175.         TL0=(65536-500)%256;
  176.         EA=1;                                                //开T0中断
  177.         ET0=1;
  178.         TR0=1;                                                //启动定时
  179. }
  180. //------------------------------------------------------
  181. //T0中断服务程序
  182. //------------------------------------------------------
  183. void Timer0()        interrupt 1                       
  184. {
  185.         TH0=(65535-500)/256;                //定时1000us
  186.         TL0=(65536-500)%256;
  187.         if(ratio==0)        PWM=1;
  188.         else if(ratio==100)        PWM=0;
  189.         else
  190.         {        count++;
  191.                 if(count==100)        count=0;
  192.                 if(count==1)                PWM=0;
  193.                 else if(count==(ratio+1))        PWM=1;
  194.         }
  195. }

  196. void main()
  197. {
  198.         LCD_Init();                //液晶显示器初始化
  199.         T0_Init();                //中断初始化
  200.         while(1)
  201.         {
  202.                 Func_Choice();                //系统功能选择
  203.                 Motor();                        //电机控制
  204.         }
  205. }


复制代码
0.png

液位监控系统的所有资料打包下载:
Proteus C51液位监控.rar (148 KB, 下载次数: 176)
回复

使用道具 举报

ID:34932 发表于 2017-1-3 11:02 | 显示全部楼层
非常需要,感谢分享
回复

使用道具 举报

ID:186870 发表于 2017-4-7 20:25 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:312160 发表于 2018-5-6 12:17 | 显示全部楼层
代码残缺
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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