📄 ups.c.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 + -