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

📄 all.c

📁 本系统的控制部分是以89C51为核心
💻 C
字号:
#include <at89x55.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h> //此文件中有_nop_()空操作函数
#define uchar unsigned char
#define uint unsigned int
/*AD1674引脚定义*/
#define ADCOM XBYTE[0x9fff]     /* 使A0=0, R/C=0, CS=0 */
#define ADLO  XBYTE[0xbfff]     /* 使R/C=1, A0=1, CS=0 */
#define ADHI  XBYTE[0x9fff]     /* 使R/C=1, A0=0, CS=0 */
sbit adbusy=P1^2;               /* STS */
sbit LF398=P1^4;
sbit A0=P1^3;
/************************************************************/
sbit FMQ=P2^7;//蜂鸣器,低电平有效
/*************************************LCD液晶脚定义***************************/
sbit   lcdCS    =  P1^5;	//片选 高电平有效 单片LCD使用时可固定高电平
sbit   lcdSID   =  P1^6;	//数据
sbit   lcdSCLK  =  P1^7;	//时钟
/********************************全局变量*******************************************/
uint Vmax,Vmin,Imax,Imin;//电压安全范围,电流完全范围
/*********************************LCD液晶函数定义******************************/
unsigned char code num[]={"0123456789 :.-"};
void Write_char(bit start, unsigned char ddata);//写指令或数据
void Send_byte(unsigned char bbyte);//发送一个字节
void Delaynms(unsigned int di);//延时
void Lcd_init(void);//LCD初始化
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s);//中英文显示
void LCD_set_xy( unsigned char x, unsigned char y );//光标定位
void Clr_Scr();//清屏
void LCD_Write_number(unsigned char s);//数字显示
/*AD1674函数定义*/
float AD1674(void);//启动1674
/*函数定义*/
void V_I_DIP();//电压电流显示
void dip_number(uint number);//数值显示
/***********************************************************************************/
 
/*************************主函数*****************************************************/
void main()
{
         lcdSID=0;
       	 Clr_Scr();//清屏
     	 Delaynms(1000);
         Lcd_init();//设置液晶显示器
         V_I_DIP();     
         
}
//***长延时***
void long_delay(void)
{
unsigned char i;
for (i=0;i<0x30;i++);
}

//***短延时***
void short_delay(void)
{
unsigned char i;
for (i=0;i<8;i++);
}
/******************************************************************************/
void Delaynms(unsigned int di) //延时
{
	unsigned int da,db;
 	for(da=0;da<di;da++)
   	for(db=0;db<10;db++);
}
/******************************初始化LCD************************************************/
void Lcd_init(void)
{
       Delaynms(10); //启动等待,等LCD讲入工作状态
  	lcdCS=1;
        //Write_char(0,0x82) ;
  	Write_char(0,0x30) ;  //8 位介面,基本指令集
  	Write_char(0,0x0c);  //显示打开,光标关,反白关
  	Write_char(0,0x01);  //清屏,将DDRAM的地址计数器归零
/*******************************************************/
        LCD_Write_string(1,0,"电压000V,");        
        LCD_Write_string(2,0,"范围180V至240V");
        LCD_Write_string(3,0,"电流0000mA,");
        LCD_Write_string(4,0,"范围0000至5000mA");
}

/*******************************写指令或数据***********************************/

void Write_char(bit start, unsigned char ddata) //
{
	unsigned char start_data,Hdata,Ldata;
  	if(start==0)
		start_data=0xf8;	 //写指令
    else
    	start_data=0xfa;  //写数据

  	Hdata=ddata&0xf0;		  //取高四位
  	Ldata=(ddata<<4)&0xf0;  //取低四位
  	Send_byte(start_data);	  //发送起始信号
  	Delaynms(5); //延时是必须的
  	Send_byte(Hdata);	      //发送高四位
  	Delaynms(1);  //延时是必须的
  	Send_byte(Ldata);		  //发送低四位
  	Delaynms(1);  //延时是必须的
}

/******************************************************************************/
void Send_byte(unsigned char bbyte) //发送一个字节
{
	unsigned char i;
 	for(i=0;i<8;i++)
   	{

   		lcdSCLK=0;			lcdSID=bbyte&0x80; //取出最高位
 		lcdSCLK=1;
   		bbyte<<=1; //左移
   	}
}


/******************************************************************************/
void Clr_Scr(void)//清屏函数
{
	Write_char(0,0x01);

}
/******************************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{	//设置LCD显示的起始位置,X为行,Y为列
    unsigned char address;
	switch(x)
	{
		case 0: address = 0x80 + y; break;
        case 1: address = 0x80 + y; break;
		case 2: address = 0x90 + y; break;
   	 	case 3: address = 0x88 + y; break;
		case 4: address = 0x98 + y; break;
		default:address = 0x80 + y; break;
	}
    Write_char(0, address);
}
/******************************************************************************/
void LCD_Write_number(unsigned char s)//	数字显示函数
{
	Write_char(1,num[s]);
	Delaynms(1);
}


/******************************************************************************/
void Delay(int num)//延时函数
{
	while(num--) ;
}

/******************************************************************************/
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
{	//	中英文字符串显示函数
    LCD_set_xy( X, Y );
    while (*s)
    {
         Write_char( 1, *s );
	   s ++;
         Delaynms(1);
   }
}
/***********************************AD1674函数*********************************/
float AD1674(void)
{              /* AD574转换函数 */
  uint hi,low,ad57;
  uint temp1,temp2;
  float result;
//  rd=1;
  ADCOM=0;                     /* 启动A/D转换 */
  while(adbusy==1);            /* 等待转换结束 */
 // rd=0;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  temp1= ADHI  ;
  temp2 = ADLO;
  hi= ADHI<<4;
  low=ADLO>>4;
  ad57=low+hi;
  result=(((float)ad57-0x800)*10)/0x7ff;
  return (result);
}
/******************************************************************************/

/**********************************电压电流测量显示******************************/
void V_I_DIP()
{
 uint Vout,Iout;
 TH0=0XB1;
 TL0=0X10;
/*测电压*/ 
 LF398=1;
 A0=0;
 Vout=AD1674()*44;
/*测电流*/ 
 A0=1;
 Iout=AD1674()*1000;
 LF398=0;
/*显示*/ 
 LCD_set_xy(1,2);
 dip_number(Vout);
 if(Vout<Vmin)
 {
   LCD_Write_string(1,5,"偏低");
   FMQ=0;Delay(10);
   FMQ=1;
  }
 else if(Vout>Vmax)
 {
   LCD_Write_string(1,5,"偏高");
   FMQ=0;Delay(10);
   FMQ=1;
  }
 else
 {
  LCD_Write_string(1,5,"安全");
  FMQ=1;
 }
  LCD_set_xy(1,2);
 dip_number(Iout);
 if(Iout<Imin)
 {
  LCD_Write_string(3,6,"偏低");
  FMQ=0;
  Delay(10);
  FMQ=1;
 }
 else if(Iout>Imax)
 {
  LCD_Write_string(3,6,"偏高");
  FMQ=0;
  Delay(10);
  FMQ=1;
  }
 else
 {
  LCD_Write_string(3,6,"安全");
  FMQ=1;
  }
}
/*************************数值显示******************************************/
void dip_number(uint number)
{
 uchar j,i,bb;
 uchar bi[5];
 if(number>999)i=4;
 else if (number>99)i=3;
 else if(number>9)i=2;
 else i=1;
 for(i;i>0;i--)
 {
  bi[i]=number%10;  
 }
 for(j=0;j>i;j++)
 {
  bb=bi[j];
  LCD_Write_number(bb);
 }
}

⌨️ 快捷键说明

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