找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机点滴控制系统程序

[复制链接]
ID:505762 发表于 2019-9-8 22:01 | 显示全部楼层 |阅读模式
0.png
单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include "delay.h"
  4. #include "lcd1602.h"
  5. #include "steper.h"
  6. #include "keypress.h"

  7. uchar dishu_sheding = 0;//设定滴数
  8. uchar dishu_shiji = 0;//实际滴数
  9. uchar diandi_number = 0;//滴数数值
  10. uchar Number = 0;//时间计数
  11. uchar PuZh[4] = "";//存储发送数据
  12. uchar level = 0;//当前步进电机的位置

  13. sbit buzzer = P2^0;//蜂鸣器
  14. /*******************************************************************************
  15. * 函 数 名       : Timer_Init()
  16. * 函数功能                   : 设置定时
  17. * 输    入       : 无
  18. * 输    出       : 无
  19. *******************************************************************************/
  20. void Timer_Init()
  21. {
  22.         TMOD = 0x11;//定时器0定时器1为工作方式1
  23.         /*  装载初值  */
  24.         TH0 = (65536-50000)/256;
  25.         TL0 = (65536-50000)%256;
  26.         
  27.         EA = 1;//开总中断
  28.         /*  开启定时器中断  */
  29.         ET0 = 1;//定时器0
  30.         /*  启动定时器  */
  31.         TR0 = 1;//定时器0
  32.         /*  外部中断  */
  33.         EX0 = 1;
  34.         EX1 = 1;
  35.         IT0 = 1;
  36.         IT1 = 1;
  37. }

  38. /*******************************************************************************
  39. * 函 数 名       : UsartConfiguration()
  40. * 函数功能                   : 设置串口
  41. * 输    入       : 无
  42. * 输    出       : 无
  43. *******************************************************************************/

  44. void UsartConfiguration()
  45. {        
  46.         SCON=0X50;                        //设置为工作方式1,8位数据,可变波特率
  47.         TMOD=0X20;                        //设置计数器工作方式2
  48.         PCON=0X00;                        //波特率不加倍
  49.         TH1=0XFd;                    //计数器初始值设置,9600@11.0592MHz
  50.         TL1=0XFd;
  51.         TR1=1;                                        //打开计数器
  52.         ES = 1;         //开串口中断
  53.   EA = 1;         //开总中断
  54. }


  55. /*------------------------------------------------
  56. 中断0函数,检测滴管里面下落点滴的数量
  57. ------------------------------------------------*/
  58. void Interrupt0() interrupt 0
  59. {
  60.         diandi_number++;
  61.         DelayMs(100);//软件防止波动
  62. }
  63. /*------------------------------------------------
  64. 定时计数0,设定为60s,检测点滴速度,时间越长,精度越高
  65. ------------------------------------------------*/
  66. void T0_Time() interrupt 1
  67. {
  68.         /*  重装初值  */
  69.         TH0 = (65536-50000)/256;
  70.         TL0 = (65536-50000)%256;
  71.         Number++;//自动校正流速程序
  72.         if(Number==20*60)//定时1分钟
  73.         {
  74.                 Number = 0;
  75.                 dishu_shiji = diandi_number;
  76.                 if((dishu_shiji-dishu_sheding)>6)//滴速过快,步进电机正向转动,减慢滴速
  77.                 {
  78.                         
  79.                         if(level<=13)//步进电机是否转到最大角度
  80.                                 {
  81.                                         level++;
  82.                                         Move(1,10);//正向转动
  83.                                 }
  84.                 }
  85.                 else if((dishu_shiji-dishu_sheding)<-6)//滴速过慢,步进电机反向转动,加快滴速
  86.                 {
  87.                         
  88.                         if(level>=0)//步进是否转到最小角度
  89.                                 {
  90.                                         level--;
  91.                                         Move(0,10);//反向转动
  92.                                 }
  93.                         
  94.                 }
  95.                 else;
  96.                
  97.                 diandi_number = 0;
  98.         }
  99. }
  100. /*------------------------------------------------
  101. 中断1函数,检测点滴袋是否有液体,当发生中断,蜂鸣器报警,并且关闭输液管
  102. ------------------------------------------------*/
  103. void Interrupt1() interrupt 2
  104. {
  105.         uchar i=0;
  106.         for(;i<13-level;i++)
  107.         {
  108.                 Move(1,10);
  109.         }
  110.         dishu_sheding=0;
  111.         buzzer = 0;
  112. }

  113. /********************************************************************
  114. * 名称 : Com_Int()
  115. * 功能 : 串口中断子函数
  116. * 输入 : 无 * 输出 : 无
  117. ***********************************************************************/
  118. void Com_Int(void) interrupt 4
  119. {
  120.         uchar i;
  121.   uchar receive_data;
  122.         
  123.   EA = 0;
  124.         
  125.   if(RI == 1) //当硬件接收到一个数据时,RI会置位
  126.         {                 
  127.                 RI = 0;
  128.                 receive_data = SBUF;//接收到的数据
  129.                         
  130.                 if(receive_data == '1')         
  131.                 {
  132.                         PuZh[0]='0'+dishu_shiji/100;
  133.                         PuZh[1]='0'+dishu_shiji%100/10;
  134.                         PuZh[2]='0'+dishu_shiji%10;
  135.                         PuZh[3]='\0';
  136.                         for(i=0; i<4; i++)
  137.                         {
  138.                                         SBUF = PuZh[i];   //将要发送的数据放入到发送寄存器
  139.                                         while(!TI);                    //等待发送数据完成
  140.                                         TI=0;                                //清除发送完成标志位
  141.                                         DelayMs(1);
  142.                                         //LED =0;
  143.                         }
  144.                 }
  145.                 else if(receive_data == '2')//关闭蜂鸣器
  146.                 {
  147.                                 buzzer=1;
  148.                 }
  149.                 else if(receive_data == '3')//正向调整步进电机
  150.                 {
  151.                                 if(level<=13)
  152.                                 {
  153.                                         level++;
  154.                                         Move(1,10);
  155.                                 }
  156.                 }
  157.                         else if(receive_data == '4')//反向调整步进电机
  158.                 {
  159.                                         if(level>=0)
  160.                                 {
  161.                                         level--;
  162.                                         Move(0,10);
  163.                                 }
  164.                 }
  165.                         else if(receive_data == '5')//关闭点滴
  166.                 {
  167.                                         uchar i=0;
  168.                                         for(;i<13-level;i++)
  169.                                         {
  170.                                                 Move(1,10);
  171.                                         }
  172.                                         dishu_sheding=0;
  173.                         }
  174.                 else;
  175.                
  176.         }
  177.                
  178.         
  179.                 EA = 1;
  180. }


  181. void main()
  182. {
  183.         
  184.         uchar keyvalue;//键值
  185.         uchar k;//设定滴数显示的位置
  186.         uchar value[3]={0,0,0};//保存输入设定滴数的值,默认为0
  187.         uchar i;//临时变量
  188.         
  189.         buzzer=1;//初始化蜂鸣器
  190.         lcd1602_init();//初始化lcd
  191.         Timer_Init();//初始化定时
  192.         UsartConfiguration();//初始化串口
  193.                
  194.         
  195.         while(1)
  196.         {               
  197.                 lcd1602_clear();//清屏
  198.                 lcd1602_write_string(0,0,"now:");
  199.                 lcd1602_write_string(9,0,"d/min");
  200.                 lcd1602_write_string(0,1,"set:");
  201.                 lcd1602_write_string(9,1,"d/min");
  202.                 lcd1602_write_char(6,0,'0'+dishu_shiji/100);
  203.                 lcd1602_write_char(7,0,'0'+dishu_shiji%100/10);
  204.                 lcd1602_write_char(8,0,'0'+dishu_shiji%10);
  205.                         
  206.                         
  207.                 if (KeyPress())
  208.         {//按键处理程序
  209.             keyvalue = KeyScan();
  210.                                        
  211.                                                 if (keyvalue ==14)
  212.                                                 {//手动校准步进电机
  213.                                                         DelayMs(200);//去抖
  214.                                                         while(1)
  215.                                                         {
  216.                                                                 if(KeyPress())
  217.                                                                 {
  218.                                                                         keyvalue = KeyScan();
  219.                                                                         if(keyvalue == 11)//正向调整
  220.                                                                         {
  221.                                                                                 Move(1,10);
  222.                                                                         }                                                
  223.                                                                         if(keyvalue == 12)//反向调整
  224.                                                                         {
  225.                                                                                 Move(0,10);
  226.                                                                         }
  227.                                                                         if(keyvalue ==16)//退出
  228.                                                                         {
  229.                                                                                 level = 0;
  230.                                                                                 break;
  231.                                                                         }
  232.                                                                         while (KeyPress());
  233.                                                                 }
  234.                                                         }        
  235.                                                 }
  236.                                                 
  237.                                                 if(keyvalue ==15)
  238.                                                 {//设置显示模式
  239.                                                         DelayMs(200);//去抖
  240.                                                         while(1)
  241.                                                         {
  242.                                                                 if(KeyPress())
  243.                                                                 {
  244.                                                                         keyvalue = KeyScan();
  245.                                                                         if(keyvalue ==11)//向左滚动
  246.                                                                         {
  247.                                                                                         i=40;
  248.                                                                                         while(i--)
  249.                                                                                         {
  250.                                                                                                 DelayMs(200);
  251.                                                                                                 lcd1602_turn_right();
  252.                                                                                         }               
  253.                                                                         }
  254.                                                                         if(keyvalue ==12)//向右滚动
  255.                                                                         {
  256.                                                                                         i=40;
  257.                                                                                         while(i--)
  258.                                                                                         {
  259.                                                                                                 DelayMs(200);
  260.                                                                                                 lcd1602_turn_left();
  261.                                                                                         }
  262.                                                                         }
  263.                                                                         if(keyvalue ==16)//清屏并退出
  264.                                                                         {
  265.                                                                                 lcd1602_clear();
  266.                                                                                 break;
  267.                                                                         }
  268.                                                                         while (KeyPress());
  269.                                                                 }
  270.                                                         }
  271.                                                         
  272.                                                 }
  273.                                                                                 
  274.                                                 
  275.                                                 if(keyvalue==13)
  276.                                                 {//设定滴数
  277.                                                         DelayMs(200);//去抖
  278.                                                         k=6;
  279.                                                         while(1)
  280.                                                         {
  281.                                                                 DelayMs(200);//去抖
  282.                                                                 if(KeyPress())
  283.                                                                 {
  284.                                                                         keyvalue = KeyScan();
  285.                                                                         if(keyvalue==0||keyvalue==1||keyvalue==2||keyvalue==3||keyvalue==4||keyvalue==5||keyvalue==6||keyvalue==7||keyvalue==8||keyvalue==9)
  286.                                                                         {
  287.                                                                                 if(k==6)
  288.                                                                                 {
  289.                                                                                         value[0]=keyvalue;
  290.                                                                                 }
  291.                                                                                 else if(k==7)
  292.                                                                                 {
  293.                                                                                         value[1]=keyvalue;
  294.                                                                                 }
  295.                                                                                 else if(k==8)
  296.                                                                                 {
  297.                                                                                         value[2]=keyvalue;
  298.                                                                                 }
  299.                                                                                 keyvalue = '0'+ keyvalue;                                                
  300.                                                                                 lcd1602_write_char(k,1,keyvalue);
  301.                                                                         }
  302.                                                                         else if(keyvalue == 11)
  303.                                                                         {
  304.                                                                                 k=k-1;
  305.                                                                         }
  306.                                                                         else if(keyvalue == 12)
  307.                                                                         {
  308.                                                                                 k=k+1;
  309.                                                                         }
  310.                                                                         else if (keyvalue==16)
  311.                                                                         {
  312.                                                                                 dishu_sheding = value[0]*100+value[1]*10+value[2];
  313.                                                                                 break;
  314.                                                                         }
  315.                                                                         else;
  316.                                                                         while (KeyPress());
  317.                                                                 }
  318.                                                         }
  319.                                                 }
  320.             while (KeyPress());
  321.         }else{
  322.                                         lcd1602_write_char(6,1,'0'+dishu_sheding/100);
  323.                                         lcd1602_write_char(7,2,'0'+dishu_sheding%100/10);
  324.                                         lcd1602_write_char(8,3,'0'+dishu_sheding%10);
  325.                                 }
  326.                                 
  327.                 DelayMs(200);
  328.         }
  329. }


复制代码

所有资料51hei提供下载:
程序代码.rar (50.05 KB, 下载次数: 63)
回复

使用道具 举报

ID:735784 发表于 2020-4-23 08:49 | 显示全部楼层
请问作者有没有proteus仿真文件呀,急求
回复

使用道具 举报

ID:757133 发表于 2020-5-28 11:35 来自手机 | 显示全部楼层
有没有仿真软件,大佬
回复

使用道具 举报

ID:505762 发表于 2020-6-6 15:02 | 显示全部楼层
浅若清风过 发表于 2020-5-28 11:35
有没有仿真软件,大佬

对不起,没有哦。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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