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

📄 智能体温计程序_主机.c

📁 智能体温计很好的设计
💻 C
字号:
/**********************************************
Project Name : 智能体温计程序_主机
Designed By  : sc.Dai
Date             : 2007.5.30
**********************************************/
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar code dis_code[10]={0xc0,0xf9,0xa4,0xb0,	// 0, 1, 2, 3
				0x99,0x92,0x82,0xf8,0x80,0x90}; // 4, 5, 6, 7, 8, 9, off 
uchar data set_data[3]={0x00,0x07,0x03};       //预设37.0度
uchar data ad_data;                                        //AD转换结果
uchar data dis_buf[3]={0x00,0x00,0x00};	    // 显示缓冲区
uchar data bcd_buf[3]={0x00,0x00,0x00};       //十进制BCD码转换存放区
uchar data TIMER0_NUM;
bit TIMER0_flag;
bit data set_flag=0;
sbit ALE=P2^4;
sbit OE=P2^5;
sbit START=P2^6;
sbit EOC=P2^7;
sbit P30=P3^0;
sbit select0=P3^7;
sbit select1=P3^6;
sbit select2=P3^5;

sbit K1=P2^0;
sbit K2=P2^1;
sbit K3=P2^2;
sbit K4=P2^3;
sbit bep=P3^3;
sbit SET_IND=P3^4;
sbit P17=P1^7;                                  //小数点
uint data temp;
/**********************************************/
/*函数声明
/**********************************************/
void delay1ms(uchar t);      
void adc(void);
void BCD(void);
void keyscan(void);
void send_str(void);
void beep(void);
void display(void);

/**********************************************/
/*按键蜂鸣函数
/**********************************************/
void beep2(void)
 {
  uchar data j,k;
  for(j=26;j>0;j--)
    {
	  for(k=254;k>0;k--);
	 bep=!bep;
	 }
  bep=1;
 }
/**********************************************/
/*蜂鸣报警
/**********************************************/
void beep(void)
 {
  uchar data j,k;
  for(j=100;j>0;j--)
    {
	 for(k=254;k>0;k--)
	 bep=0;
	}
  bep=1;                                       //关蜂鸣器
 }
/**********************************************/
/*延时1ms函数
/**********************************************/
void delay1ms(uchar t)      
{
  uchar j,k;
  for(j=0;j<t;j++)
  for(k=0;k<120;k++);
}

/**********************************************/
/*AD转换函数
/**********************************************/
void adc(void)
{
 ALE=1;
 _nop_();
 _nop_();
 ALE=0;
 START=1;
 _nop_();
 _nop_();
 START=0;
 _nop_(); 
 _nop_();
 _nop_();
 _nop_();
 while(EOC==0);                             //等待转换结束
 OE=1;
 ad_data=P0;                                   //读入转换数据
 OE=0;
}
/**********************************************/
/*十进制BCD码转换函数
/**********************************************/
void BCD(void)
{
 bcd_buf[2]=(ad_data/51);                   //十位
 temp=(ad_data%51);
 temp=(temp*10);
 bcd_buf[1]=(temp/51);                      //个位
 temp=(temp%51);
 temp=temp*10;
 bcd_buf[0]=(temp/51);                       //小数位
 if(bcd_buf[2]>set_data[2])                 //报警值检测
   beep();
 else if(bcd_buf[2]==set_data[2])
  {
  if(bcd_buf[1]>set_data[1])
   beep();
   else if(bcd_buf[1]==set_data[1])
    {
       if(bcd_buf[0]>set_data[0])
         beep();
    }
  }
}


/**********************************************/
/*键盘扫描函数
/**********************************************/
void keyscan(void)
{
 uchar data m;
 if(K1==0)                                         //K1设置键
 {
    for(m=0;m<100;m++)                     //延时11ms
       display();
    if(K1==0)
    {
       beep2();                                      //按键时响一声       
       set_flag=!set_flag;                        //设置标志位取反
     }
   }
 if(set_flag==1)                                   //若设置键按下,则检测K2-K4
 {
     SET_IND=0;                                 //设置灯亮
     if(K2==0)                                      //K2:十位加1
    {
       for(m=0;m<100;m++)                  //延时11ms
          display();    
       if(K2==0)
       {
          beep2();                                   //按键时响一声       
          set_data[2]++;
         if(set_data[2]==5) set_data[2]=0;
       }
   }
   if(K3==0)                                       //K3:个位加1
   {
      for(m=0;m<100;m++)                  //延时11ms
         display();    
      if(K3==0)
     { 
         beep2();                                    //按键时响一声       
         set_data[1]++;
         if(set_data[1]==10) set_data[1]=0;
     }
   }
   if(K4==0)                                        //K4:小数位加1
   {
       for(m=0;m<100;m++)                  //延时11ms
       display(); 
       if(K4==0)
       {
          beep2();                                   //按键时响一声       
          set_data[0]++;
          if(set_data[0]==10) set_data[0]=0;
        }
   }
  }
  else SET_IND=1;
}

/**********************************************/
/*显示函数
/**********************************************/
void display(void)
{
    if(set_flag)                                         //设置键按下,则显示设置的数值
    {
         dis_buf[0]=set_data[0];
         dis_buf[1]=set_data[1];
         dis_buf[2]=set_data[2];
    }
    else 
    {                                                       //否则显示温度值     
       dis_buf[0]=bcd_buf[0];
       dis_buf[1]=bcd_buf[1];
       dis_buf[2]=bcd_buf[2];
     }
     P1 = 0xff;		             // 先关闭所有数码管

     P1 = dis_code[dis_buf[0]];	             // 小数显示代码传送到P1口
     select2=1;select1=1;select0=0;            // 位选
     delay1ms(1);                                     //延时1ms
     P1 = dis_code[dis_buf[1]];	             // 个位显示代码传送到P1口
     select2=1;
     select1=0;select0=1;
     P17=0;
     delay1ms(1);                                     //延时1ms
     P1 = dis_code[dis_buf[2]];	            // 十位显示代码传送到P1口
     select2=0;select1=1;select0=1;						
     delay1ms(1);                                    //延时1ms
}
/**********************************************/
/*串口发送一个字符函数
/**********************************************/
void send_str(void)
{
   SBUF = ad_data;                                 //串口发送AD转换温度值
   while(TI==0);		            // 等待数据传送
   TI = 0;			            // 清除数据传送标志
}
/**********************************************/
/*主函数
/**********************************************/
void main(void)
{
   TMOD = 0x21;		            // 定时器1工作于方式2,8位自动重载模式, 用于产生波特率
	                                            // 定时器0工作于方式1,产生1s的AD间隔时间
   TH0=15536/256;                                 //T0定时50ms
   TL0=15536%256;
   TH1 = 0xe1;		            // 波特率1000
   TL1 = 0xe1;	
   SCON = 0x50;		            // 设定串行口工作方式1
   PCON = 0x00;		            // 波特率不倍增
   TI=0;                                                 //清除发送中断标志
	
   EA = 1;	   		            // 开总中断
   ET0 = 1;                                            //开T0中断
   ET1=0; 
   TR1 = 1;   		             // 启动T1
   TR0 = 1;                                             //启动T0
    while(1)
    {
       display();
       keyscan();
       if(TIMER0_flag)
       {
          TIMER0_flag=0;
           adc();
           BCD();
           send_str();
         }
     }
}

/**********************************************/
/*T0中断服务程序
/*每秒钟ADC一次,串口发送一次
/**********************************************/
void timer0(void) interrupt 1
{
  TH0=15536/256;                                     //重装初值
  TL0=15536%256;
  TIMER0_NUM++;
  if(TIMER0_NUM==20)
  {
     TIMER0_NUM=0;
     TIMER0_flag=1;
  }
}

⌨️ 快捷键说明

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