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

📄 powervolt.c

📁 用C51单片机测试模块,应用ADS1110转换芯片,扩展两片8255,32路AD通道,16k路DO,16路DI,正弦信号发生,RS232接口,(0~100MHz频率测试等功能),非常实用!
💻 C
📖 第 1 页 / 共 5 页
字号:

/********************************************************************/
/*                                                                  */
/* 防盗报警器系统测试程序 - ADS1110电压表测试多路电压               */
/*                                                                  */
/* LCD1602显示                                                      */
/* 参考电压接至5V电源                                               */
/* 最小输出电压:0.00V  最大输出电压:5.00V  分辨率:0.002V         */
/*                                                                  */
/* 邮箱:  wanping@fasttest.cn                                       */
/* 网站: http://www.fasttest.cn                                    */
/* 作者: owen wan                                                  */
/* 时间: 2007/02/13                                                */
/*                                                                  */
/*                                                                  */
/*【版权】Copyright(C)捷测电子 www.fasttest.cn  All Rights Reserved */
/*【声明】此程序属捷测电子版权所有,不得用于商业目的确良    !      */
/*                                                                  */
/********************************************************************/
#include <At89x52.h>
#include <intrins.h>
#include <absacc.h>

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long int

#define PA8255 XBYTE[0X8000]
#define PB8255 XBYTE[0X8001]
#define PC8255 XBYTE[0X8002]
#define COM8255 XBYTE[0X8003]


#define LCDON 0xfe
#define FAIL  0xfd
#define PASS  0xfb


sbit LCD_RS = P1^0;             
sbit LCD_RW = P1^1;
sbit LCD_EN = P1^2;
sbit SCL    = P1^3;
sbit SDA    = P1^4;
sbit Latch  = P1^5;	

sbit CS1_8255= P1^6;
sbit CS2_8255= P1^7;
sbit A0_8255 = P3^2;
sbit A1_8255 = P3^3;
sbit Start   = P3^4;
sbit CS_373  = P3^5;


uint idata dis[4]={0x00,0x00,0x00,0x00}; //定义3个显示数据单元和一个数据存储单元
float idata Limit[16]={494,546,1140,1260,1010,2016,1710,2016,2280,2520,2280,2520,1100,1320,600,1500};
//ulong idata Limit[14]={4940,5460,1140,1260,1710,1890,1650,1830,2280,2520,2280,2520,1180,1300};

uchar ReceiveBuffer[16];//={0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};
uchar SendBuffer[12];
uchar w,q,b,s,g;			  
uchar ACK;

uchar idata adc_hi;
uchar idata adc_lo;
uchar idata adc_cfg;

//******************************************************************************
volatile uchar MsgOk=0x00;
volatile uchar Rs232State=0x00;
volatile uchar Rs232Timer=0;		//单位:100ms
volatile uchar Timer1s=0;
volatile uchar Timer100ms=0;
volatile uchar Timer2500us=0;

bit w25msf;	//2.5ms标志
bit w100msf;//100ms标志
bit w1sf;   //1s标志

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

uchar code dis0[]  = {"Model:PLCD300-P1"};
uchar code dis1[]  = {"Press Start Botn"};

uchar code dis2[]  = {"SL120 +5V:  .  V"};
uchar code dis3[]  = {"SL120 12V:  .  V"};
uchar code dis4[]  = {"SL12 +18V:  .  V"};
uchar code dis5[]  = {"SL12 -18V:  .  V"};
uchar code dis6[]  = {"SL12 24Va:  .  V"};
uchar code dis7[]  = {"SL12 24Vb:  .  V"};
uchar code dis8[]  = {"SL120 Vbt:  .  V"};

uchar code dis9[]  = {"LL120 +5V:  .  V"};
uchar code dis10[] = {"LL120 12V:  .  V"};
uchar code dis11[] = {"LL12 +18V:  .  V"};
uchar code dis12[] = {"LL12 -18V:  .  V"};
uchar code dis13[] = {"LL12 24Va:  .  V"};
uchar code dis14[] = {"LL12 24Vb:  .  V"};
uchar code dis15[] = {"LL120 Vbt:  .  V"};

uchar code dis16[] = {"ML24V +5V:  .  V"};
uchar code dis17[] = {"ML24V 12V:  .  V"};
uchar code dis18[] = {"ML24 +18V:  .  V"};
uchar code dis19[] = {"ML24 -18V:  .  V"};
uchar code dis20[] = {"ML24 24Va:  .  V"};
uchar code dis21[] = {"ML24 24Vb:  .  V"};
uchar code dis22[] = {"ML24V Vbt:  .  V"};

uchar code dis23[] = {"ML120 +5V:  .  V"};
uchar code dis24[] = {"ML120 12V:  .  V"};
uchar code dis25[] = {"ML12 +18V:  .  V"};
uchar code dis26[] = {"ML12 -18V:  .  V"};
uchar code dis27[] = {"ML12 24Va:  .  V"};
uchar code dis28[] = {"ML12 24Vb:  .  V"};
uchar code dis29[] = {"ML120 Vbt:  .  V"};

uchar code dis30[] = {"SL230 +5V:  .  V"};
uchar code dis31[] = {"SL230 12V:  .  V"};
uchar code dis32[] = {"SL23 +18V:  .  V"};
uchar code dis33[] = {"SL23 -18V:  .  V"};
uchar code dis34[] = {"SL23 24Va:  .  V"};
uchar code dis35[] = {"SL23 24Vb:  .  V"};
uchar code dis36[] = {"SL230 Vbt:  .  V"};

uchar code dis37[] = {"NL230 +5V:  .  V"};
uchar code dis38[] = {"NL230 12V:  .  V"};
uchar code dis39[] = {"NL23 +18V:  .  V"};
uchar code dis40[] = {"NL23 -18V:  .  V"};
uchar code dis41[] = {"NL23 24Va:  .  V"};
uchar code dis42[] = {"NL23 24Vb:  .  V"};
uchar code dis43[] = {"NL230 Vbt:  .  V"};

uchar code dis44[] = {"Power Wat:   . W"};

uchar code dis46[] = {"Test Pass!      "};
uchar code dis47[] = {"Test Failed!    "}; 
uchar code dis48[] = {"Comm No Respond!"};
uchar code dis49[] = {"->> ->> ->> ->> "};


/********************************************************************/
/*                                                                  */
/*  延时函数                                                        */
/*                                                                  */
/********************************************************************/

void delay(uchar i)
{
    uchar k=20;
	while(i--)
	{
	while(k--);
	}
}
/********************************************************************/

void lcd_delay(uchar ms)
{
    while(ms--)
	{
      uchar i;
	  for(i=0;i<250;i++)   //延时 4us x 250 = 1ms  /
	   {
	    _nop_();			   
		_nop_();
		_nop_();
		_nop_();
	   }
	}
}		
  
/********************************************************************/
/*                                                                  */
/*检查LCD忙状态                                                     */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。       */
/*                                                                  */
/********************************************************************/ 

bit lcd_busy()
 {                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    result = (bit)(P2&0x80);
    LCD_EN = 0;
    return result; 
 }
 
/********************************************************************/
/*                                                                  */
/*写指令数据到LCD                                                   */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                              */
/*                                                                  */
/********************************************************************/

void lcd_wcmd(uchar cmd)

{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_(); 
    P2 = cmd;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EN = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EN = 0;  
}

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

void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P2 = dat;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EN = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EN = 0; 
}

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

void lcd_init()
{                        
    lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
    lcd_delay(5);
    lcd_wcmd(0x38);         
    lcd_delay(5);
    lcd_wcmd(0x38);         
    lcd_delay(5);

    lcd_wcmd(0x0c);      //显示开,关光标
    lcd_delay(5);
    lcd_wcmd(0x06);      //移动光标
    lcd_delay(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    lcd_delay(5);
}

/********************************************************************/
/*                                                                  */
/*  设定显示位置                                                    */
/*                                                                  */
/********************************************************************/

void lcd_pos(uchar pos)
{                          
  lcd_wcmd(pos | 0x80);  //数据指针=80+地址变量
}

/********************************************************************/
/*                                                                  */
/*  启动ADC转换值显示                                               */
/*                                                                  */
/********************************************************************/


show_value(ulong ad_data)

{   dis[3]=ad_data/1000;
	dis[3]=dis[3]+0x30;
    dis[2]=(ad_data%1000)/100;
	dis[2]=dis[2]+0x30;
	dis[1]=((ad_data%1000)%100)/10;
	dis[1]=dis[1]+0x30;
	dis[0]=(((ad_data%1000)%100)%10)/1;
	dis[0]=dis[0]+0x30;

	lcd_pos(0x4a);
	lcd_wdat(dis[3]);
    lcd_pos(0x4b);             
    lcd_wdat(dis[2]);    //整数位显示
    lcd_pos(0x4d);             
    lcd_wdat(dis[1]);    //第一位小数显示 
    lcd_pos(0x4e);             
    lcd_wdat(dis[0]);    //第二位小数显示                   
} 

show_value1(uchar qb,bb,sb,gb)

{   
    dis[3]=qb;
//	dis[3]=dis[3]+0x30;
    dis[2]=bb;
//	dis[2]=dis[2]+0x30;
	dis[1]=sb;
//	dis[1]=dis[1]+0x30;
	dis[0]=gb;
//	dis[0]=dis[0]+0x30;

	lcd_pos(0x4a);
	lcd_wdat(dis[3]);
    lcd_pos(0x4b);             
    lcd_wdat(dis[2]);    //整数位显示
    lcd_pos(0x4c);             
    lcd_wdat(dis[1]);    //第一位小数显示 
    lcd_pos(0x4e);             
    lcd_wdat(dis[0]);    //第二位小数显示                   
} 

/**********************************************************************/ 
/*  功能:发送一帧消息,消息格式参见设计说明入口:len=正文信息长度	  */
/*																	  */
/**********************************************************************/

void Send(uchar len)

{
	uchar *p;
		
	ES=0;		   //发送用查询方式,关闭串口中断
	p=SendBuffer;  	//发送正文信息
	do
	{
		SBUF=*p;
		p++;
		while(!TI);TI=0;
	}while(--len);
		
	ES=1;   //恢复串口中断
}


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

void Init1_8255(void)    /*8255 初始化 */
{
 CS1_8255=0;
 CS2_8255=1;
 A0_8255=1;
 A1_8255=1;
  _nop_ (); 
  _nop_ ();
  _nop_ ();
 COM8255 = 0x80;  //  设置1A口输出,1B口输出,1C口输入!
 _nop_ ();
 _nop_ ();
 _nop_ ();
 
}

/***********************************************************************/
void Port1A8255_write(uchar OpA1)
{
  A0_8255=0;   //写1A口;
  A1_8255=0;
  _nop_ (); 
  _nop_ ();
  _nop_ ();
  PA8255=OpA1;
}

void Port1B8255_write(uchar OpB1)
{ 
  A0_8255=1;	 //写1B口;
  A1_8255=0;
  _nop_ (); 
  _nop_ ();
  _nop_ ();
  PB8255=OpB1;
}

void Port1C8255_write(uchar OpC1)
{ 
  A0_8255=0;	 //写1B口;
  A1_8255=1;
  _nop_ (); 
  _nop_ ();
  _nop_ ();
  PC8255=OpC1;
}


/**************************************************************************/
/*																		  */
/*                   TMP106read and write                                 */
/**************************************************************************/

/***************************************************************************/			
/*    函数原型: void ads_start (void)      			         			   */
/*    功    能: 提供I2C总线工作时序中的起始位。                            */  
/***************************************************************************/	    
void ads_start (void) //在SCL高的情况下,SDA由高到低的变化造成START。
  {
	SDA=1;
	_nop_();
	SCL=1;
	_nop_();
	_nop_();
	_nop_();
	SDA=0;
	_nop_();
	_nop_();
	_nop_();
	SCL=0;
	_nop_();
	_nop_();
  }
/**************************************************************************/
/*    函数原型: void ads_stop(void)      							      */
/*    功    能: 提供I2C总线工作时序中的停止位。						      */
/**************************************************************************/
void ads_stop(void) //在SCL高的情况下,SDA由低到高的变化造成STOP。
  {

	SDA=0;
	_nop_();
	SCL=1;
	_nop_();
	_nop_();
	_nop_();
	SDA=1;

⌨️ 快捷键说明

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