⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 heart0.c.c

📁 心电图仪源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************************/
/* Name: 心电图仪显示控制程序                  
/* Language: C51单片机编程语言                                 
/* Platform:                                                   
/* Author:  gjg                                                  
/* Date: 2005年8月8日星期一    19:20                       
/* Version: 			                                         
/* Result:                                                       
/* Others: 外部ram(32K)地址分配:波形I存储区   0x0000--0x3FFF
                                波形II存放区  0x4000--0x7FFF
                                                                        
/*Functions:采集心电信号输入并控制其在示波器上显示,据有波形存储功能
/*Hardware link: 											
/*#######################################################################################*/

#include <AT89X55.h>
#include <absacc.h>
#define uchar unsigned char
#define uint  unsigned int

/*-----------定义各端口地址-----------------*/
#define PA8255  XBYTE[0x8000]//8255
#define PB8255  XBYTE[0x8001]
#define PC8255  XBYTE[0x8002]
#define COM8255 XBYTE[0x8003]

#define XOUT    XBYTE[0x9000]//  D/A x 
#define XCON    XBYTE[0x9001]
#define YOUT    XBYTE[0xa000]//  D/A y
#define YCON    XBYTE[0xa001]

#define SIZE_MENU  10//菜单长度
/*----------------其他定义---------------------*/
uchar keycode;
uchar Ax=200,Ay=200;     //示波器x,y轴幅度控制
/*------------------定义菜单------------------*/
void (*KeyFuncPtr)();
uchar KeyFuncIndex=0;
typedef struct 						//定义结构体类型      
   {
      uchar Keyfuncstate;  			//当前菜单位?
      uchar Keydnstate;    			//按向下键转向位置
      uchar Keyupstate;    			//按向上键转向位置
      uchar Keycrstate;    			//按确认键转向位             
      uchar Keybkstate;    			//按返回键转向位置   
      void (*CurrentOperation)();	//当前状态下要处理的操作程序
    } KeyTabStruct;

/*--------------ds1302硬件连接-----------------*/
sbit T_CLK = P1^2;     /*实时时钟时钟线引脚 */
sbit T_IO = P1^1;      /*实时时钟数据线引脚 */
sbit T_RST = P1^0;     /*实时时钟复位线引脚 */
sbit ACC_0=ACC^0;
sbit ACC_7=ACC^7;
/*-----------AD0809控制管脚定义-------------*/
sbit EOC=P1^3; //AD转换结束信号
sbit START=P1^4;
sbit OE=P1^5;
sbit A0=P3^4;

uchar keycode;
uchar t_init[]={0x00,0x30,0x23,0x8,0x08,0x01,0x05};

/*------------------延时子程序1-------------------*/
void delay1(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
    for(j=0;j<10;j++);

}
/*-------------------延时-------------------------*/
void delay(uint time)//延时time ms
{data uint i,j;
 for(i=0;i<time;i++)
  for(j=0;j<109;j++);
}
/*------------------------pc.n 置1---------------*/
void setpc(uchar n)  
{ n=n<<1;
  COM8255=0x01|n;
}

/*-----------------------pc.n 置0-----------------*/

void clrpc(uchar n) 
{
COM8255=n<<1;
}

/**********************字符LCD显示模块**********************/
/*--------------------写数据到lcd-----------------*/
void putchar(uchar ch)
{
    PA8255=ch;
	setpc(6);//RS=1
	clrpc(5);//RW=0
	clrpc(4);//E=0
	delay1(10);
	setpc(4);//E=1
}

/*------------------写指令到lcd---------------------*/
void putcom(uchar com)
{   PA8255=com;
	clrpc(6);//RS=0
	clrpc(5);//RW=0
	clrpc(4);//E=0
	delay1(10);
	setpc(4);//E=1

}

/*---------将指令数组写入lcd,  n为数组长度----------*/
void putir(uchar code *ir,uchar n)
{uchar i;
 for(i=0;i<n;i++)
  putcom(ir[i]);
}
/*-------将数组写入 lcd,  n为数组长度---------------*/
void putstr(uchar code *str,uchar n)  

{ uchar i;
 for(i=0;i<n;i++)
  putchar(str[i]);
}
/************************************ds1302软件包********************************************/

/************* v_RTInputByte-----往DS1302写入1Byte数据*******************/
void v_RTInputByte(uchar ucDa) 
{ 
uchar i;
ACC = ucDa;
for(i=8; i>0; i--)
{
T_IO = ACC_0; 
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1; 
} 
}
/**********uchar uc_RTOutputByte---从DS1302读取1Byte数据********************/

uchar uc_RTOutputByte(void) 
{ 
uchar i;
for(i=8; i>0; i--)
{
 ACC = ACC >>1; 
 ACC_7=T_IO;
 T_CLK = 1;
 T_CLK = 0;
} 
return(ACC); 
}
/**************v_W1302----往DS1302写入数据*******************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST =0;
} 
/***********uc_R1302---读取DS1302某地址的数据*************************/

uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST =0;
return(ucDa);
}

/******************************************************************** 
*
* 名称: v_Set1302
* 说明: 
* 功能: 设置初始时间
* 调用: v_W1302() 
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1302(uchar *pSecDa) 
{
uchar i;
uchar ucAddr = 0x80; 
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7;i>0;i--)
{ 
v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */

pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/******************************************************************** 
*
* 名称: v_Get1302
* 说明: 
* 功能: 读取DS1302当前时间
* 调用: uc_R1302() 
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Get1302(uchar ucCurtime[]) 
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{
ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */

ucAddr +=2;
}
} 

/*********************键盘扫描程序************************/

/*-----------------键盘扫描初始化程序---------------*/
void keyinit()
{ 
   setpc(0);setpc(1);setpc(2);setpc(3);
   PB8255=0xff;
}

/*------------- 键盘扫描程序---------------------*/
 
 void keyscan(void) 
{ 
  uchar lcode=0,ccode=0,scode=0x01,a,i;
   for(i=0;i<4;i++)
        {
         PB8255=scode;
         a=PC8255;
         if((a&0x0f)!=0x0f)
           {if((a|0xfe)==0xfe);
            else if ((a|0xfd)==0xfd)  lcode=4;
                 else if ((a|0xfb)==0xfb)  lcode=8;
                      else lcode=12;
            keycode=lcode+ccode;
           }
         else 
          {scode=(scode<<1);
           ccode=ccode+1;
          }
        } 
keyinit(); //键盘初始化 
}
/**********************显示存储区*************************************/
uchar code ir[5]={0x00,0x38,0x0c,0x06,0x83};
uchar code str[8]={"Welcome!"};
uchar code str0[16]={"LCD test begin.."};
uchar code str1[14]={"LCD test over!"};
uchar code str2[16]={"Key test begin.."};
uchar code str3[14]={"Key test over!"};
uchar code str4[15]={"Press any key.."};
uchar code str5[8]={"Keycode:"};
uchar code str6[16]={"Ram test begin.."};
uchar code str7[14]={"Ram test over!"};
uchar code str8[15]={"Clock testing.."};
uchar code str9[16]={"Clock test over!"};
uchar code str10[16]={"Rom test begin.."};
uchar code str11[14]={"Rom test over!"};
uchar code str12[11]={"SYSTEM TEST"};
uchar code str13[8]={"SINGLE 1"};
uchar code str14[8]={"SINGLE 2"};
uchar code str15[4]={"CHOP"};
uchar code str16[6]={"REVIEW"};
uchar code str17[11]={"Outputing.."};
/*uchar code str18[16]={""};
uchar code str19[16]={""};
uchar code str20[16]={""};
uchar code str21[16]={""};*/
uchar code test[13]={"Ram testing.."};
uchar code error[8]={"ERROR!"};

/***********************检测服务程序************************/
/*--------------LCD检测程序---------------*/
void lcd_test(void)
{uchar i;
 putcom(0x00);putcom(0x80);//begin
 putstr(str0,16);
 delay(800);
 putcom(0x80);
 for(i=0;i<16;i++)
 {putchar(0xff);}//检测有无暗点
 putcom(0xc0);
 for(i=0;i<16;i++)
 {putchar(0xff);}
 delay(500);
 putcom(0x80); 
 /*for(i=0;i<200;i++) //输出所有可显示字符
 {putchar(i);
  delay(10);
 }*/
 delay(300);
 putcom(0x00);putcom(0x80);
 putstr(str1,14);//over
 delay(800);
}
/*------------键盘检测程序---------------*/
void keyboard_test(void)
{ putcom(0x00);putcom(0x80);
  putstr(str2,16);//begin
  delay(800);
  putcom(0x00);putcom(0x80);
  putstr(str4,15);//press
  putcom(0xc2);
  putstr(str5,8);
  keyinit(); //键盘初始化 
  do

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -