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

📄 ups.c.bak

📁 UPS报警系统
💻 BAK
字号:
/*********************************************************************************************************
**				                                  UPS
**                                       The Drive(For Keil c51)
**
**                                  (c) Copyright 2003-2004, baijianfeng
**                                           All Rights Reserved
**
**                                                  V0.0.1
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名:	UPS.C
**
**最后修改日期:  2005年6月1日
**描        述: 
**								222		4.36		30V
**								178		3.49V		24V			
**								134		2.62V		18V
**------------------------------------------------------------------------------------------------------
*/

#include <reg51.h>
#include <intrins.h>
#define ch0  0x03	//ch0通道	   输入时,右移,  011--->1 10,第一位为起始位  后面分别为SGL,ODD
#define ch1  0x07	//ch1通道					   111--->1 11
#define Uchar unsigned char
#define Uint  unsigned int

//AD 引脚定义
sbit cs  =P3^3;
sbit clk =P3^4;
sbit di  =P3^5;
//其它引脚定义
sbit diss=P1^6;
sbit bell=P1^5;
sbit ld	=P1^4;

//变量定义
Uchar voltage;
Uchar count;
Uchar timecount,num1;
Uchar bdata flash;
sbit	f=flash^0;
sbit	dis1=flash^1;
Uchar bdata ADvalue;              /* AD转换结果                                    */
sbit IN = ADvalue^0;

//函数
Uchar read(Uchar a)				//AD0832(力源TLC0832)转换子程序     采样频率由T0定时中断周期决定
{   
    Uchar i;
    EA=0;                   //开始AD转换后,关中断
    ADvalue=a;
	cs=1;
    cs=0;
	clk=0;
    for(i=0;i<3;i++)	   /*             地址输入3位              */
	 {	    
	     di=IN; 			   //IN是ADvalue的最低位
		 clk=0;				   //地址输入,上升沿
		 clk=1;
		 ADvalue=ADvalue>>1;   //右移
	 }
	clk=0;
	clk=1;
    di=1;                  //设置I/O口为输入状态
    for(i=0;i<8;i++)
    {		     
	    clk=1;			   //8位数据输出,下降沿  ,高位在前,低位在后
        clk=0;
		ADvalue=ADvalue<<1;		 //高位在前,所以左移输入
        IN=di;					 //从di管脚输入,存到寄存器
	}
	for(i=0;i<7;i++)			 //等过7个脉冲
	{
	    clk=1;
        clk=0;
	}
	cs=1;
	EA=1;						 //开中断
	return ADvalue;
}



//初始化
void InitSYS(void)
{
     TMOD = 0x11;			            /* 设置 定时器 T1 为十六位计数器(定时方式1) */
     SCON=0; 			                /* 模式 0                                   */
     TH0=0xcf;                          //25ms 
     TL0=0x00;
     ET0=1;				            /* 定时器 T0中断使能                        */
     TR0 = 1; 			                /* 定时器 T0计数使能                        */
     EA =1; 
}				  


//主函数
void start(void)
{
  voltage=read(ch0);
  bell=dis1 | !f;		 //消音后,蜂鸣器不叫
  ld=!dis1 & !f;		 //消音后,灯常亮
  if(!diss)	dis1=1;      //消音键按下,消音标志位置1(dis1=1)
}

//主程序
void main(void)
{ 
  InitSYS();
  while(1)
  {
    start();
  }  
}

/* 定时器 0 中断子程序*/
void Timing0Int(void) interrupt 1
{
    TH0=0xcf;
    TL0=0x00;
	 if(voltage<133)	count=6;
	 else count=(voltage-130)*2;			//确定valtage的一个范围,count值
	 	
	 if(timecount<count)	timecount++;	//计数器timecount		 f=0的时间(间隔)
	 else	{timecount=0;f=1;}				//f置1间隔

	 if(f)						 //报警音 长度
	 {
	   if(num1<3)	num1++;		 //num1=0->1->2->3,   75ms,f置0	  f=1的时间
	   else{num1=0;f=0;}
	 }
	 else	num1=0;
}

							

⌨️ 快捷键说明

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