标题:
51单片机点滴控制系统程序
[打印本页]
作者:
stc89c52wzy
时间:
2019-9-8 22:01
标题:
51单片机点滴控制系统程序
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
作者:
lpc837964145
时间:
2020-4-23 08:49
请问作者有没有proteus仿真文件呀,急求
作者:
浅若清风过
时间:
2020-5-28 11:35
有没有仿真软件,大佬
作者:
stc89c52wzy
时间:
2020-6-6 15:02
浅若清风过 发表于 2020-5-28 11:35
有没有仿真软件,大佬
对不起,没有哦。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1