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

📄 main.c

📁 利用stc12c2052单片机测量空气质量的
💻 C
字号:
/***************************************************************************************/
// Header:
// File Name: 
// Author:
// Date:
/***************************************************************************************/
    #include <stc12c2052.h>
#include <user.h>       
#include <main.h>     

/***************************************************************************************/

/***************************************************************************************/
//program start from main()  while power on
void main(void)
{
 PowerOnInitial();
 AirSensorCheck();
 

}
/***************************************************************************************/
void PowerOnInitial(void)
{
 InitialCpu();
 InitialCpuIO();
 InitialVariable();
}
/**********************************************************/
void InitialCpu(void)
{
IE=0;   //disable all interrupt
PSW=0;  //bank 0
IP=0X0B;//enable interrupt:int0,count0,int1
//SCON=0x50;		//8位可变波特率,无奇偶校验
TMOD=0x03;	//time 0工作在第三种模式下 定时器1为8位自动重装计数器
TL0=0x59;	//设置TL0初值,定时0.5ms

EA=1;
ET0=1;
ET1=1; 		//开中断
TR1=1;		//开TH0中断
TR0=0;      //TL0作为计数器
}
void InitialCpuIO(void)
{
P1M0=0xe0;
P1M1=0xe0;   //P1口设置为普通IO口
P3M0=0xde;
P3M1=0xda;  ////P3口设置为普通IO口
P1=0x07;
P3=0x01;
P1_3=0;
P1_4=0;
DispHC595(0x00);
}

void InitialVariable(void)
{msec1=0;
 msec2=0;
 ucount1=0;
}
/**********************************************************/
/********      interrupt time0 program             ********/
/******** 4MHz 晶振 500us中断
/**********************************************************/
void TimeH0Int(void) interrupt 1   using 3  //interrupt time 0
{TH0=0x59;	//设置TL0初值,定时0.5ms
 TR1=1;
 TF1=0;
 if (msec1>=200)
 {msec1=0xff;
  if (msec2>=10)
   {msec2=0xff;
    sensorsec--;
    if (sec>=59)
     {sec=0x00;
      pulsemin--;
     }
    sec++;
   }
   msec2++;
 }
 msec1++;
}
/**********************************************************/
/********      interrupt count0 program             ********/
/**********************************************************/
void Count0Int(void) interrupt 0   using 3  //count time 0
{TL0=0;		//设置TL0初值,定时0.5ms
 TF0=0;
 ucount1++; 
}
/**********************************************************/
/********             beep  program                ********/
/********    tone : beep 频率                      ********/
/**********************************************************/
void Beep(void)
{ 
uchar j,k;
for(j=18;j!=0;j--)
 {
  for(k=50;k!=0;k--)
  P3_5=0;
  for(k=50;k!=0;k--)
  P3_5=1;
 }
}
/**********************************************************/
/********            动态扫描显示程序              ********/
/********入口参数:uADresult 要显示得的一段段码值    ********/
/**********************************************************/
void DispLed(uchar tempdata)
{
uchar codetab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
 				//0   ,1   ,2   ,3   ,4   ,5   ,6   ,7   ,8   ,9
 DispHC595(0);
 P1_3=0;
 P1_4=1;    //先显示低位
 DispHC595(codetab[0x0f&tempdata]);
 DispHC595(0);
 P1_3=1;
 P1_4=0;    //显示第二个数码管
 DispHC595(codetab[0x0f&(tempdata>>4)]);
}
/**********************************************************/
/********         动态扫描显示HC595驱动            ********/
/********入口参数:dispdata 要显示得的一段段码值    ********/
/********DAT_595=P1^5;  //595数据脚                ********/
/********RCK_595=P1^6;  //595锁存脚                ********/
/********CLK_595=P1^7;  //595时钟脚                ********/
/**********************************************************/
void DispHC595(uchar tempdata)
{
 uchar i;

  for(i=0;i<8;i++)//八位数据以此发送
    {
     if(tempdata &(0x01<<i) )  
     {DAT_595=1;}//先发送低位
     else
     {
	  DAT_595=0;
	 }
     CLK_595=1;
     CLK_595=0;//产生时钟
    }
    RCK_595=1;
    RCK_595=0;//输出数据
}


/**********************************************************/
/********              延 时 子 程                 ********/
/********delaycount: 次数                          ********/
/********总共延迟时间:delaycount*1ms               ********/
/**********************************************************/

void Delay(uchar delaycount)
{
 uchar j;
 while (delaycount--!=0)
 {
  for (j=24;j!=0;j--)
  ;
 }
}
/**********************************************************/
/********           质量检测及AD转换程序           ********/
/********P3.7:  标准电阻冲放电时间口               ********/
/********P3.2:  待测电阻检测扣                     ********/
/**********************************************************/
void  MeasureSensorVoltage(void)
{
 uchar j;
 tempdata1=0x7f;	//设置初始占空比D1
 while (P3_2!=1)	//RA1为低时中止
 { tempdata1+=1;
  for (j=10;j!=0;j--)
   {P3_7=0x01;	//设置RA0=1
   	MeasureDelay(tempdata1);
   	tempdata2=0xff-tempdata1;
	P3_7=0x00;	//设置RA0=0
   	MeasureDelay(tempdata2);   	
   }
 }
  uADresult=(5*tempdata1)/(tempdata1+tempdata2);
}
 ////////////////////////////////////////////////
void MeasureDelay(uchar tempdata1)
{
 uchar j;
 for (j=tempdata1;j!=0;j--)
 ;
}
/**********************************************************/
/********              HEX转BCD子程                ********/
/********hex_data(<0xff,>0)                        ********/
/**********************************************************/
uchar HexToBcd(uchar tempdata1)
{
    tempdata2=tempdata1%100;
    tempdata=tempdata1/100<<8;
    tempdata=tempdata|tempdata2/10<<4;
    tempdata=tempdata|tempdata2%10;
    return tempdata;
}
/**********************************************************/
/********         TP-4空气污染传感器检测           ********/
/********P3.4:  并联降压电路控制口                 ********/
/********P3.3:  传感器电压检测口                    ********/
/**********************************************************/
void  AirSensorCheck(void)
{ 
  P3_4=1;	//开启并联降压电路
  sensorsec=5;
  if(sensorsec>0)
  {//延时5秒
   ;
   }
  P3_4=0;  //关闭并联电路
  
  MeasureSensorVoltage();
  if (checkvoltage>0)
  {// 传感器故障
  ;}
  else 
  { } 
  if (checkvoltage>42)
  {
   sensorsec=30;  
   MeasureSensorVoltage();
    
}

}










⌨️ 快捷键说明

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