?? liu3.c
字號:
#include<func.h>
#include <at89x52.h>
#include <absacc.h>
#define LCD_WCOM XBYTE[0xfcff]
#define LCD_RCOM XBYTE[0xfeff]
#define LCD_WDAT XBYTE[0xfdff]
#define LCD_RDAT XBYTE[0xffff]
extern void Initial(void);
extern void delay(uint shu);
extern void display(uchar *tab);
extern void commution(void);
/*全局變量********************************/
uchar key;
uchar Dis_buff[16]="1:W S:100 C: "; //后面的空格也是顯示速度
uchar sec;
uint dingshi,dingshi1;
uchar warn,cur_speed,set_speed,set_speed_sp,av[3]; //av[3]數組存放三次測量的速度值
/*全局標志*********************************/ //cur_speed表示當前滴速 set_speed表示設置滴速
bit F_key,F_auto; //F_key有/無按鍵;F_auto(主控)自動/(從控)手動
void dis_speed(uchar dat,uchar dis_9);
void fun0(void); //加速
void fun1(void); //減速
uchar judge(void); //判斷速度差
void adjust(void); //調節
void communition(void)//串行通信
/*##############################################*/
//中斷區/////////////////////////////////////////
////鍵盤中斷--中斷1
void keydec(void) interrupt 0 //中斷號為0,表示外部中斷0
{
uchar i,keyd;
delay(4000); ////////////////////延時,去抖動
if((P1&0x0f)!=0x0f) //有鍵按下
{
F_key=1; //標志位置1
EX0=0; //禁止外部中斷0
P1_4=0; P1_5=1; //檢測第一排的4個鍵,將第一列置低電平
for(keyd=0,i=0;i<2;i++) //判斷是哪個鍵按下,并計算鍵值
{
if(!P1_0){key=keyd+i;break;}
else if(!P1_1){key=keyd+i+2;break;}
else if(!P1_2){key=keyd+i+4;break;}
else if(!P1_3){key=keyd+i+6;break;}
else {P1_4=1; P1_5=0;} //將第一列置低電平
}
P1_4=0; P1_5=0; //恢復初始狀態
IE0=0; //循環中斷時使INT0先為1后為0使中斷標志寄存器置位,中斷返回時要清0
EX0=1; //開外部中斷0
}
}
//定時器1中斷,工作在方式2
void timer1(void)interrupt 3 //中斷號為3,定時器1中斷,定義一個內部時鐘,也為串口波特率發生器
{
TH1=0xfd; TL1=0xfd; //裝初值,波特率為9600
if(++dingshi1==3072) //就是(dingshi+1)==3072,TMOD應該是在初始化的時候設置好的
{
dingshi1=0;
++dingshi ; //dingshi為10ms數量級
}
if(++dingshi==100) //秒位加1
++sec;
}
液位到達警戒值報警
void timer0(void)interrupt 1 //中斷號為1,表示為定時器0中斷,工作在計數狀態初值為255
{
TR0=0; //關閉定時器0
delay(10000); //延時
if(P3_4==0) //T0腳為0,病人緊急情況報警,液位到達警戒值
{
F_warn=1; //報警標志位置1
warn=0x02; //為第二種報警情況
Dis_buff[6]='!';//將報警信息送顯示緩沖區
Dis_buff[7]='!';
Dis_buff[8]='2';
}
else
{
TH0=TL0=255; //重裝初值
TR0=1; //啟動T0,下降沿則記數器加1
}
}
//外部中斷1
void intr1(void)interrupt 2 //中斷號為2,表示外部中斷1,計算液體滴速
{
uchar F_warn3=0,F_warn4=0,i;//定義中間變量
uchar dis_sp; //中間變量
uint time_sp; //定義一個時間變量
TR0=ET0=0; EX1=0; //關閉T0,禁止T0中斷,禁止外中斷1
av[2]=av[1];av[1]=av[0]; //存前兩次測量值
time_sp=dingshi+sec*100; //記時擴大100倍矯正 dingshi+sec*100;
av[0]=(uchar)(60*100/time_sp); //60*100/timesp為矯正后測得的滴速
if(av[0]>60) //滴速較大時,為保證測量的準確性,
{ // 采取三次采樣求平均的方法
time_sp=av[0]+av[1]+av[2];
cur_speed=(uchar)(time_sp/3); //計算當前滴速
}
else cur_speed=av[0];
Dis_buff[14]=cur_speed%10+'0'; //存放滴速的個位
dis_sp=cur_speed/10;
Dis_buff[13]=dis_sp%10+'0'; //存放滴速的十位
Dis_buff[12]=dis_sp/10+'0'; //存放滴速的百位
if(Dis_buff[12]=='0')Dis_buff[12]=' ';//百位為0,則輸出空格
display(Dis_buff); //顯示速度
TH1=0xe8; TL1=0xe8; //重裝初值
dingshi=0; sec=0; //定時時間清0
for(i=0;i<3;i++)
{if(av[i]>150)F_warn3++;} //滴速大于150,滴速過快標志啟動
if(F_warn3==3)
{
F_warn=1; //有報警信號
warn=0x03; //為第三種報警信號
Dis_buff[6]='!'; //報警信息送顯示緩沖區
Dis_buff[7]='!';
Dis_buff[8]='3';
display(Dis_buff); //顯示
}
for(i=0;i<3;i++)
{if(av[i]<20)F_warn4++;} //滴速小于20,滴速過慢信號啟動
if(F_warn4==3) //三次測量值都低于規定滴速最小值
{
F_warn=1; //報警信號標志置位
warn=0x04; //為第四種報警信號
Dis_buff[6]='!'; //報警信息送顯示緩沖區
Dis_buff[7]='!';
Dis_buff[8]='4';
display(Dis_buff); //顯示
}
IE1=0; EX1=1; //開外中斷1
}
else
{
ET0=TR0=1; //重新啟動內部時鐘T0
}
}
//串行通信
void comm(void)interrupt 4 //中斷號為4,表示串行口中斷
{
commution(); //調用串行通信函數
}
//主函數//////////////////////////////////////////////
void main(void)
{
{
IP=0x10; //設置串口為高中斷優先級
TMOD=0x26; //T1定時,方式2;T0計數,方式2
TH1=TL1=0xe8; //裝初值
TL1=TL0=255; //裝初值,擴展為中斷,來一個脈沖則計滿溢出
} //初始化
uchar judge_dat,i; //judge_dat
delay(65000);
P1_4=0; P1_5=0;
P1_6=0; P1_7=0; P3_5=0; //T1口置0,
av[0]=av[1]=av[2]=100; //設滴速初值
display(Dis_buff); //顯示開機界面,速度為100
dingshi=0; sec=0; //內部時鐘初值設為0
F_key=0; F_auto=1; //開始為從控F_key有無鍵按下;F_auto(主控)自動/從控(手動)
set_speed=set_speed_sp=100; //初始速度為100
IT0=1;IE0=0;EX0=1; //外部中斷0為邊沿觸發方式,IE0初值為0,中斷來了硬件會將它置1,允許外部中斷0
if(key==2) //緊急情況報警,此功能不受主機控制
{
F_warn=1; P2_2=1;P2_3=0; //報警標志位置位,啟動聲光報警
warn=0x01; //為第一種報警情況
Dis_buff[6]='!'; //報警信息送顯
Dis_buff[7]='!';
Dis_buff[8]='1';
display(Dis_buff);
};break;
else //為其它情況時按下述處理
{
if(!F_auto) //處在從控狀態
switch(key)
{
case 0:fun0();break; //按鍵加速speed++
case 1:fun1();break; //按鍵減速speed--
case 3: //手動取消報警
{
P2_2=0;P2_3=1; //取消報警
Dis_buff[2]='H'; //'H'是hand的意思
F_warn=0; warn=0x00;
};break;
case 4: //鍵4為反轉、全速控制鍵
{
P1_6=1; //反轉準備
while(!P3_2) //外部中斷0產生
{
P1_7=1;
delay(300);
P1_7=0;
delay(300); //全速
display(Dis_buff);
};break;
}
case 5: //鍵5為正轉、全速控制鍵
{
P1_6=0;
while(!P3_2)
{
P1_7=1;
delay(300);
P1_7=0;
delay(300); //全速
display(Dis_buff);
}
};break;
}
Dis_buff[2]='A'; //否則為主控自動調節
TI=0; RI=0; ES=1;
adjust();
//鍵0:從控按鍵加速
void fun0(void)
{
uint i;
F_key=1;Dis_buff[2]='H'; //'H'是hand的意思
while(!P3_2) //進行加速,但最大加至150
{
if(++set_speed_sp>150)set_speed_sp=150;//set-speed-sp為從機設置的速度值
dis_speed(set_speed_sp,0); //顯示從控設置的速度
for(i=0;i<25000 && !P3_2&&!F_warn;i++);//等待
}
}
//鍵1:從控按鍵減速
void fun1(void)
{
uint i;
F_key=1; Dis_buff[2]='H'; //'H'是hand的意思
while(!P3_2) //外中斷0,有鍵按下,減速,最底減至20
{
if(--set_speed_sp<20)set_speed_sp=20;
dis_speed(set_speed_sp,0); //顯示從控設置的速度
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -