0.png (59.19 KB, 下載次數: 49)
下載附件
2019-9-9 21:12 上傳
單片機源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #include "delay.h"
- #include "lcd1602.h"
- #include "steper.h"
- #include "keypress.h"
- uchar dishu_sheding = 0;//設定滴數
- uchar dishu_shiji = 0;//實際滴數
- uchar diandi_number = 0;//滴數數值
- uchar Number = 0;//時間計數
- uchar PuZh[4] = "";//存儲發送數據
- uchar level = 0;//當前步進電機的位置
- sbit buzzer = P2^0;//蜂鳴器
- /*******************************************************************************
- * 函 數 名 : Timer_Init()
- * 函數功能 : 設置定時
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Timer_Init()
- {
- TMOD = 0x11;//定時器0定時器1為工作方式1
- /* 裝載初值 */
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
-
- EA = 1;//開總中斷
- /* 開啟定時器中斷 */
- ET0 = 1;//定時器0
- /* 啟動定時器 */
- TR0 = 1;//定時器0
- /* 外部中斷 */
- EX0 = 1;
- EX1 = 1;
- IT0 = 1;
- IT1 = 1;
- }
- /*******************************************************************************
- * 函 數 名 : UsartConfiguration()
- * 函數功能 : 設置串口
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void UsartConfiguration()
- {
- SCON=0X50; //設置為工作方式1,8位數據,可變波特率
- TMOD=0X20; //設置計數器工作方式2
- PCON=0X00; //波特率不加倍
- TH1=0XFd; //計數器初始值設置,9600@11.0592MHz
- TL1=0XFd;
- TR1=1; //打開計數器
- ES = 1; //開串口中斷
- EA = 1; //開總中斷
- }
- /*------------------------------------------------
- 中斷0函數,檢測滴管里面下落點滴的數量
- ------------------------------------------------*/
- void Interrupt0() interrupt 0
- {
- diandi_number++;
- DelayMs(100);//軟件防止波動
- }
- /*------------------------------------------------
- 定時計數0,設定為60s,檢測點滴速度,時間越長,精度越高
- ------------------------------------------------*/
- void T0_Time() interrupt 1
- {
- /* 重裝初值 */
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
- Number++;//自動校正流速程序
- if(Number==20*60)//定時1分鐘
- {
- Number = 0;
- dishu_shiji = diandi_number;
- if((dishu_shiji-dishu_sheding)>6)//滴速過快,步進電機正向轉動,減慢滴速
- {
-
- if(level<=13)//步進電機是否轉到最大角度
- {
- level++;
- Move(1,10);//正向轉動
- }
- }
- else if((dishu_shiji-dishu_sheding)<-6)//滴速過慢,步進電機反向轉動,加快滴速
- {
-
- if(level>=0)//步進是否轉到最小角度
- {
- level--;
- Move(0,10);//反向轉動
- }
-
- }
- else;
-
- diandi_number = 0;
- }
- }
- /*------------------------------------------------
- 中斷1函數,檢測點滴袋是否有液體,當發生中斷,蜂鳴器報警,并且關閉輸液管
- ------------------------------------------------*/
- void Interrupt1() interrupt 2
- {
- uchar i=0;
- for(;i<13-level;i++)
- {
- Move(1,10);
- }
- dishu_sheding=0;
- buzzer = 0;
- }
- /********************************************************************
- * 名稱 : Com_Int()
- * 功能 : 串口中斷子函數
- * 輸入 : 無 * 輸出 : 無
- ***********************************************************************/
- void Com_Int(void) interrupt 4
- {
- uchar i;
- uchar receive_data;
-
- EA = 0;
-
- if(RI == 1) //當硬件接收到一個數據時,RI會置位
- {
- RI = 0;
- receive_data = SBUF;//接收到的數據
-
- if(receive_data == '1')
- {
- PuZh[0]='0'+dishu_shiji/100;
- PuZh[1]='0'+dishu_shiji%100/10;
- PuZh[2]='0'+dishu_shiji%10;
- PuZh[3]='\0';
- for(i=0; i<4; i++)
- {
- SBUF = PuZh[i]; //將要發送的數據放入到發送寄存器
- while(!TI); //等待發送數據完成
- TI=0; //清除發送完成標志位
- DelayMs(1);
- //LED =0;
- }
- }
- else if(receive_data == '2')//關閉蜂鳴器
- {
- buzzer=1;
- }
- else if(receive_data == '3')//正向調整步進電機
- {
- if(level<=13)
- {
- level++;
- Move(1,10);
- }
- }
- else if(receive_data == '4')//反向調整步進電機
- {
- if(level>=0)
- {
- level--;
- Move(0,10);
- }
- }
- else if(receive_data == '5')//關閉點滴
- {
- uchar i=0;
- for(;i<13-level;i++)
- {
- Move(1,10);
- }
- dishu_sheding=0;
- }
- else;
-
- }
-
-
- EA = 1;
- }
- void main()
- {
-
- uchar keyvalue;//鍵值
- uchar k;//設定滴數顯示的位置
- uchar value[3]={0,0,0};//保存輸入設定滴數的值,默認為0
- uchar i;//臨時變量
-
- buzzer=1;//初始化蜂鳴器
- lcd1602_init();//初始化lcd
- Timer_Init();//初始化定時
- UsartConfiguration();//初始化串口
-
-
- while(1)
- {
- lcd1602_clear();//清屏
- lcd1602_write_string(0,0,"now:");
- lcd1602_write_string(9,0,"d/min");
- lcd1602_write_string(0,1,"set:");
- lcd1602_write_string(9,1,"d/min");
- lcd1602_write_char(6,0,'0'+dishu_shiji/100);
- lcd1602_write_char(7,0,'0'+dishu_shiji%100/10);
- lcd1602_write_char(8,0,'0'+dishu_shiji%10);
-
-
- if (KeyPress())
- {//按鍵處理程序
- keyvalue = KeyScan();
-
- if (keyvalue ==14)
- {//手動校準步進電機
- DelayMs(200);//去抖
- while(1)
- {
- if(KeyPress())
- {
- keyvalue = KeyScan();
- if(keyvalue == 11)//正向調整
- {
- Move(1,10);
- }
- if(keyvalue == 12)//反向調整
- {
- Move(0,10);
- }
- if(keyvalue ==16)//退出
- {
- level = 0;
- break;
- }
- while (KeyPress());
- }
- }
- }
-
- if(keyvalue ==15)
- {//設置顯示模式
- DelayMs(200);//去抖
- while(1)
- {
- if(KeyPress())
- {
- keyvalue = KeyScan();
- if(keyvalue ==11)//向左滾動
- {
- i=40;
- while(i--)
- {
- DelayMs(200);
- lcd1602_turn_right();
- }
- }
- if(keyvalue ==12)//向右滾動
- {
- i=40;
- while(i--)
- {
- DelayMs(200);
- lcd1602_turn_left();
- }
- }
- if(keyvalue ==16)//清屏并退出
- {
- lcd1602_clear();
- break;
- }
- while (KeyPress());
- }
- }
-
- }
-
-
- if(keyvalue==13)
- {//設定滴數
- DelayMs(200);//去抖
- k=6;
- while(1)
- {
- DelayMs(200);//去抖
- if(KeyPress())
- {
- keyvalue = KeyScan();
- if(keyvalue==0||keyvalue==1||keyvalue==2||keyvalue==3||keyvalue==4||keyvalue==5||keyvalue==6||keyvalue==7||keyvalue==8||keyvalue==9)
- {
- if(k==6)
- {
- value[0]=keyvalue;
- }
- else if(k==7)
- {
- value[1]=keyvalue;
- }
- else if(k==8)
- {
- value[2]=keyvalue;
- }
- keyvalue = '0'+ keyvalue;
- lcd1602_write_char(k,1,keyvalue);
- }
- else if(keyvalue == 11)
- {
- k=k-1;
- }
- else if(keyvalue == 12)
- {
- k=k+1;
- }
- else if (keyvalue==16)
- {
- dishu_sheding = value[0]*100+value[1]*10+value[2];
- break;
- }
- else;
- while (KeyPress());
- }
- }
- }
- while (KeyPress());
- }else{
- lcd1602_write_char(6,1,'0'+dishu_sheding/100);
- lcd1602_write_char(7,2,'0'+dishu_sheding%100/10);
- lcd1602_write_char(8,3,'0'+dishu_sheding%10);
- }
-
- DelayMs(200);
- }
- }
復制代碼
所有資料51hei提供下載:
程序代碼.rar
(50.05 KB, 下載次數: 63)
2019-9-8 22:01 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
原理圖.pdf
(282.8 KB, 下載次數: 33)
2019-9-8 22:01 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
test.PDF
(30.01 KB, 下載次數: 33)
2019-9-8 22:01 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|