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

📄 pc1490.c

📁 用C51单片机做的防盗报警器测试程序,主要实现AC/DC电压测试,频率测试,电流测试,正弦信号发生,数字IN/OUT等功能!
💻 C
📖 第 1 页 / 共 5 页
字号:
 _nop_ ();
 _nop_ ();
 _nop_ (); 

}

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

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

uchar Port1C8255_read(void)
{ 
  uchar PC1=0;
  CS1_8255=0;
  CS2_8255=1;       //读完1C口;
  A0_8255=0;
  A1_8255=1;
  PC1 = 0xff&PC8255;
  return PC1;
}

/*
void Port1C8255_write(uchar OpC1)
{ 
  CS1_8255=0;
  CS2_8255=1;       
  A0_8255=0;	 //写1C口;
  A1_8255=1;
  PC8255=OpC1;
  Timer100ms=3;
  while(Timer100ms);
}

*/
void Port2A8255_write(uchar OpA2)
{
  CS1_8255=1;
  CS2_8255=0;       
  A0_8255=0;   //写2A口;
  A1_8255=0;
  PA8255=OpA2;
}

void Port2B8255_write(uchar OpB2)
{ 
  CS1_8255=1;
  CS2_8255=0;       
  A0_8255=1;	 //写2B口;
  A1_8255=0;
  PB8255=OpB2;

}

uchar Port2C8255_read(void)
{ 
  uchar PC2=0;
  CS1_8255=1;
  CS2_8255=0;       
  A0_8255=0;   //读完2C口。
  A1_8255=1;
  PC2 = 0xff&PC8255;
  return PC2;

}
/*

void Port2C8255_write(uchar OpC2)
{ 
  CS1_8255=1;
  CS2_8255=0;       
  A0_8255=0;	 //写2C口;
  A1_8255=1;
  PC8255=OpC2;
  Timer100ms=5;
  while(Timer100ms);
}

*/

/**************************************************************************/
/*																		  */
/*                   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;
	_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  0   1   0   1   0	  0x0Ah

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

/* 设定串口模式为: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   1   0   1   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=0x0A;   	// TO 定时中断,T1外部计数中断,//串口中断开。
  IP=0x08;   	// T1 prior
//  SCON=0x50; 	// 方式1,10bit发送,接收中断使能。

  
  TMOD=0x51; 	// T1为16位外部计数,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)   //10ms TH0==0xF7;TL0=0x00;

  TH1=0x00;  	//T1用作外部计数测频率。
  TL1=0x00;
	
  TCON=0x50;//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()
{   uchar i;
	MsgOk=0x00;
	w100msf=0;
	w25msf=0;
	Fre_val=0;
	temp=0;
 	temp1=0;
	T1flow=0;
	Init();
	Init1_8255();         /*8255 初始化 */
	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:PC520-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=10;	 //20
       	  while(Timer2500us);
	      if (Start) 
		  {	MsgOk=0x00;
			w100msf=0;
			Fre_val=0;
			temp=0;
 			temp1=0;
			T1flow=0;
		    P0=0xf6;  //Power On/+12V
			Latch=1;     //74HC373 enable
			delay(255);
			Latch=0;	 //74HC373 dis_enable
			Timer1s=2;
			while(Timer1s); 
		
/****************************************************************************/
/*																		    */
/*	            第一组:电压测试, Voltage Test!!!			 			    */
/****************************************************************************/
			Init2_8255();
			Port2B8255_write(16);  //T293
			Init1_8255();
			Port1B8255_write(0);  //CD4514BC,4-16译码器控制CD4066第一通道ON。
  		    Timer100ms=10;		  //,T8 test +11.5V
			while(Timer100ms);
			write_ads(0x8c);
			read_ads();
			temp1=adc_hi;
			temp1=temp1<<8;
			temp1+=adc_lo;
		  	temp=(float)temp1/32768*2.048;
			temp*=1.01; //1.9
		  	temp*=1000;
			if ((temp>=Limit[0])&&(temp<=Limit[1]))
		     {
				lcd_pos(0x00);               //设置显示位置为第一行的第1个字符
    			i = 1;

⌨️ 快捷键说明

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