文档库 最新最全的文档下载
当前位置:文档库 › 电压监测报警系统c程序

电压监测报警系统c程序

#include /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */

#define LCD_RS PTS_PTS3
#define LCD_RW PTS_PTS5
#define LCD_EN PTS_PTS7
#define LCD_DAT PTM

#define LED_R PTH_PTH6 //led灯
#define LED_G PTH_PTH1
#define LED_Y PORTE_PE5

#define FM PORTB_PB6

float dc=0,ac=0;
int i=0;
int ad0,ad1;

uchar a[7]="DC:";
uchar b[7]="AC:";

void dc_a(void);
void ADCInit(void);
float ad_dianya(int y);
void dc_a(void);
void ac_b(void);
void atd(void);
void xianshi(void);


void delay0(int m){
int n=10;
while(m--){
while(n--);
}
}
/***********时钟初始化程序*************/
void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{
CLKSEL=0x00;
PLLCTL_PLLON=1;
SYNR=0XC0 | 0X05;
REFDV=0X80 | 0X01;
POSTDIV=0X00;
_asm(nop);
_asm(nop);
while(0==CRGFLG_LOCK);//锁相环锁定
CLKSEL_PLLSEL=1;//选定外部时钟
}

/**************************************
** AD转换初始化 **
***************************************/

void ADCInit(void)
{
ATD0CTL1=0x00;
ATD0CTL2=0x40; //0100,0000,自动清除使能控制位,忽略外部触发
//转换结束允许中断,中断禁止
ATD0CTL3=0xA4; //0100,0100,转换序列长度为4; FIFO模式,冻结模式下继续转换
ATD0CTL4=0x05; //00001000,8位精度,PRS=5,ATDCLOCK=BusClock(24mb)/(5+1)*2,约为2MHz,采样周期位4倍AD周期
ATD0CTL5=0X20; //,连续AD转换,右对齐,单通道,无符号,起始通道为AN0
ATD0DIEN=0x00; //输入使能禁止
}

/*******************************************************************/
/* */
/* 延时子程序 */
/* */
/*******************************************************************/

void delay(uint us)
{
while(us--)
{
_asm(nop);
_asm(nop);
_asm(nop);
_asm(nop);
_asm(nop);
_asm(nop);
_asm(nop);
_asm(nop);
}
}

void delay_ms( uint z)
{ uint x,y;
for( x=z;x>0;x--)
for( y=800;y>0;y--);
}

/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。

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

void write_com(uchar com)
{


LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
delay(10) ;
LCD_DAT = com;
delay(10) ;
LCD_EN = 1;
delay(1500) ; //这个延时很重要,不然不能写完整的命令
LCD_EN = 0;
}

/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/

void write_date (uchar date)
{
//while(lcd_busy());

LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
delay(10) ;
LCD_DAT = date;
delay(10) ;
LCD_EN = 1;
delay(1500) ; //这个延时很重要,不然字符不能显示完整
LCD_EN = 0;
}

/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/

void lcd_init(void)
{
delay_ms(50);

write_com(0x38);
write_com(0x0c); //开显示,光标不闪烁
write_com(0x06);
write_com(0x01); //清除LCD的显示内容
delay_ms(10);
write_com(0x80);
delay_ms(10);

}



/*****************************************
** 将dc值存入数组a中 **
******************************************/

void dc_a(void)
{
int m=0;
uchar x=0,y=0,z=0;
m=(int)(dc*10);
x=m/100;
a[3]=x+'0';
m=m%100;
y=m/10;
a[4]=y+'0';
a[5]='.';
m=m%10;
a[6]=m+'0';

}


/*****************************************
** 将ac值存入数组b中 **
******************************************/

void ac_b(void)
{
int m=0;
uchar x=0,y=0,z=0;
m=(int)(ac*10);
x=m/100;
b[3]=x+'0';
m=m%100;
y=m/10;
b[4]=y+'0';
b[5]='.';

m=m%10;
b[6]=m+'0';

}

/*********************************************
** 根据AD值判断出输入的电压值 **
**********************************************/
float ad_dianya(int y)
{
float dianya=0;
if(y<=13)
dianya=1.0;
else if(y<=15)
dianya=1.1;
else if(y<=16)
dianya=1.2;
else if(y<=17)
dianya=1.3;
else if(y<=18)
dianya=1.4;
else if(y<=20)
dianya=1.5;
else if(y<=21)
dianya=1.6;
else if(y<=23)
dianya=1.7;
else if(y<=24)
dianya=1.8;
else if(y<=25)
dianya=1.9;
else if(y<=26)
dianya=2.0;
else if(y<=27)
dianya=2.1;
else if(y<=29)
dianya=2.2;
else if(y<=30)
dianya=2.3;
else if(y<=31)
dianya=2.4;
else if(y<=33)
dianya=2.5;
else if(y<=34)
dianya=2.6;
else if(y<=35)
dianya=2.7;
else if(y<=36)
dianya=2.8;
else if(y<=38)
dianya=2.9;
else if(y<=39)
dianya=3.0;
else if(y<=40)
dianya=3.1;
else if(y<=41)
dianya=3.2;
else if(y<=42)
dianya=3.3;
else if(y<=44)
dianya=3.4;
else if(y<=46)
dianya=3.5;
else if(y<=47)
dianya=3.6;
else if(y<=48)
dianya=3.7;
else if(y<=50)
dianya=3.8;
else if(y<=51)
dianya=3.9;
else if(y<=52)
dianya=4.0;
else if(y<=53)
dianya=4.1;
else if(y<=54)
dianya=4.2;
else if(y<=56)
dianya=4.3;
else if(y<=57)
dianya=4.4;
else if(y<=58)
dianya=4.5;
else if(y<=59)
dianya=4.6;
else if(y<=61)
dianya=4.7;
else if(y<=62)
dianya=4.8;
else if(y<=63)
dianya=4.9;
else if(y<=64)
dianya=5.0;
else if(y<=66)
dianya=5.1;
else if(y<=67)
dianya=5.2;
else if(y<=68)
dianya=5.3;
else if(y<=70)
dianya=5.4;
else if(y<=71)
dianya=5.5;
else if(y<=72)
dianya=5.6;
else if(y<=73)
dianya=5.7;
else if(y<=74)
dianya=5.8;
else if(y<=76)
dianya=5.9;
else if(y<=77)
dianya=6.0;
else if(y<=78)
dianya=6.1;
else if(y<=79)
dianya=6.2;
else if(y<=81)
dianya=6.3;
else if(y<=82)
dianya=6.4;
else if(y<=83)
dianya=6.5;
else if(y<=85)
dianya=6.6;
else if(y<=86)
dianya=6.7;
else if(y<=87)
dianya=6.8;
else if(y<=88)
dianya=6.9;
else if(y<=90)
dianya=7.0;
else if(y<=91)
dianya=7.1;
else if(y<=93)
dianya=7.2;
else if(y<=94)
dianya=7.3;
else if(y<=95)
dianya=7.4;
else if(y<=96)
dianya=7.5;
else if(y<=98)
dianya=7.6;
else if(y<=99)
dianya=7.7;
else if(y<=100)
dianya=7.8;
else if(y<=101)
dianya=7.9;
else if(y<=102)
dianya=8.0;
else if(y<=104)
dianya=8.1;
else if(y<=105)
dianya=8.2;
else if(y<=106)
dianya=8.3;
else if(y<=107)
dianya=8.4;
else if(y<=109)
dianya=8.5;
else if(y<=110)
dianya=8.6;
else if(y<=111)
dianya=8.7;
else if(y<=113)
dianya=8.8;
else if(y<=114)
dianya=8.9;
else if(y<=115)
dianya=9.0;
else if(y<=116)
dianya=9.1;
else if(y<=118)
dianya=9.2;
else if(y<=1

19)
dianya=9.3;
else if(y<=120)
dianya=9.4;
else if(y<=121)
dianya=9.5;
else if(y<=123)
dianya=9.6;
else if(y<=124)
dianya=9.7;
else if(y<=125)
dianya=9.8;
else if(y<=126)
dianya=9.9;
else if(y<=127)
dianya=10.0;


return dianya;
}

/************************************************
** 读出AD口的值,并判断是直流还是交流 **
**************************************************/

void atd(void)
{
ad0=0;
ad1=0;
if(ATD0DR0>0)
{
ad0=ATD0DR0;
dc=ad_dianya(ad0);
if(dc<=3.5) {
LED_R=0;
LED_G=0;
LED_Y=1;
FM=1;
delay0(5);
FM=0;
delay0(5);
}
else if(dc<5.5 && dc>3.5) {
LED_R=0;
LED_G=1;
LED_Y=0;
}
else if(dc>=5.5) {
LED_R=1;
LED_G=0;
LED_Y=0;
FM=1;
delay0(5);
FM=0;
delay0(5);
}
}
if(ATD0DR1>0)
{
ad1=ATD0DR1;
ac=ad_dianya(ad1);
}

}


/*****************************************
** 将ac和dc值在lcd上显示 **
******************************************/

void xianshi(void)
{
int i=0,j=0;
dc_a();
ac_b();

write_com(0x80);

for(i=0;i<7;i++)
{
write_date (a[i]);
delay_ms(20);
}

delay_ms(200);

write_com(0x80+0x40);
for(j=0;j<7;j++)
{
write_date (b[j]);
delay_ms(20);
}
}



void main(void) {
/* put your own code here */

DDRS=0XFF;
DDRM=0XFF;
DDRE=0xff;
DDRH=0xff;
DDRB=0xff;
PLL_Init();
ADCInit();
lcd_init();


for(;;)
{


atd();
xianshi();
}




}

相关文档
相关文档 最新文档