附 录A
参考程序
脉搏测量仪的信号采集、处理、显示的程序 #include
sbit spd = P1^2;//蜂鸣器端口
/****************************************************************/ /*************************外部中断***************************************/
/****************************************************************/ external0() interrupt 0//外部中断服务程序 {
w=~w; // 取反
if(w==0) {
EX0=0; // 清除计算相关寄存器 ET0=1; TH0=0x0;
TL0=0x0;
32
n=0; } else {
time=n*65536+TH0*256+TL0; //计算两次脉搏跳动的时间间隔(单片机定
时计数器计数值)
}
dd[jj]=30000000/time; //计算出1分钟,即60s的脉搏跳动次数 jj++; if(jj>10) { jj=0;
for(j=0;j<11;j++) // 冒泡法排序 for(k=0;k<11-j;k++)
{
if(dd[k]>dd[k+1])
{
tmp=dd[k]; }
dd[k]=dd[k+1]; dd[k+1]=tmp;
if(dd[5]>50&&dd[5]<200)ci=((dd[4]+dd[5]+dd[6])/3)+11; // 在一定
的条件下,取出中间的值取平均值,并加以修正
} TH0=0x0;
33
TL0=0x0; }
/****************************************************************/ /*************************定时器中断***************************************/
/****************************************************************/ void timer0(void) interrupt 1 {
n++; // 加1 }
/****************************************************************/ /*************************延时函数***************************************/
/****************************************************************/ void delay(void) //误差 0us 延时函数 {
unsigned char a,b,c; for(c=123;c>0;c--) for(b=116;b>0;b--) for(a=9;a>0;a--); }
/****************************************************************/ /*************************主函数
***************************************/
/****************************************************************/
34
}
n=0; // 计数器清零
///////////////////////////////////////////////////////////////// void main(void) {
InitLcd();// 液晶初始化 DelayMs(15); //延时
IT0=1; //INT0下降沿中断 EX0=1; //允许INT1中断 TMOD=0x1; TH0=0x0; TL0=0x0;
TR0=1; //开定时器 ET0=1;
EA=1; //开总中断 while(1) {
if(n>10) {
n=0; jj=0; ci=0;
// 设定定时器工作方式
TimeNum[0]='H'; TimeNum[1]='e' ;
TimeNum[2]='a' ; TimeNum[3]='r' ; TimeNum[4]='t' ;
TimeNum[5]=' ' ;
TimeNum[6]='r' ; TimeNum[7]='a' ;
35
TimeNum[8]='t' ; TimeNum[9]='e' ;
TimeNum[10]=' ' ; // 显示英文字符 ShowString(0,TimeNum);
ShowString(1,Test1); } else {
if(w==0&&EX0==0) {
delay(); EX0=1; }
TimeNum[10]=':' ; ShowString(0,TimeNum );
WriteCommand (0x80+0x40+5);//write command 第二行显示
WriteData (LCD1602_Table[ci/100]); //write data 显示测量结果
WriteData (LCD1602_Table[ci0/10]); //write data WriteData (LCD1602_Table[ci]); //write data
WriteData ('/'); //write data
WriteData ('m'); //write data WriteData ('i'); //write data WriteData ('n'); //write data
if(ci>100)spd=0;else spd=1;
//测量数值超过100,蜂鸣器报警
} } ; }
36