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

📄 main1.c

📁 电源检测系统 能够检测电源的过欠压,报警
💻 C
字号:
//头文件定义
#include <C8051F000.h> //寄存器定义
#include <intrins.h>   //内部函数
#include "stdio.h"
#include "math.h"

#include "System_Init.h"
#include "I2c.h"

#define uchar unsigned char
#define uint unsigned int

//内部调用
void Delay(uint sum);
void Delay_Ms(uint add);
void Display(void);
void Read_Data(void);
void Save_Data(void);

sbit led1 = P0^6;
sbit led2 = P0^7;
sbit led3 = P3^5;
sbit led4 = P3^4;

sbit ledd = P3^1;
sbit ledt = P3^2;
sbit ledv = P3^3;

sbit yuyin = P0^4;
sbit sss = P0^3;
//--------------------------------------------
//全局变量
//--------------------------------------------
bit Save_Flag;
bit Volt_Flag;
bit Date_Flag;
bit Time_Flag;
bit Alarm_Flag;
bit Disp_Flag;
bit Clea_Flag;
bit Soun_Flag;
bit Edit_Flag;

//uint i, j, m;
uint Voltage, Adc_Data;
long Voltage_Count;
uchar Second;
uchar Minite;
uchar Hour;
uchar Month;
uchar Date;
uchar Last_Minite;
uchar Last_Hour;
uchar Last_Month;
uchar Last_Date;
uint Mstcnt;
uchar Dispbitcnt;
uint tcnt;
uint Last_Voltage, Save_Voltage;
uchar Minite_Sure;

uchar Count;
uint m;

xdata uchar Led_Data[10]={0x3F, 0x21, 0x9B, 0xB3, 0xA5, 0xB6, 0xBE, 0x23, 0xBF, 0xB7};
xdata uchar Display_Buf[20];
xdata uchar E2p_Buf[10];

//主程序
main()
{
  uint i;
  //系统文件调用
  EA = 0;    //关中断
  System_Init();
  EA = 1;    //开中断 

  Save_Flag=1;
  Read_Data();
  for(i=0;i<20;i++)
  {
    Display_Buf[i]=8;
  }
  Delay_Ms(10);
  yuyin = 1;
  Read_Data();
  Clea_Flag = 0;
  Soun_Flag = 0;
  //主进程
  while(1)
  {
	if(Save_Flag==1)
	{
	  Save_Data();
	  Read_Data();
	  Save_Voltage = Last_Voltage;
	  Save_Flag=0;
	}
	else if(Edit_Flag==1)
	{
	  if(Minite_Sure<=57)
	  {
	    if(Minite>=(Minite_Sure+2))
		{
		  Volt_Flag = 0;
	      Date_Flag = 0;
	      Time_Flag = 0;//
	      Edit_Flag = 0;
		}
	  }
	  else
	  {
	    if(Minite==0)
		{
		  Volt_Flag = 0;
	      Date_Flag = 0;
	      Time_Flag = 0;//
	      Edit_Flag = 0;
		}
	  }
	}
  }
}

//延时
void Delay(uint sum)
{
  uint i, j;
  for(i=0;i<sum;i++)
  {
    for(j=0;j<500;j++);
  }
}

void Delay_Ms(uint add)
{
  uint i, j;
  for(i=0;i<add;i++)
  {
    for(j=0;j<50;j++);
  }
}
//TIME3中断
void Timer3_Isr(void) interrupt 14
{
  TMR3CN&=~0x80;  //清中断标志
  if(Save_Flag==0)
  {
  //按键1采集
  AMX0SL = 0x03;
  ADBUSY=1;
  while(!ADCINT);
  ADCINT=0;
  Adc_Data = ADC0H*256 + ADC0L;//Key_Sure
  if(Adc_Data<=0xFF)
  {
	Volt_Flag = 0;
	Date_Flag = 0;
	Time_Flag = 0;
	for(m=0;m<20;m++)
	{
	  Display();
	}
	Minite = Last_Minite;
    Hour = Last_Hour;
    Month = Last_Month;
    Date = Last_Date;
	Save_Flag = 1;
	Clea_Flag = 0;
	Edit_Flag = 0;
  }	  
  //按键2采集
  AMX0SL = 0x05;
  ADBUSY=1;
  while(!ADCINT);
  ADCINT=0;
  Adc_Data = ADC0H*256 + ADC0L;//Key_Date
  if(Adc_Data<=0xFF)
  {
	Minite_Sure = Minite;
	Last_Month = Month;
	Last_Date = Date;
	Last_Minite = Minite;
    Last_Hour = Hour;
	Volt_Flag = 0;
	Date_Flag = 1;
	Time_Flag = 0;
	for(m=0;m<10;m++)
	{
	  Display();
	}
	Clea_Flag = 1;	
	Edit_Flag = 1;
	Mstcnt = 400;
  }
  //按键3采集
  AMX0SL = 0x07;
  ADBUSY=1;
  while(!ADCINT);
  ADCINT=0;
  Adc_Data = ADC0H*256 + ADC0L;//Key_Time
  if(Adc_Data<=0xFF)
  {
	Minite_Sure = Minite;
	Last_Month = Month;
	Last_Date = Date;
	Last_Minite = Minite;
    Last_Hour = Hour;
	Volt_Flag = 0;
	Date_Flag = 0;
	Time_Flag = 1;
	for(m=0;m<10;m++)
	{
	  Display();
	}
	Clea_Flag = 1;
	Edit_Flag = 1;
	Mstcnt = 800;
  }
  //按键4采集
  AMX0SL = 0x02;
  ADBUSY=1;
  while(!ADCINT);
  ADCINT=0;
  Adc_Data = ADC0H*256 + ADC0L;//Key_Voltage
  if(Adc_Data<=0xFF)
  {
    Minite_Sure = Minite;
	Last_Month = Month;
	Last_Date = Date;
	Last_Minite = Minite;
    Last_Hour = Hour;
	Volt_Flag = 1;
	Date_Flag = 0;
	Time_Flag = 0;
	for(m=0;m<20;m++)
	{
	  Display();
	}
	Edit_Flag = 1;
	Clea_Flag = 1;
	Mstcnt = 0;
  }
  //按键5采集
  AMX0SL = 0x04;
  ADBUSY=1;
  while(!ADCINT);
  ADCINT=0;
  Adc_Data = ADC0H*256 + ADC0L;//Key_Left
  if(Adc_Data<=0xFF)
  {
	Minite_Sure = Minite;
	for(m=0;m<50;m++)
	{
	  Display();
	}
	if(Volt_Flag==1)
	{	  
	  if(Last_Voltage>1400)
	  {
	    Last_Voltage = 0;
	  }
	  else
	  {
	    Last_Voltage = Last_Voltage + 100;
	  }
	}
	else if(Date_Flag==1)
	{
	  if(Last_Month>=12)
	  {
	    Last_Month = 1;
	  }
	  else
	  {
	    Last_Month++;
	  }
	}
	else if(Time_Flag==1)
	{ 
	  if(Last_Hour>=23)
	  {
	    Last_Hour = 0;
	  }
	  else
	  {
	    Last_Hour++;
	  }
	}
	Edit_Flag = 1;
	Clea_Flag = 1;
  }
  //按键6采集
  AMX0SL = 0x06;
  ADBUSY=1;
  while(!ADCINT);
  ADCINT=0;
  Adc_Data = ADC0H*256 + ADC0L;//Key_Right
  if(Adc_Data<=0xFF)
  {
	Minite_Sure = Minite;
	for(m=0;m<50;m++)
	{
	  Display();
	}
	if(Volt_Flag==1)
	{
	  if(Last_Voltage<=10)
	  {
	    Last_Voltage = 1500;
	  }
	  else
	  {
	    Last_Voltage = Last_Voltage-10;
	  }
	}
	else if(Date_Flag==1)
	{
	  if(Last_Date<=1)
	  {
	    Last_Date = 31;
	  }
	  else
	  {
	    Last_Date--;
	  }
	}
	else if(Time_Flag==1)
	{
	  if(Last_Minite<=0)
	  {
	    Last_Minite = 59;
	  }
	  else
	  {
	    Last_Minite--;
	  }
	}
	Edit_Flag = 1;
	Clea_Flag = 1;
  }
  //电压采集
  AMX0SL = 0x00;
  ADBUSY=1;
  while(!ADCINT);
  ADCINT=0;
  Adc_Data = ADC0H*256 + ADC0L;
  if(Voltage<Save_Voltage)
  {
    Alarm_Flag = 1;
  }
  else
  {
    Alarm_Flag = 0;
  }
  if(Voltage<500)
  {
    Disp_Flag = 0;
	yuyin = 0;
	ledv = 1;
	ledd = 1;
	ledt = 1;
  }
  else
  {
    Disp_Flag = 1;
  }
  //电压的显示
  if(Volt_Flag==1)
  {		
    Display_Buf[0] = Last_Voltage/1000;
    Display_Buf[1] = (Last_Voltage%1000)/100;
    Display_Buf[2] = (Last_Voltage%100)/10;
    Display_Buf[3] = Last_Voltage%10;
  }
  else
  {
    Voltage_Count = Voltage_Count + Adc_Data/1.639;
	Count++;
	if(Count>=128)
	{
	  Voltage = Voltage_Count>>7;
	  Display_Buf[0] = Voltage/1000;
      Display_Buf[1] = (Voltage%1000)/100;
      Display_Buf[2] = (Voltage%100)/10;
      Display_Buf[3] = Voltage%10;
	  Count = 0;
	  Voltage_Count = 0;
	}
  }
  if(Disp_Flag==1)
  {
    Display();
	ledv = 1;
	ledd = 1;
	ledt = 1;
  }
  else
  {
    P2 = 0x00;
	ledv = 1;
	ledd = 1;
	ledt = 1;
  }
  if(Date_Flag==1)
  {
    Display_Buf[4] = Last_Month/10;
    Display_Buf[5] = Last_Month%10;
    Display_Buf[6] = Last_Date/10;
    Display_Buf[7] = Last_Date%10;
  }
  else
  {
    Display_Buf[4] = Month/10;
    Display_Buf[5] = Month%10;
    Display_Buf[6] = Date/10;
    Display_Buf[7] = Date%10;
  }
  if(Time_Flag==1)
  {
	Display_Buf[8] = Last_Hour/10;
    Display_Buf[9] = Last_Hour%10;
    Display_Buf[10] = Last_Minite/10;
    Display_Buf[11] = Last_Minite%10;
  }
  else
  {
	Display_Buf[8] = Hour/10;
    Display_Buf[9] = Hour%10;
    Display_Buf[10] = Minite/10;
    Display_Buf[11] = Minite%10;
  }
  }  
}
//时间定时
void Timer0_Isr(void) interrupt 1 using 0
{				    
  TL0 = 0x00;//D7
  TH0 = 0x80;//FE 
  //sss = 1;
  //yuyin = 1;
  tcnt++;
  if(tcnt>=91)
  {
    tcnt=0;
    Second++;
    if(Second>=60)
    {
      Second=0;
      Minite++;
      if(Minite>=60)
      {
        Minite=0;
        Hour++;
        if(Hour>=24)
        {
          Hour=0;
          Date++;
          if(Date>=31)
          {
            Date=1;
            Month++;
            if(Month>=13)
            {
              Month=1;
            }
          }
        }
      }
    }   
  }
  //Delay_Ms(2);//Delay(1);
  //sss = 0;
  //
  //yuyin = 0;      
}

//显示
void Display(void)
{
  Mstcnt++;
  if(Volt_Flag==1&&Mstcnt>=390)
  {
    Mstcnt = 0;
  }
  else if(Date_Flag==1&&Mstcnt>=790)
  {
    Mstcnt = 400;
  }
  else if(Time_Flag==1&&Mstcnt>=1190)
  {
    Mstcnt = 800;
  }
  if(Mstcnt<400)
  {
    ledv = 0;
	ledd = 1;
	ledt = 1;
	if(Clea_Flag==0&&Alarm_Flag==1)
	{
	  if(Mstcnt>=60)
	  {
	    led1 = 1;
	    yuyin = 1;
	  }
	  else
	  {
	    led1 = 0;
	    yuyin = 1;
	  }
	}
	else
	{
	  led1 = 0;
	  yuyin = 0;
	}
	led2 = 1;
	led3 = 1;
	led4 = 1;
	P2=Led_Data[Display_Buf[0]];//显示电压
	Delay(5);

	led1 = 1;
	if(Clea_Flag==0&&Alarm_Flag==1)
	{
	  if(Mstcnt>=60)
	  {
	    led2 = 1;
	  }
	  else
	  {
	    led2 = 0;
	  }
	}
	else
	{
	  led2 = 0;
	}
	led3 = 1;
	led4 = 1;
	P2=Led_Data[Display_Buf[1]];//显示电压
	Delay(10);

	led1 = 1;
	led2 = 1;
	if(Clea_Flag==0&&Alarm_Flag==1)
	{
	  if(Mstcnt>=60)
	  {
	    led3 = 1;
	  }
	  else
	  {
	    led3 = 0;
	  }
	}
	else
	{
	  led3 = 0;
	}
	led4 = 1;
	P2=Led_Data[Display_Buf[2]]+0x40;//显示电压
	Delay(10);

	led1 = 1;
	led2 = 1;
	led3 = 1;
	if(Clea_Flag==0&&Alarm_Flag==1)
	{
	  if(Mstcnt>=60)
	  {
	    led4 = 1;
	  }
	  else
	  {
	    led4 = 0;
	  }
	}
	else
	{
	  led4 = 0;
	}
	P2=Led_Data[Display_Buf[3]];//显示电压
	Delay(10);
	led4 = 1;
    if(Alarm_Flag==1)
	{
	  if(Mstcnt>=200)
	  {
	    Mstcnt = 0;
	  }
	} 
  }
  else if(Mstcnt<800&&Alarm_Flag==0)
  {
    ledv = 1;
	ledd = 0;
	ledt = 1;

	led1 = 0;
	led2 = 1;
	led3 = 1;
	led4 = 1;
	P2=Led_Data[Display_Buf[4]];//显示日期
	Delay(5);
	
	led1 = 1;
	led2 = 0;
	led3 = 1;
	led4 = 1;
	P2=Led_Data[Display_Buf[5]]+0x40;//显示日期
	Delay(10);
	
	led1 = 1;
	led2 = 1;
	led3 = 0;
	led4 = 1;
	P2=Led_Data[Display_Buf[6]];//显示日期
	Delay(10);
	
	led1 = 1;
	led2 = 1;
	led3 = 1;
	led4 = 0;
	P2=Led_Data[Display_Buf[7]];//显示日期
	Delay(10);
	led4 = 1;
  }
  else if(Mstcnt<1200&&Alarm_Flag==0)
  {	     
    ledv = 1;
	ledd = 1;
	ledt = 0;

	led1 = 0;
	led2 = 1;
	led3 = 1;
	led4 = 1;
	P2=Led_Data[Display_Buf[8]];//显示时间
	Delay(5);

	led1 = 1;
	led2 = 0;
	led3 = 1;
	led4 = 1;
	P2=Led_Data[Display_Buf[9]]+0x40;//显示时间
	Delay(10);

	led1 = 1;
	led2 = 1;
	led3 = 0;
	led4 = 1;
	P2=Led_Data[Display_Buf[10]];//显示时间
	Delay(10);

	led1 = 1;
	led2 = 1;
	led3 = 1;
	led4 = 0;
	P2=Led_Data[Display_Buf[11]];//显示时间
	Delay(10);
	led4 = 1;
  }
  else
  {
    Mstcnt = 0;
  }
}
//开机读取数据
void Read_Data(void)
{
  E2p_Buf[0] = SM_Receive(0xA0,0x0002);
  E2p_Buf[1] = SM_Receive(0xA0,0x0003);
  E2p_Buf[2] = SM_Receive(0xA0,0x0004);
  E2p_Buf[3] = SM_Receive(0xA0,0x0005);
  E2p_Buf[4] = SM_Receive(0xA0,0x0006);
  E2p_Buf[5] = SM_Receive(0xA0,0x0007);
  Last_Voltage = E2p_Buf[0]*256 + E2p_Buf[1];
  if(Last_Voltage>1500)
  {
    Last_Voltage = 1500;
  }
  Month = E2p_Buf[2];
  if(Month>12)
  {
    Month = 12;
  }
  Date = E2p_Buf[3];
  if(Date>31)
  {
    Date = 31;
  }
  Hour = E2p_Buf[4];
  if(Hour>23)
  {
    Hour = 23;
  }
  Minite = E2p_Buf[5];
  if(Minite>59)
  {
    Minite = 59;
  }
}

//定时保存数据
void Save_Data(void)
{
  E2p_Buf[0] = Last_Voltage/256;
  E2p_Buf[1] = Last_Voltage%256;
  E2p_Buf[2] = Month;
  E2p_Buf[3] = Date;
  E2p_Buf[4] = Hour;
  E2p_Buf[5] = Minite;
  SM_Send(0xA0,0x0002,E2p_Buf[0]);
  SM_Send(0xA0,0x0003,E2p_Buf[1]);
  SM_Send(0xA0,0x0004,E2p_Buf[2]);
  SM_Send(0xA0,0x0005,E2p_Buf[3]);
  SM_Send(0xA0,0x0006,E2p_Buf[4]);
  SM_Send(0xA0,0x0007,E2p_Buf[5]);
  /*
  if(E2prom_Addr>=32760)
  {
    E2prom_Addr = 20;
  }
  E2p_Buf[0] = Voltage/256;
  E2p_Buf[1] = Voltage%256;
  E2p_Buf[2] = Month;
  E2p_Buf[3] = Date;
  E2p_Buf[4] = Hour;
  E2p_Buf[5] = Minite;
  SM_Send(0xA0,E2prom_Addr,E2p_Buf[0]);
  E2prom_Addr = E2prom_Addr + 1;
  SM_Send(0xA0,E2prom_Addr,E2p_Buf[1]);
  E2prom_Addr = E2prom_Addr + 1;
  SM_Send(0xA0,E2prom_Addr,E2p_Buf[2]);
  E2prom_Addr = E2prom_Addr + 1;
  SM_Send(0xA0,E2prom_Addr,E2p_Buf[3]);
  E2prom_Addr = E2prom_Addr + 1;
  SM_Send(0xA0,E2prom_Addr,E2p_Buf[4]);
  E2prom_Addr = E2prom_Addr + 1;
  SM_Send(0xA0,E2prom_Addr,E2p_Buf[5]);
  E2prom_Addr = E2prom_Addr + 1;
  */
}

⌨️ 快捷键说明

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