久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2870|回復: 3
打印 上一主題 下一主題
收起左側

51單片機點滴控制系統程序

[復制鏈接]
跳轉到指定樓層
樓主

單片機源程序如下:
  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)
原理圖.pdf (282.8 KB, 下載次數: 33)
test.PDF (30.01 KB, 下載次數: 33)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美亚洲第一区 | 在线午夜 | 免费av一区二区三区 | 免费观看www7722午夜电影 | 日韩精品在线视频免费观看 | 亚洲欧洲一区二区 | 亚洲一区二区三区视频 | 一级看片免费视频囗交动图 | 国产精品亚洲欧美日韩一区在线 | av中文字幕在线 | 国产精品美女 | 91久久久久 | 免费成人在线网站 | 欧洲一区二区在线 | 欧美激情a∨在线视频播放 成人免费共享视频 | 高清色| 国产99精品 | 黄色日批视频 | 北条麻妃99精品青青久久 | 国产成人免费视频 | 亚洲 欧美 日韩在线 | 精品国产乱码久久久久久丨区2区 | 国产精品九九 | 一区二区三区四区在线 | 日韩电影免费在线观看中文字幕 | xxxxx免费视频 | 国产在线观看一区二区三区 | av官网在线 | 狠狠色香婷婷久久亚洲精品 | 永久免费在线观看 | 在线免费黄色 | 午夜大片 | 99热播精品 | 黄网免费看 | 国产在线视频在线观看 | 成人免费在线观看 | 国产成在线观看免费视频 | 日本午夜精品一区二区三区 | 亚洲欧美激情国产综合久久久 | 日韩精品一区二区三区久久 | 黄色一级片在线播放 |