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

📄 51

📁 51单片机大量源码
💻
📖 第 1 页 / 共 2 页
字号:
}
//-------------------------------------------------------------------
// 函数名称: IICreceiveByte
// 返回接收的数据
// 函数功能: 接收一字节子程序
//-------------------------------------------------------------------
uchar IICreceiveByte(void)
{
	uchar idata n=8;     // 从SDA线上读取一上数据字节,共八位
	uchar tdata=0;
	while(n--)
	{
	   SDA = 1;
	   SCL = 1;
	   tdata =tdata<<1;		    //左移一位
	   	if(SDA == 1)
		  tdata = tdata|0x01;   // 若接收到的位为1,则数据的最后一位置1
		else
		  tdata = tdata&0xfe;   // 否则数据的最后一位置0
	   SCL = 0;
	 }

	 return(tdata);
}
//-------------------------------------------------------------------
// 函数名称: DAC_PCF8591
// 入口参数: slave_add从机地址,n要发送的数据个数
// 函数功能: 发送n位数据子程序
//-------------------------------------------------------------------
void DAC_PCF8591(uchar controlbyte)
{

	iic_start();                    // 启动I2C
	delayNOP();

	IICSendByte(PCF8591_WRITE);     // 发送地址位
	check_ACK();                    // 检查应答位
    if(flag == 1)
	 {
		SystemError = 1;
		return;                     // 若非应答,置错误标志位
     }
    IICSendByte(controlbyte&0x77);	//Control byte
	check_ACK();                    //检查应答位
    if(flag == 1)
	 {
		SystemError = 1;
		return;                    // 若非应答,置错误标志位
	 }
}

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

	iic_start();

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

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

    iic_start();                //重新发送开始命令
   	IICSendByte(PCF8591_READ);	//控制字
	check_ACK();
	if(flag == 1)
	{
		SystemError = 1;
		return;
	}

    IICreceiveByte();   //空读一次,调整读顺序
    slave_ACK();        //收到一个字节后发送一个应答位

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

/*********************************************************
  输出三角波
*********************************************************/
void  Triangle()
{
    uchar l;
    for(l=0;l<255;l++)
	 { 
	   IICSendByte(l);	       //data byte
	   check_ACK();            //检查应答位
       if(flag == 1)
	   {
		SystemError = 1;
    	return;               //置错误标志位SystemError
	   }
	 }

      for(l=255;l>1;l--)
	 { 
	   IICSendByte(l);	       //data byte
	   check_ACK();            //检查应答位
       if(flag == 1)
	   {
		SystemError = 1;
    	return;               //置错误标志位SystemError
	   }
	 }
}

/*********************************************************
  输出方波函数
*********************************************************/
void  Square()
{
     IICSendByte(N);	     //data byte
	 check_ACK();            //检查应答位
     if(flag == 1)
	 {
	   SystemError = 1;
       return;               //置错误标志位SystemError
	 }
      delay(15);
	  N=~N;
}

/*********************************************************
  输出正弦波函数
*********************************************************/
void  sin()
{
  uint i;
  for(i=0; i<256; i++)
  {
    IICSendByte(sin_tab[i]);	  //data byte
	check_ACK();                  //检查应答位
    if(flag == 1)
	 {
	   SystemError = 1;
       return;                    //置错误标志位SystemError
	 }
  }

}

/*********************************************************
  输出锯齿波函数
*********************************************************/
void  Sawtooth()
{
  uchar l;
    for(l=0;l<255;l++)
	 { 
	   IICSendByte(l);	       //data byte
	   check_ACK();            //检查应答位
       if(flag == 1)
	   {
		SystemError = 1;
    	return;                //置错误标志位SystemError
	   }
	 }
}

/*********************************************************
  功能健函数
*********************************************************/
void  keyscan()
{
   uchar m;
   if((K2==0)&(!START))       //启动输出后,屏蔽K2健
   {
     k_count++;
     beep();   
     switch (k_count)
     {
        case 1: 
        lcd_pos(0x00);
	    for(m=0;m<16;m++)
        lcd_wdat(dis2[m]);
     
        lcd_pos(0x40);
	    for(m=0;m<16;m++)
        lcd_wdat(dis5[m]);
        out1=1;
		out4=0;
        break;
  
        case 2: 
        lcd_pos(0x40);
	    for(m=0;m<16;m++)
        lcd_wdat(dis6[m]); 
        out1=0;
		out2=1;
        break;
      
		case 3: 
        lcd_pos(0x40);
	    for(m=0;m<16;m++)
        lcd_wdat(dis7[m]);
		out2=0;
		out3=1;
     
        break;

        case 4: 
        lcd_pos(0x40);
	    for(m=0;m<16;m++)
        lcd_wdat(dis8[m]);
        k_count=0;
        out3=0;
		out4=1;
        break;
     
        default:  
        out4=0; out3=0; out2=0; out1=0;
        break;
     }   
   }
   
    if(K3==0)        //启动输出
	{
	   START=1;
	   beep();
	}

	if(K4==0)       //停止输出
	{
	   START=0;
	   beep();
	}
}

/*******************************************************************/
/*                                                                 */
/*  主函数                                                         */
/*                                                                 */
/*******************************************************************/
main()
{
    uchar i;
    delay(10);                 //延时
    lcd_init();                //初始化LCD

    lcd_pos(0);                //设置显示位置为第一行
    for(i=0;i<16;i++) 
    lcd_wdat(dis1[i]);         //显示字符
 

    lcd_pos(0x40);             //设置显示位置为第二行
    for(i=0;i<16;i++)
    lcd_wdat(dis2[i]);         //显示字符

    delay(1500);

    lcd_pos(0);                //设置显示位置为第一行
    for(i=0;i<16;i++) 
    lcd_wdat(dis3[i]);         //显示字符
 
    lcd_pos(0x40);             //设置显示位置为第二行
    for(i=0;i<16;i++)
    lcd_wdat(dis4[i]);         //显示字符

	DAC_PCF8591(0x40);
  
	while(1)
    {
	   keyscan();
	 
	   while(out1&START)
	   {
         sin();              //输出正弦波
         keyscan();
	   }

       while(out2&START)
	   {
         Square();           //输出方波
         keyscan();
	   }

	   while(out3&START) 
	   {
         Triangle();        //输出三角波
         keyscan();
	   }
      
	    while(out4&START)
	   {
         Sawtooth();        //输出锯齿波
         keyscan();
	   }	
    }
}

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

⌨️ 快捷键说明

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