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

📄 dds.c

📁 这个是我们做过的波形发生器的单片机程序
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
#include<absacc.h>

#define uchar unsigned char          //类型重定义
#define uint  unsigned int           //类型重定义

sbit CS=P3^5;          // LCD_4   选通
sbit SID=P3^6;         // LCD_5   串行数据输入端
sbit SCLK=P3^7;        // LCD_6   串行时钟

uchar code line1[14]={"频率步进:100Hz"};
uchar code line5[2]={"Hz"};
uchar code line2[14]={"频率:     "};
uchar code line3[16]={"幅值:  V"};
uchar code line4[16]={"波形:     "};
uchar code line6[16]={"          "};
uchar sb[]={"."};

uchar code table[]={"0123456789 "};  //半字符数字码表
uchar  a[8]={0,0,0,0,0,0,0,0};                  //装载要显示频率的数组

long int f=0;     //输入的频率
uchar fudu=0;     //输入的幅度
uchar code wavetype[24]={"sin   方波  叁角波锯齿波"};

sbit DS1804_CS=P1^5;   //  DS1804端口定义
sbit DS1804_INC=P1^6; 
sbit DS1804_UD=P1^7;
   
unsigned char key, key_flag1,boxing_flag;
unsigned char Data[2]; 
sbit P12=P1^2;sbit P13=P1^3;
sbit pinlv1=P3^0;sbit pinlv2=P3^1;sbit boxing=P3^2;sbit fudu1=P3^3;sbit fudu2=P3^4;

unsigned char keyhh();
void init12864() ;
void LCD_Write_order(uchar Command);
void LCD_Write_Data(uchar ddd);
void display();
void DS1804_Inc_N_Step();
void DS1804_Dec_N_Step();


//==============================================================
//函数名称:void delay(unsigned int n) 
//函数功能:延时函数
//=============================================================
void delay(unsigned int n)   									
{
     unsigned int i,j;
       for(i=0;i<n;i++)
          for(j=0;j<n;j++)  ;
}


//==============================================================
//函数名称:void dectohex(f) 
//函数功能:十进制频率控制字数值转换十六进制数值,分为高8位与低8位
//=============================================================
void dectohex(f)
{ long int Ds;
  unsigned int az;
    Ds=f/3;
	//Ds=Ds*100;
    az=Ds/256;
    P2=az;   //高8位
    P0=Ds%256;   //低8位
}


//==============================================================
//函数名称:void type_gettype(void ) 
//函数功能:波形选择
//=============================================================
void type_gettype(void )     
{ 
  
 switch (boxing_flag)
   {  case 0:  P13=0; P12=0;	break;//正弦波
     case 1:  P13=0; P12=1;	break;//方波
	 case 2:  P13=1; P12=0;	break;//三角波
     case 3:  P13=1; P12=1;	break;//锯齿波
    default:  break;
   } 
 }



//==============================================================
//函数名称:unsigned char keyscan()
//函数功能:按键检测并去除抖动,返回键值
//=============================================================
 unsigned char keyscan()
{
  unsigned char fromkey;
  fromkey=P3&0x1f;
  if (fromkey!=0x1f)
  {
    delay(20);
    fromkey=P3&0x1f;
   	while ((P3&0x1f)!=0x1f)
        {
  		  ;//wait key release
		}
    switch (fromkey)
	{
      case 0x1f:return(0);break;//无按键
      case 0x1e:return(1);break;//按SW2 FRE递增
      case 0x1d:return(2);break;//按SW3 FRE递减 
      case 0x1b:return(3);break;//change WAVE
      case 0x17:return(4);break;//按SW4 fudu递增
      case 0x0f:return(5);break;//按SW5 fudu递减
      default:return(0);break;
      }	  
  }
  else return(0);
}


//==============================================================
//函数名称:void init12864()
//函数功能:初始化12864函数	
//=============================================================
void init12864()
{
	uchar i;
   	LCD_Write_order(0x30);	//基本操作指令
	LCD_Write_order(0x0f);	//开显示,关光标,不闪烁
	LCD_Write_order(0x01);	//清除显示
	LCD_Write_order(0x06);	//指定在资料写入或读取时,光标的移动方向
	LCD_Write_order(0x0c);	//整体显示


	LCD_Write_order(0x80);	//第1行初始化
	for(i=0;i<14;i++)
		LCD_Write_Data(line1[i]);

	LCD_Write_order(0x90);	//第2行初始化
	for(i=0;i<10;i++)
		LCD_Write_Data(line2[i]);

        LCD_Write_order(0x88); //第3行初始化
	for(i=0;i<16;i++)
		LCD_Write_Data(line3[i]);

        LCD_Write_order(0x98); //第4行初始化
	for(i=0;i<16;i++)
		LCD_Write_Data(line4[i]);
		}



//==============================================================
//函数名称:void LCD_Write_order(uchar Command)
//函数功能:送命令给夜晶12864函数
//=============================================================
void LCD_Write_order(uchar Command)
{
  uchar i,j,tem=0xf8;
  CS=1;
  for(i=8;i>0;i--)
  {
     SCLK=0;
     SID=tem&0x80;
     SCLK=1; 
     tem<<=1;
   }

  for(j=2;j>0;j--)
  for(i=8;i>0;i--)
   { 
	 if(i>4)           //送高四位
	 {
	   SCLK=0;
       SID=Command&0x80;
       SCLK=1;
       Command<<=1; 
	 } 
	 else              //低四位为"0"
	 {
	   SCLK=0;
       SID=0;
       SCLK=1;
	  }

   }
  
  CS=0;
}


//==============================================================
//函数名称:void LCD_Write_Data(uchar Data)
//函数功能:送数据给夜晶12864函数
//=============================================================
void LCD_Write_Data(uchar Data)
{
  uchar i,j,tem=0xfa;
  CS=1;
  for(i=8;i>0;i--)
  {
     SCLK=0;
     SID=tem&0x80;
     SCLK=1; 
     tem<<=1;
   }

  for(j=2;j>0;j--)
  for(i=8;i>0;i--)
   { 
	 if(i>4)           //送高四位
	 { 
	   SCLK=0;
       SID=Data&0x80;
       SCLK=1;
       Data<<=1; 
	 } 
	 else              //低四位为"0"
	 {
	   SCLK=0;
       SID=0;
       SCLK=1;
	  }

   }
  
    CS=0;
}


//=====================================================
//函数名称:void display()
//函数功能:显示选择的波形,调用前先送液晶地址
//=====================================================
 void  display()
{
    uchar i,j,k;
    a[0]=f/10000000;
    a[1]=f/1000000%10;
    a[2]=f/100000%10;
    a[3]=f/10000%10;
    a[4]=f/1000%10;
    a[5]=f/100%10;
    a[6]=f/10%10;
    a[7]=f%10;
  
    LCD_Write_order(0x93);
	for(i=0; i<8; i++)            //在液晶12864上显示频率
    {   
        LCD_Write_Data(table[a[i]]);
    }
   LCD_Write_order(0x97);
	   for(j=0;j<2;j++)
	   {
	  LCD_Write_Data(line5[j]);
	 	 }

 
    a[0]=fudu/10;	   //在液晶12864上显示幅值
    a[1]=fudu%10;
    LCD_Write_order(0x8b);  
    LCD_Write_Data(table[a[0]]);
	LCD_Write_Data(sb[0]);
	LCD_Write_order(0x8c);
    LCD_Write_Data(table[a[1]]);
	LCD_Write_order(0x8d);
	  for(k=0;k<6;k++)
	   {
	  LCD_Write_Data(line6[k]);
	    }
	 	 
 
 
 switch(boxing_flag)
	{
        case 0:	 LCD_Write_order(0x9b);	 	 //显示正弦波 
	             for(j=0;j<4;j++)
		         LCD_Write_Data(wavetype[j]);
				 LCD_Write_order(0x9d);
	             for(k=0;k<6;k++)
	                 {
	                    LCD_Write_Data(line6[k]);
	                  }
                 break;

		case 1: LCD_Write_order(0x9b);	 //显示方波
	             for(j=6;j<12;j++)
		           LCD_Write_Data(wavetype[j]);
                 break;
                        
                      
		case 2:LCD_Write_order(0x9b);	  //显示三角波
	             for(j=12;j<18;j++)
		           LCD_Write_Data(wavetype[j]);
                 break;
		case 3: LCD_Write_order(0x9b);	  //显示锯齿波
	             for(j=18;j<24;j++)
		           LCD_Write_Data(wavetype[j]);
                 break;
                        
		default: break;
	}

}


//=====================================================
//函数名称:void DS1804_Inc_N_Step()
//函数功能:数字电位器向上调2步
//=====================================================
 void DS1804_Inc_N_Step()
{
   unsigned char i=0; 
   DS1804_UD=1;     // UD 拉高, 则INC下降沿,执行UP操作          
   DS1804_CS=0;     // CS  拉低
   for(i=0;i<2;i++) 
    { 
       DS1804_INC=1;  // 拉高INC ,使INC的下沿有效          
       DS1804_INC=0;     // INC 拉低, 产生一个下沿        
	 }
  DS1804_INC=1;// 完毕CS拉高 ,存储
}


//=====================================================
//函数名称:void DS1804_Dec_N_Step()
//函数功能:数字电位器向下调2步
//=====================================================
void DS1804_Dec_N_Step()
{
   unsigned char i=0; 
   DS1804_UD=0;     // U/D 清0,  则下面的INC下沿,执行Down操作           
   DS1804_CS=0;    // CS  拉低
   for(i=0;i<2;i++) 
    { 
     DS1804_INC=1;  // 拉高INC      因为INC的下沿有效
     DS1804_INC=0;     // INC 拉低;  // 产生一个下沿       
    } 
  DS1804_CS=1;    // 完毕CS拉高 ,存储
  
}  


//主函数
void main(void)
{
  init12864();	 //初始化12864函数 
  f=100;
  fudu=5;
  boxing_flag=0;
  while(1)
      {switch (keyscan())
	   {
	    case 0:  	break;									
		
        case 1:  f+=100;if(f>596000||f<0)f=100;break;
	    case 2:  f-=100;if(f>596000||f<0)f=100;break;
        case 3:  boxing_flag++; 
			    if (boxing_flag==4)
			      boxing_flag=0;	break;
	    case 4:	 DS1804_Inc_N_Step();fudu+=1;if(fudu>50||fudu<0)fudu=1;display();break;
        case 5:	 DS1804_Dec_N_Step();fudu-=1;if(fudu>50||fudu<0)fudu=1;display();break;
        default:  break; 
	   } 
	  
	  dectohex(f); 
	  display();
	 			 
	 type_gettype();
	 display();

	}
                
 }


⌨️ 快捷键说明

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