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

📄 51

📁 51单片机大量源码
💻
📖 第 1 页 / 共 2 页
字号:
	{
	   SDA = 1;
	   SCL = 1;
	   tdata =tdata<<1;		    //左移一位
	   	if(SDA == 1)
		  tdata = tdata|0x01;   // 若接收到的位为1,则数据的最后一位置1
		else 
		  tdata = tdata&0xfe;   // 否则数据的最后一位置0
	   SCL = 0;
	 }

	 return(tdata);
}
//-------------------------------------------------------------------
// 函数名称: ADC_PCF8591
// 入口参数: controlbyte控制字
// 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
//-------------------------------------------------------------------
void ADC_PCF8591(uchar controlbyte)
{ 
    uchar idata receive_da,i=0;

	iic_start();

	IICSendByte(PCF8591_WRITE);	//控制字
	check_ACK();
	if(askflag == 1)
	{
		SystemError = 1;
		return;
	}

	IICSendByte(controlbyte);	//控制字
	check_ACK();
	if(askflag == 1)
	{
		SystemError = 1;
		return;
	}

    iic_start();                //重新发送开始命令
   	IICSendByte(PCF8591_READ);	//控制字
	check_ACK();
	if(askflag == 1)
	{
		SystemError = 1;
		return;
	}
	 
    IICreceiveByte();   //空读一次,调整读顺序
    slave_ACK();        //收到一个字节后发送一个应答位

	while(i<4)
	{  
	  receive_da=IICreceiveByte();
	  receivebuf[i++]=receive_da;
	  slave_ACK();       //收到一个字节后发送一个应答位
	}
	slave_NOACK();       //收到最后一个字节后发送一个非应答位
	iic_stop();
}

//液晶刷新 

void lcd_flash(void)
{
	unsigned char  i = 0;
	lcd_pos(0);                //设置显示位置为第一行的第1个字符
    while(dis4[i] != '\0')
    {                         //显示字符
       lcd_wdat(dis4[i]);
       i++;
    }
    lcd_pos(0x40);             //设置显示位置为第二行第1个字符
    i = 0;
    while(dis5[i] != '\0')
    {
       lcd_wdat(dis5[i]);      //显示字符
       i++;
    }
}


//********************************************************
//函数功能:定时器T0的相关程序
//*******************************************************
#define T0start()    TR0 = 1;                   //启动定时器T0开始运行
#define T0off()      TR1 = 0;					//关闭T0定时器
#define T2start()    TR2 = 1;				    //开启T2计数器
#define T2off() 	 TR2 = 0;					//关闭T2计数器
//unsigned int x;
unsigned char num;
//t0初始化
void intt0init()
{
	TMOD = 0x01;                //使用定时器T0
	TH0 = (65536-50000)/256;    //将定时器计时时间设定为50毫秒		  //=50000微秒=50毫秒
	TL0 = (65536-50000)%256;
	EA = 1;                    //开启总中断
	ET0 = 1;                   //定时器T0中断允许

	T0start();
	T2start();
}
//t0中断

void interserve(void ) interrupt 1 using 1  
{			
	T0off();     //关闭定时器T0									    50MS一次中断
	EA = 0;
	num++;
	if(num == 40)     //够20次中断,即1秒钟进行一次检测结果采样			  // 1.086*2   0.59us
	{
		T2off();      //开启计数器T2
		if(ov_flage == 1){
			x =  freq;
			x += 0xffff; //
		}else{
			x =  freq;
		}
		ov_flage = 0;	 //溢出标志位清0
	   	freq = 0;		 //频率清0
		num = 0;
		TH2 = 0x00;   //重新给计数器T0赋初值
		TL2 = 0x00;
	}		      
  	TH0 = (65536-50000)/256;   //重新给计数器T0赋初值
	TL0 = (65536-50000)%256;
	EA = 1;
	T0start();    //开启定时器T0
	T2start();    //开启计数器T2
 } 

//----------------------------------------------------------------------
//定时器中断2
void INTT2init(void)
{
	C_T2 = 1;  	  //选择信号输入
	EXEN2 = 0;
	CP_RL2 = 0;
	ET2 = 1;      //开启定时器2中断
  	TH2 = 0x00;   //重新给计数器T0赋初值
	TL2 = 0x00;
	
}
 //计数器溢出中断
void intt2(void ) interrupt 5 using 3 
{
	T2off();
	TF2 = 0;	//清除中断标志位
	EXF2 = 0; 	//清除捕获标志位
//	x++;
	ov_flage = 0x01; //置位溢出标志位
	
//	TH2 = 0xFF;   //重新给计数器T0赋初值
//	TL2 = 0xFB;
//	TR2 = 1;
}

//----------------------------------------------------------------------
//外部中断输入
void INT0init(void)
{
   EA=1;   //开放总中断
   EX0=1;  //允许使用外中断
   IT0=1;  //选择负跳变来触发外中断
}
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{
	freq++;
}

//-------------------------------------------------------------------
void fre_value(unsigned int data1)
{
	dis[0] = data1%10;// + 0x30;
	dis[0] += 0x30;
	dis[1] = data1%100;
	dis[1] /= 10;
	dis[1] += 0x30;
	dis[2] =  data1%1000; 
	dis[2] /= 100;
	dis[2] += 0x30;
	dis[3] =   data1/1000;
	//dis[3] = 0;
	dis[3] += 0x30; 
}
//-------------------------------------------------------------------
// 函数名称: main
// 函数功能: 主程序
//-------------------------------------------------------------------
main()
{
//    uchar l;
//	uchar buffer;
	unsigned long  buf;
	unsigned int buf1;

//	EXEN2 = 1;

	PT0 = 1;					// 外部中断设置为高优先级
//	PX0 = 1;					// 外部中断设置为高优先级


    lcd_init();                //初始化LCD                
    lcd_pos(0);                //设置显示位置为第一行的第1个字符
	lcd_flash();

	intt0init();  	 		   //定时器T0初始化
	INTT2init();               //定时器T2初始化
	INT0init();
    EA = 1;
	T0start();     	//开启定时器T0

  while(1)
  {
  	EA = 0;
	iicInit();	              //I2C总线初始化
    ADC_PCF8591(0x04);
	if(SystemError == 1)	  //有错误,重新来
	{
	  	iicInit();				  //I2C总线初始化
	    ADC_PCF8591(0x04);
	 }
	 EA = 1;   
	 //	lcd_flash();
	// for(l=0;l<4;l++)	
	// {

	delay(200);				   //刷新速率 延迟
	show_value(receivebuf[0]);
	if(PIN == 0){
		buf1 = (dis[2]-0x30)*100;
		buf1 += (dis[1]-0x30)*10;
		buf1 += (dis[0]-0x30);
		buf1 *= 2;
		if(buf1 > 999)
		{
			buf1 = 999;
		}
		fre_value(buf1);            //
	}	
	    lcd_pos(0x08);             
        lcd_wdat(dis[2]);        //整数位显示
        lcd_pos(0x0A);             
        lcd_wdat(dis[1]);        //
        lcd_pos(0x0b);             
        lcd_wdat(dis[0]);        //

		if((x > 999)&&(x<9999))
		{
		//	buf = x*2;
			buf = x;
			buf /=10;
			
			fre_value(buf);            //	 
			lcd_pos(0x4a);             
        	lcd_wdat(dis[2]);        //整数位显示

        	lcd_pos(0x4b);              
        	lcd_wdat('.');        //第一位小数显示 

        	lcd_pos(0x4c);             
        	lcd_wdat(dis[1]);        //第二位小数显示

	    	lcd_pos(0x4d);             
        	lcd_wdat(dis[0]);        //第二位小数显示

			lcd_pos(0x4e);             
        	lcd_wdat('K');        //第二位小数显示

			lcd_pos(0x4f);             
        	lcd_wdat('H');        //第二位小数显示

		}else if(x>9999)
		{
   			if(x >100000)
			{
				x = 0;
			}	   
		//	buf = x*2;
			buf = x;
			buf /= 100;
			fre_value(buf);            //	 
			lcd_pos(0x4a);             
        	lcd_wdat(dis[2]);        //整数位显示
        	lcd_pos(0x4b);             
        	lcd_wdat(dis[1]);        //第二位小数显示

			lcd_pos(0x4c);              
        	lcd_wdat('.');        //第一位小数显示 

	    	lcd_pos(0x4d);             
        	lcd_wdat(dis[0]);        //第二位小数显示

			lcd_pos(0x4e);             
        	lcd_wdat('K');        //第二位小数显示

			lcd_pos(0x4f);             
        	lcd_wdat('H');        //第二位小数显示
		}
		else{
			fre_value(x);            //	 
			lcd_pos(0x4a);             
        	lcd_wdat(dis[2]);        //整数位显示
        	lcd_pos(0x4B);             
        	lcd_wdat(dis[1]);        //第二位小数显示
	    	lcd_pos(0x4C);             
        	lcd_wdat(dis[0]);        //第二位小数显示
			lcd_pos(0x4D);             
        	lcd_wdat('H');        //第二位小数显示
			lcd_pos(0x4E);             
        	lcd_wdat('Z');        //第二位小数显示
			lcd_pos(0x4F);             
        	lcd_wdat(' ');        //第二位小数显示
		}

   }
}

⌨️ 快捷键说明

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