📄 main.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 + -