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

📄 powervolt.c

📁 用C51单片机测试模块,应用ADS1110转换芯片,扩展两片8255,32路AD通道,16k路DO,16路DI,正弦信号发生,RS232接口,(0~100MHz频率测试等功能),非常实用!
💻 C
📖 第 1 页 / 共 5 页
字号:
	_nop_();
	_nop_();
	_nop_();
	SCL=0;
	_nop_();
	_nop_();
  }
/*****************************************************************************/
/*    函数原型: uchar ack_check(void)     								     */
/*    功    能: 提供I2C总线的时钟信号, 并返回在时钟电平为高期间SDA 信号线上状*/
/*              态。本函数可用于数据发送, 也可用于数据接收。 				 */
/*****************************************************************************/
uchar ack_check(void) // 检查应答信号
  {

	SCL=0;
	SCL=1;
	_nop_();
	if (SDA )
	{
	 ACK = 1;
	}
	else
	{
	 ACK = 0;
	}
	SCL=0;
	return(ACK);  // 如果收到ACK应答则返回0, 否则返回1。 		
  }
/****************************************************************************/
/*    函数原型: void ads_sendBYTE(uch data)         					    */
/*    功    能: 向I2C总线发送8位数据。          						    */
/****************************************************************************/
void ads_sendBYTE(uchar snd_data) // 发送一个字节
  {
	uchar bitcount=8;         // 发送8位数据。
    do
    {
       if((snd_data&0x80)==0x80)  //   从左到右选送D7,屏蔽D0~D6。
         {
           SDA=1; 			  //写 1
         }
       else
         {
           SDA=0; 		      //写 0
         }
		SCL=0;                //在时钟大于4u秒期间写数据
		SCL=1;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		SCL=0;
		snd_data=snd_data<<1;	      //   待送数据左移一位.
		bitcount--;
	} 
    while(bitcount);
    SDA=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
  }
/***************************************************************************/
/*    函数原型: ads_reciveBYTE(void)        							   */
/*    功    能: 从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节  */
/*              返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信 */
/*              号线处于浮置状态, 即使8052的Px.x脚置1。 				   */
/***************************************************************************/
uchar ads_reciveBYTE(void) //接受一个字节
  {
	uchar in_data=0;
	uchar bitcount1=8;
	do
	{ 	SCL=0; //在时钟大于4u秒期间读数据
		SCL=1;
		_nop_();
		_nop_();
		if(SDA) //读 1
		  {
			in_data=in_data|0x01;
	      }
		else //读 0
		  {
			in_data=in_data&0xfe;
          }

		SCL=0;

		if(bitcount1-1)
		  {
			in_data=in_data<<1;
		  }
			bitcount1--;
	}
	while(bitcount1);
    return(in_data);
  }
/****************************************************************************/
/*    函数原型: void function send_Ack(void);							    */
/*    功    能: 向I2C总线发送一个应答信号ACK, 一般用于连续数据读取时。	    */
/****************************************************************************/
void send_ack(void) // 发送连续读信号
  {
	SDA=0;
	SCL=0;
	SCL=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SCL=0;
  }

void send_nack(void) // 发送不连续读信号
  {
	SDA=1;
	SCL=0;
	SCL=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SCL=0;
  }
/****************************************************************************/
/*    函数原型: write_ads(uchar data)	         						    */
/*    功    能: 写器件地址和配置字。	                                    */
/****************************************************************************/
void write_ads(uchar snd_data) 	//写器件地址和配置字
  {
	ads_start();           	//开始写
	ads_sendBYTE(0x90);    	//写器件地址(写) 1001000x:x=0,write;x=1,read;
	do
	{
	 ;
    }while(ack_check());   	//等待应答
	ads_sendBYTE(snd_data);    	//写配置字
	do
	{
	 ;
	}while(ack_check());   	//等待应答
    ads_stop();             //结束写
  }
/****************************************************************************/
/*    函数原型: read_ads(void)		                					    */
/*    功    能: 数据读取。	                                                */
/****************************************************************************/
void read_ads(void)        	//从ADS1100中读出数据
  {
//  uchar adc_hi;
//	uchar adc_lo;
//	uchar adc_cfg;
	ads_start();           	//开始读
	ads_sendBYTE(0x91);    	//写器件地址(读)
	do
	{
	 ;
	}while(ack_check());     	//等待应答

	adc_hi = ads_reciveBYTE(); 	// 读高8位
	send_ack();             	//连续读
	adc_lo = ads_reciveBYTE(); 	//读低8位
	send_ack();              	//连续读
	adc_cfg = ads_reciveBYTE(); //读配置字
	send_nack();
	ads_stop(); 				//结束读
  }


/*****************************************************************************/
/*  		SST58 CPU初始化配置									             */
/*****************************************************************************/
/* 中断配置:本系统仅使用串口中断(高优先级),外部计数中断T1和定时中断0(低优先级),
/* BIT 7  6   5  4   3   2   1   0   
/* IE: EA -  ET2 ES ET1 EX1 ET0 EX0
/*     0  0   0  1   0   0   1   0	  0x1Ah

/* BIT 7  6   5  4   3   2   1   0
/* IP: -  -  PT2 PS PT1 PX1 PT0 PX0
/*     0  0   0  1   0   0   0   0	  0x10h

/* 设定串口模式为:8位波特率可编程单机模式,即模式1,置接收使能
/* BIT    7   6   5   4   3   2  1  0
/* SCON: SM0 SM1 SM2 REN TB8 RB8 TI RI
/*        0   1   0   1   0   0  0   0	    0x50h

/* BIT    7   6   5   4   3   2  1  0
/* TMOD: GAT C/T M1  M0 GATE C/T M1 M0
/*        0   0   1   0   0   0  0  1	    0x51h

/* BIT    7   6   5   4   3   2   1   0
/* TCON  TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
/*        0   1   0   1   0   0   0   0	    0x50h

/* BIT    7   6    5    4     3    2   1    0
/* T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T CP/RL2
/*        0   0    1    1     0    1   0    0	   0x34h

/* BIT    7   6   5   4   3   2   1   0
/* T2MOD: -   -   -   -   -   - T2OE DCEN
/*        x   x   x   x   x   x   0   0	     0x00h
/*****************************************************************/
void Init()
{
  uchar i,j;
  for(i=0;i<200;i++) for(j=0;j<250;j++); //delay some time for stable
    
  P0=0xFF;	 	//I/O端口初始化
  P1=0xFF;	 	//
  P2=0xFF;	 	//
  P3=0xFF;	 	//  
  IE=0x12;   	// TO 定时中断,串口中断开。
  IP=0x10;   	// ES prior
  SCON=0x50; 	// 方式1,10bit发送,接收中断使能。

  
  TMOD=0x21; 	// T1为波特率发生器MODE2,T0为16位软件重载定时,MODE1。
  TH0=0xF7;	 	// 2.5ms=0.0025=Tosc*12*(65536-T0)==>T0=65536-0.0025*Fosc/12=0xF700(Fosc=11.0592)
  TL0=0x00;  	//T0用作2.5mm定时器,T0=0xF63C (Fosc=12Mhz)

  TH1=0xFD;  	//TH1=256-Fosc/{[2^(1-SMOD)]*16*12*9600bps}=0xFD
  TL1=0xFD;
  
  TCON=0x50;	//使能T0,T1。
  PCON=0x00;	//SMOD=0,波特率不加倍。
  
//  T2CON=0x34;   //波特率收发使用相同的发生率,开T2时钟。
//  T2MOD=0x00;
//  RCAP2L=0xD9;  //波特率9600,12M晶振,12时钟模式。
//  RCAP2H=0xFF;  
//  TL2=0xD9;
//  TH2=0xFF;     //T=Fosc/{n*[65536-(RCAP2H*RCAP2L)]},N=2 /6时钟;N=4 //12时钟,T2用作9600bps的波特率发生器
  EA=1;
}

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


/********************************************************************/
/*                                                                  */
/*                          主程序                                  */
/*                                                                  */
/********************************************************************/
void main()
{  
	ulong temp1;
	float temp;
	uchar i;
	Init();
	MsgOk=0x00;
	Init1_8255();    /*8255 初始化 */
	Port1A8255_write(0); 
	Port1C8255_write(0);
	Port1B8255_write(0);
    CS_373=0;
	P0=LCDON;   //Bklight=0;    // On LCD backligh
	Latch=1;     //74HC373 enable
	delay(255);
	Latch=0;	 //74HC373 dis_enable
	lcd_delay(10);                 //延时
    lcd_init();                //初始化LCD 
    lcd_pos(0);               //设置显示位置为第一行的第1个字符
    i = 0;
    while(dis0[i] != '\0')
     {                         //显示字符"Model:PC1410-1-B"
       lcd_wdat(dis0[i]);
       i++;
     }

	lcd_pos(0x40);               //设置显示位置为第一行的第1个字符
    i = 0;
    while(dis1[i] != '\0')
     {                         //显示字符"Start Testing..."
       lcd_wdat(dis1[i]);
       i++;
     } 
	   
	while(1)
	   {
		if (!Start)  //治具压下
		{ Timer2500us=20;
       	  while(Timer2500us);
	      if (Start) 
		  {	
			CS_373=0;
//			CS1_8255=1;
	        P0=LCDON;
			Latch=1;     //74HC373 enable
			delay(255);
			Latch=0;	 //74HC373 dis_enable
		
/**************************************************************************/
		
/****************************************************************************/
/*																		    */
/*	第一组:120V输入K1,STB负载开K3,状态开关OFF / K15	    			    */
/****************************************************************************/
			Init1_8255();
			Port1A8255_write(1);  //110V电源开
  		    Timer1s=2;
			while(Timer1s); 
			Port1A8255_write(133);  //110V电源开,负载STB110开,+5V开
  	//	    Timer1s=1;
	//		while(Timer1s);
			Timer100ms=5;
			while(Timer100ms);
			write_ads(0x8c);
			read_ads();
			Timer100ms=5;
			while(Timer100ms);
			write_ads(0x8c);
			read_ads();
			temp1=adc_hi;
			temp1=temp1<<8;
			temp1+=adc_lo;
		  	temp=(float)temp1/32768*2.048;
			temp*=1.029;
		  	temp*=1000;
			if ((temp>=Limit[0])&&(temp<=Limit[1]))
		     {
				lcd_pos(0x00);               //设置显示位置为第一行的第1个字符
    			i = 0;
    			while(dis46[i] != '\0')	     //显示字符"Test Pass"
     			{                         
       				lcd_wdat(dis46[i]);
       				i++;
     			}
				lcd_pos(0x40);             //设置显示位置为第二行第1个字符
    			i = 0;
    			while(dis2[i] != '\0')	   //显示结果
    			{
      				lcd_wdat(dis2[i]);      
      				i++;
    			}
				show_value(temp);           //n中数据处理与显示         
          		lcd_delay(50);
			
 			  }
		  	else
		  	{
			
		  		lcd_pos(0x00);               //设置显示位置为第一行的第1个字符
    			i = 0;
    			while(dis47[i] != '\0')	     //显示字符"Test Fail "
     			{                         
       				lcd_wdat(dis47[i]);
       				i++;
     			}
				lcd_pos(0x40);             //设置显示位置为第二行第1个字符
    			i = 0;
    			while(dis2[i] != '\0')
    			{
      				lcd_wdat(dis2[i]);     //显示结果 
      				i++;
    			}
				show_value(temp);           //n中数据处理与显示         
          		lcd_delay(50);
				goto ERROR;
			    
    	     }

		
/**************************************************************************/
			Port1A8255_write(5);  //110V电源开,负载STB110开
  		    Timer100ms=2;
			while(Timer100ms);
			Port1C8255_write(1);  //+12V开
  		    Timer100ms=5;
			while(Timer100ms);
			write_ads(0x8c);
			read_ads();
			temp1=adc_hi;
			temp1=temp1<<8;
			temp1+=adc_lo;
		  	temp=(float)temp1/32768*2.048;
			temp*=0.05;
		  	temp*=1000;
			if ((temp>=0)&&(temp<=100))
		     {
//			    V51=1;
				lcd_pos(0x00);               //设置显示位置为第一行的第1个字符
    			i = 0;
    			while(dis46[i] != '\0')	     //显示字符"Test Pass"
     			{                         
       				lcd_wdat(dis46[i]);
       				i++;
     			}
				lcd_pos(0x40);             //设置显示位置为第二行第1个字符
    			i = 0;
    			while(dis3[i] != '\0')	   //显示结果
    			{
      				lcd_wdat(dis3[i]);      
      				i++;
    			}
				show_value(temp);           //n中数据处理与显示         
          		lcd_delay(50);
			
 			  }
		  	else
		  	{
			
//				V51=0;
		  		lcd_pos(0x00);               //设置显示位置为第一行的第1个字符
    			i = 0;
    			while(dis47[i] != '\0')	     //显示字符"Test Fail "
     			{                         
       				lcd_wdat(dis47[i]);
       				i++;
     			}
				lcd_pos(0x40);             //设置显示位置为第二行第1个字符
    			i = 0;
    			while(dis3[i] != '\0')
    			{
      				lcd_wdat(dis3[i]);     //显示结果 
      				i++;
    			}
				show_value(temp);           //n中数据处理与显示         
          		lcd_delay(50);
				goto ERROR;
			    
    	     }

/**************************************************************************/ 
	  	    Port1C8255_write(0); //+12V关
  		    Timer100ms=2;
			while(Timer100ms);
			Port1C8255_write(2);  //+18V开
  		    Timer100ms=5;
			while(Timer100ms);
			write_ads(0x8c);
			read_ads();
			temp1=adc_hi;
			temp1=temp1<<8;
			temp1+=adc_lo;
		  	temp=(float)temp1/32768*2.048;
			temp*=0.05;
		  	temp*=1000;
			if ((temp>=0)&&(temp<=100))

⌨️ 快捷键说明

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