红外点滴输液报警器程序.docx
- 文档编号:28652178
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:19
- 大小:18.58KB
红外点滴输液报警器程序.docx
《红外点滴输液报警器程序.docx》由会员分享,可在线阅读,更多相关《红外点滴输液报警器程序.docx(19页珍藏版)》请在冰豆网上搜索。
红外点滴输液报警器程序
#include
#include
/*********************
宏定义8255地址
*********************/
#definec8255XBYTE[0xB000]/*1011*/
#definec8255aXBYTE[0x8000]/*1000*/
#definec8255bXBYTE[0x9000]/*1001*/
#definec8255cXBYTE[0xA000]/*1010*/
#defineucharunsignedchar
#defineuintunsignedint
/*********18B20**********/
sbitDQ=P2^0;
/************************
定义全局变量
*************************/
ucharfw;//0表示正温1表示负温
sbity1=P1^0;
sbity2=P1^1;
sbity3=P1^2;
sbity4=P1^3;
sbity5=P1^4;
sbity6=P1^5;
sbity7=P1^6;
sbity8=P1^7;
ucharcodeac[]={"0123456789"};
ucharcodeac1[]={"液滴"};
ucharcodeac2[]={"点滴输液报警器"};
//ucharcodeac3[]={"断滴四秒报警"};
ucharcodeac4[]={"用时"};
ucharcodeAC_TABLE[]=
{
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,/*第一行汉字位置*/
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,/*第二行汉字位置*/
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,/*第三行汉字位置*/
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,/*第四行汉字位置*/
};
/*******1302*************/
sbitRST=P2^3;
sbitIO=P2^2;
sbitSCLK=P2^1;
ucharbdataAB;
ucharbdataAD;
sbitAB0=AB^0;
sbitAB7=AB^7;
sbitAD0=AD^0;
sbitAD7=AD^7;
/**************************
定义1302时间数据部分
***************************/
uchardatatime[7]={0x00,0x00,0x00,0x27,0x04,0x07,0x08};//用于保存从1302中取得的时间数据
ucharcodeshuzi[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20,0x2e,0x2b,0x2d,0x3a};//空格.+-:
ucharcodetimeshuzi[11]={0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba};//调时间用大写的数字
ucharcodedz1302[]={0x8c,0x88,0x86,0x84,0x82};//内部地址年月日时秒
ucharcodeyoubiaodizi[]={0x90,0x91,0x93,0x94,0x96,0x97,0x8a,0x8b,0x8d,0x8e};//调时间的游标动态
/********************************
模块数据定义部分
********************************/
voiddelay(uintb)//延时函数,延时时间为bms
{
ucharj;
while(b--)
{
for(j=0;j<125;j++)//延时1ms
{;}
}
}
/*---------------------------------------8255和液晶接口程序--------------------------------------------*/
voidKZ(unsignedchari)
{
unsignedcharxdata*addr;
addr=&c8255;
*addr=i;
}
voidPA(unsignedchari)
{
unsignedcharxdata*addr1;
addr1=&c8255a;
*addr1=i;
}
voidPB(unsignedchari)
{
unsignedcharxdata*addr2;
addr2=&c8255b;
*addr2=i;
}
/******数据转换***********
BCD转换为十进制
**************************/
turnbcd(unsignedcharbcd)
{
unsignedcharn_n;
n_n=(bcd&0xf0)/16*10+(bcd&0x0f);
return(n_n);
}
/**********************
十进制转BCD码
***********************/
turnsjz(unsignedchardd)
{
unsignedcharb_c;
b_c=(dd/10)*16+(dd-(dd/10)*10);
return(b_c);
}
voidwrite_com(unsignedcharcom)//写命令到LCD0000RSTERWRS
{//1100
delay(5);
PB(0xFC);//1100
PA(com);
PB(0xFC);//1100
delay
(1);
PB(0xF8);//1000
}
voidwrite_data(unsignedchardat)//写数据到LCD0000//1101
{
delay(5);
PB(0xFD);//1101
PA(dat);
PB(0xFD);//1101
delay
(1);
PB(0xF9);//1001
}
/***********************
a写数据的地址
b、c为要写的数据数字(0-9)
显示0-9功能
***********************/
voidxianshi(unsignedchara,unsignedcharb,unsignedcharc)
{
write_com(AC_TABLE[a]);
write_data(shuzi[b]);
write_data(shuzi[c]);
}
/*-------------------------------------------18B20程序------------------------------------------------*/
voidFW_DS18B20(void)
{
unsignedcharx=0;
DQ=1;
delay
(2);
DQ=0;
delay(15);
DQ=1;
delay
(2);
x=DQ;
delay
(1);
}
/************************
读一个字节
*************************/
ReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
/***********************
写一个字节
************************/
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
}
/********************************
该函数的返回值为得到温度的
真实值000.0000
*******************************/
unsignedintread_temperature()
{
unsignedintg;
unsignedcharl,h;
FW_DS18B20();//初始化复位18B20
WriteOneChar(0xCC);//跳过读序号列号的操作(书上提供)
WriteOneChar(0x44);//开始温度转换
delay
(1);
FW_DS18B20();//初始化复位18B20
WriteOneChar(0xCC);//跳过读序号列号的操作(书上提供)
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
l=ReadOneChar();//读低字节
h=ReadOneChar();//读高字节(前四个是零表示正温度是一表示负温度)
fw=h&0x80;//取出高字节该数据为符号位(0表示正数1表示负数)
g=turnbcd(0x0f&h)*256+l;
return(g);
}
/***************************
读出温度加显示精确到小数点
后一位温度值小于99度
进行温度的正负判断
***************************/
voidwendu(void)
{
unsignedinty;
ucharh;
ucharn;
ucharv;
h=0;
n=0;
v=0;
y=read_temperature();
y=y*0.625;//40959.375
y=y%10000;//0959
y=y%1000;//959
h=y/100;//9
y=y%100;//59
n=y/10;//5
v=y%10;//9
if(fw==0)
{
xianshi(12,10,12);//表示温度的正负植
}
else
{
xianshi(12,10,13);
}
xianshi(13,h,n);//温度高两位
xianshi(14,11,v);//温度小数点和后一位
write_com(0x97);//温度标号
write_data(0xa1);
write_data(0xe6);
}
/*********************
写数据低位开始
**********************/
voidinputbyte(unsignedchara_a)
{
unsignedcharb_b;
AB=a_a;
for(b_b=8;b_b>0;b_b--)
{
IO=AB0;
SCLK=1;
SCLK=0;
AB=AB>>1;
}
}
/********************
读取字节有返回值
*********************/
outputbyte()
{
unsignedcharb_b;
for(b_b=7;b_b>0;b_b--)
{
AD7=IO;
SCLK=1;
SCLK=0;
AD=AD>>1;
}
return(AD);
}
/*********************
往1302里写数据参数分别为
地址和数据
**********************/
voidw1302(unsignedcharadd,unsignedchardat)
{
RST=0;
SCLK=0;
RST=1;
inputbyte(add);
inputbyte(dat);
SCLK=1;
RST=0;
}
/********************
设置初始时间秒分时
日月星期年
**********************/
voidset1302()
{
unsignedcharq_q=0;
unsignedcharb_b;
unsignedcharadd=0x80;
w1302(0x8e,0x00);
for(b_b=7;b_b>0;b_b--)
{
w1302(add,time[q_q]);
add+=2;
q_q++;
}
}
/**********************
读取1302某地址的数据
返回值为该地址的数据
**********************/
unsignedcharr1302(unsignedcharadd)
{
unsignedcharucdata;
RST=0;
SCLK=0;
RST=1;
inputbyte(add);
ucdata=outputbyte();
SCLK=1;
RST=0;
return(ucdata);
}
/********************
保存当前时间格式为:
秒分时日月星期年
********************/
voidget1302()
{
unsignedcharb_b;
unsignedcharducaddr=0x81;
for(b_b=0;b_b<7;b_b++)//读数据连续读数放到数组里
{
time[b_b]=turnbcd(r1302(ducaddr));//格式为:
秒分时日月星期年
ducaddr+=2;
}
}
/*-------------------------------------------------调时间部分-------------------------------------------------*/
/*****************************
写全宽数字字体
****************************/
voidxianshishuzi(unsignedchara,unsignedcharb)//显示功能a写数据的地址b为要写的数据数字(0-9)
{
write_com(AC_TABLE[a]);//给一个地址写
write_data(0xa3);
write_data(shuzi[b]);
}
/***************************
时间显示功能
***************************/
voidtimexianshi(void)//显示时间为固定
{
get1302();
xianshi(20,time[2]/10,time[2]%10);//时
xianshi(21,14,time[1]/10);//分
xianshi(22,time[1]%10,14);//分
xianshi(23,time[0]/10,time[0]%10);//秒
}
/**********************
写汉字功能a地址和要写
第c个数字就可以连续写完b个数
***********************/
voidInhanzi(uchar*str,ucharz,uchard,ucharw)
{
write_com(0x30);
while(w!
=0)
{
write_com(AC_TABLE[z]);
write_data(str[d]);
d++;
write_data(str[d]);
d++;
z++;
w--;
}
}
/*********t0中断************/
ucharcounter;
voidtime0()interrupt1using1//定时器中断0,采用第一组通用工作寄存器
{
counter=counter+1;//中断次数寄存器加1
TH0=(65535-50000)/256;//定时100ms,装入计数初值
TL0=(65535-50000)%256;
INT1=0;
if(counter==80)
{
INT1=1;
while
(1);
counter=0;
}
INT1=0;
}
/*-----------------------------------------------初始化部分----------------------------------------------------*/
voidmain(void)
{
uchari=0,k=0,a,b,c,d,e,f;
delay(100);
INT1=0;
TMOD=0x01;//定时器0为工作方式1
//启动定时器0
ET0=1;//开中断
PT0=1;//设置高优先级
TH0=(65535-50000)/256;//定时100ms,装入计数初值
TL0=(65535-50000)%256;
IT0=1;
EX0=0;
KZ(0x88);//8255初始化
delay
(1);
PB(0x07);
delay(6);
PB(0x0f);
delay
(1);
write_com(0x30);//8BitMCU,基本指令集合
write_com(0x03);//AC归0,不改变DDRAM内容
write_com(0x0c);//显示ON,游标OFF,游标位反白OFF
write_com(0x01);//清屏,AC归0
write_com(0x06);//写入时,游标右移动}
//Inhanzi(ac3,9,0,6);
Inhanzi(ac2,0,0,7);
Inhanzi(ac1,24,0,2);
Inhanzi(ac4,16,0,2);
write_com(0x9a);
write_data(0xca);
write_data(0xFd);
write_com(0x9d);
write_data(48);
write_data(48);
write_data(48);
write_data(48);
write_data(48);
write_data(48);
TH1=0xfd;//波特率为9600b/s
TL1=0xfd;//9600b/s
ET1=0;//关T1中断
SCON=0x50;//串行方式1,允许接收
PS=1;
ES=1;//开串行中断
TR1=1;//开T1定时
EA=1;//开全局中断
set1302();//初始化对1302进行设置
do
{
timexianshi();
wendu();
if(IE0==1)
{
i++;
TR0=1;
counter=0;
f=i/100000;
e=i%100000/10000;
a=i%10000/1000;
b=i%1000/100;
c=i%100/10;
d=i%10;
write_com(0x9d);
write_data(f+48);
write_data(e+48);
write_data(a+48);
write_data(b+48);
write_data(c+48);
write_data(d+48);
IE0=0;
}
}while
(1);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 红外 点滴 输液 报警器 程序