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

📄 text1.c

📁 个人单片机入门程序集合 。很适合刚学单片机的人。用的是keil proteus
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong  unsigned long
/*****数据口定义****/
#define lcd1602_bus P0	


/*定义9850端口*/
sbit sclk=P2^0;   //W_CLK
sbit load=P2^1;   //FQUD
sbit sdata=P2^2;  //DATA	 

/*******   引脚LCD定义		 *****/
sbit rs_1602=P2^5;	     
sbit rw_1602=P2^6;
sbit e_1602=P2^7;

sbit alarm=P0^0;


sbit beep=P2^3;	  //按键声音开关

/******* TLC0838数据口定义 	   *******/
sbit CS=P3^2;      //TLC0838---PIN18
sbit DI=P3^3;      //TLC0838---PIN17
sbit CLK=P3^4;     //TLC0838---PIN16
sbit DO=P3^5;      //TLC0838---PIN14

                   //SE接成低电平
uchar error=1;





/*********延时子程序**********/
void delay_1ms(uint t)
{
   uint i,j;
   for(i=0;i<t;i++)
     for(j=0;j<111;j++);           //  11.0592M晶震            
}

void delay(uchar t)
{
	uchar i;
	while(t--)
	{
		/* 对于11.0592M时钟,约延时1ms */
		for (i=0;i<125;i++)
		{}
	}
} 







/***********忙判断标志,返回一个位BF********************/
bit lcd1602_busy(void)
{
	uchar busy_flag;
	rs_1602=0;
	rw_1602=1;
	_nop_();
	e_1602=1;
	_nop_();
	lcd1602_bus=0xff;
	busy_flag=lcd1602_bus;	 //e在高电平时读 
	e_1602=0;
	return (bit)(busy_flag&0x80);    //BF=1; BUSY  返回一个位
}


/********写命令,有两个参数,一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1;
判断: 为0 
***************/
void lcd1602_wrcmd(unsigned char lcdcmd)
{
   	while(lcd1602_busy());	   //等待空闲
	lcd1602_bus=lcdcmd;
	rs_1602=0;
	rw_1602=0;
	_nop_();
	e_1602=1;
	_nop_();
	_nop_();
	e_1602=0;      //产生一个下沿	  
}



/***************向液晶写数据******************/
void lcd1602_wrdata(uchar lcddata)
{
 while(lcd1602_busy());	      //等待空闲
 lcd1602_bus=lcddata;		  //在下沿的时候写数据
 rs_1602=1;
 rw_1602=0;
 _nop_();
 e_1602=1;
 _nop_();
 _nop_();
 e_1602=0;
 //lcd_bus=0xff;
}


/************液晶的清屏************/
void lcd1602_clear(void)
{
  lcd1602_wrcmd(0x01);	   //液晶清屏控制字	并延时>40us
  delay(1);
}

/***********1602液晶的初始化***************/
void lcd1602_init(void)
{
  lcd1602_wrcmd(0x38);	    	//功能设置-----8位数据接口,两行显示,5*7点阵字符显示
  delay(1);
  lcd1602_wrcmd(0x0e);	       //显示开关控制----显示开关开,光标开关关,闪烁开关关
  delay(1);
  lcd1602_wrcmd(0x06);	       //输入方式设置,AC自增1, S=0;
  delay(1);		   
  lcd1602_wrcmd(0x01);         //清屏
  delay(1);
}


/**********4*4矩阵键盘****************/
/************
 矩阵键盘
D---------P1.0
C---------P1.1
B---------P1.2
A---------P1.3
1---------P1.4
2---------P1.5
3---------P1.6
4---------P1.7
按键值的分布
   D   C  B  A
1〔15 14 13 12〕
2〔11 10  9  8〕
3〔 7  6  5  4〕
4〔 3  2  1  0〕
利用已有的那个按键程序  */
uchar getkey_ii()

{
    unsigned char keycode=0xff,temp,i;
    P1=0x0f;
    temp=P1&0x0f;
    if(temp!=0x0f)        //判是否有键按下
    {
        beep=0;
        P1=0xef;          //自第0行开始扫描输出,自列读入键值
        for(i=0;i<4;i++)
        {
            temp=P1&0x0f;
            if(temp==0x07)     //判断第0列是否有键按下
            {    
                keycode=i*4+0;
                break;
            }
            else if(temp==0x0b)//判断第1列是否有键按下
            {
                keycode=i*4+1;
                break;                                  						  
            }
            else if(temp==0x0d)//判断第2列是否有键按下
            {
                keycode=i*4+2;
                break;
            }
            else if(temp==0x0e)//判断第3列是否有键按下
            {
                keycode=i*4+3;
                break;
            }
            P1=(P1<<1)|0x1;
        }

         while((P1&0x0f)!=0x0f)   //等待释放
         {
             P1=0x0f;
         }
      beep=1;                                             
        
     }
     return keycode;
}


/*********       显示数字        *************/
void xianshu(unsigned long a)
{          unsigned long c,p=0;
				
 			
                
				c=a/1000000000;
				if(c!=0)
                {lcd1602_wrdata(c+0x30);
 			     p=1;
				 }
                 c=(a%1000000000)/100000000;
                 if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
				  p=1;
 			      }
                 c=(a%100000000)/10000000;
                 if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			       p=1;
				  }

                 c=(a%10000000)/1000000;
                 if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			       p=1;
				  }
                  c=(a%1000000)/100000;
                if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			       p=1;
				  }
                 c=(a%100000)/10000;
                if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			       p=1;
				  }               
                c=(a%10000)/1000;
                if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			       p=1;
				  }
                
				c=(a%1000)/100;
                if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			       p=1;
				  }
                
				c=(a%100)/10;
                if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			      }
                
	            c=a%10+0x30;
         	    lcd1602_wrdata(c);   
				
          
}

 /*******       菜单显示子程序      ************/
void xianshi(uchar j)
{  	uchar code str[][9]={{"1.SIN   "},{"2.set F "},{"3.set dF"},{"4.set XW"},{"5.OOK   "},{"6.FSK   "},{"7.PSK   "},{"8.FM    "},{"1.SIN   "}};   
    uchar i;
    unsigned char offset=0x80;
          lcd1602_clear();
  	  	    lcd1602_wrcmd(offset+0x00);

             lcd1602_wrcmd(offset+0x00);
             lcd1602_wrdata('-');
			 lcd1602_wrdata('>');
             for(i=0;i<8;i++)   lcd1602_wrdata(str[j+0][i]);    
   
          	 lcd1602_wrcmd(offset+0x40);
			 lcd1602_wrdata(' ');
			 lcd1602_wrdata(' ');
             for(i=0;i<8;i++)   lcd1602_wrdata(str[j+1][i]);		   
}







 /***************  AD9850驱动程序  ************/
ad9850(float freq, float dfreq,ulong d4)
{
   float fw;
    uchar i,j,temp;
	uchar s;
    uchar d[5];
   fw=freq*34.359738368*3;                       //d[4]中存放控制字最高位,即相位控制字
                                               //Freq=MCLK*FW/2^32
   d[4]=(unsigned long)(d4/11.25)*8;
   d[0]=(unsigned long)fw;
   d[1]=(unsigned long)fw>>8;
   d[2]=(unsigned long)fw>>16;
   d[3]=(unsigned long)fw>>24;
  
   
    load=0; 
    sclk=0; 
    sclk=1;
    sclk=0;
    load=1;
    load=0;
    
    for(i=0;i<5;i++)
    {
        temp=d[i];
        for(j=0;j<8;j++)
        {
            sclk=0;
            if(temp&1) sdata=1;
            else sdata=0;
            sclk=1;
            temp=temp>>1;
         }
      }
      load=1;
      load=0;
  
 lcd1602_clear();
 lcd1602_wrdata(' ');
 lcd1602_wrdata(' ');
 lcd1602_wrdata(' ');
 lcd1602_wrdata(' ');
 lcd1602_wrdata(' ');

if ((unsigned long)freq%1000==0 )
{
  
   s='K'; freq=freq/1000;
   if ( (unsigned long) freq%1000==0) {s='M';freq=freq/1000	;  }
 }
 else{ s=' ';}	
   xianshu(freq);
 lcd1602_wrdata(s);
 lcd1602_wrdata('H');
 lcd1602_wrdata('Z');
  
 lcd1602_wrcmd(0x80+0x40);   //换行


if ((unsigned long)dfreq%1000==0 )
{
  
   s='K'; dfreq=dfreq/1000;
   if ( (unsigned long) dfreq%1000==0) {s='M';dfreq=dfreq/1000	;  }
 }
 else{ s=' ';}	

lcd1602_wrdata(0x7e);
 xianshu(dfreq);
  lcd1602_wrdata(s);  
  lcd1602_wrdata('H');
   lcd1602_wrdata('Z');


 lcd1602_wrcmd(0x80+0x4b);         //定坐标 控制显示位子 
   lcd1602_wrdata(0xf2);
 lcd1602_wrdata(':');
 xianshu(d4);

}




 /**********************   按键显示数程序   *************************/
ulong dushu()
{		   
            uchar code d[]="please insert XW:";


         	unsigned char offset=0x80;
			uchar key;
            ulong i,a=0;
		    lcd1602_clear();
	        for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
			key=18;     //避免和下面的WHILE语句条件冲突;临时改变KEY 只变一次 
			
		    while(key!=15 )
		    {
		      key=getkey_ii();


	    	if(key==0)
		    	{ 
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
			           
			    a=a*10+1;

                for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
                lcd1602_wrcmd(offset+0x40);   //换行
	      	    xianshu(a);  
		        //lcd1602_wrcmd(offset+0x40);
			//	for(i=0;i<11;i++) lcd1602_wrdata(str12[i]);
		    	 }
		    else if (key==1)
		    	{ 
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);

                for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
				lcd1602_wrcmd(offset+0x40);   //换行 
				a=a*10+2;
				 xianshu(a);  
		        //lcd1602_wrcmd(offset+0x40);
				//for(i=0;i<15;i++) lcd1602_wrdata(str22[i]);
		    	 }
		   else if (key==2)
		     	 {
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
	      	    
                for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
                lcd1602_wrcmd(offset+0x40);   //换行
                a=a*10+3;
				xianshu(a);  
		      //  lcd1602_wrcmd(offset+0x40);
			//	for(i=0;i<15;i++) lcd1602_wrdata(str31[i]);
		    	 }

           else if (key==4)
		     	 {
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
				a=a*10+4;
			
                for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
            	lcd1602_wrcmd(offset+0x40);   //换行
	      	    xianshu(a);  
               }
            else if (key==5)
		    	 {
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
				
                for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
                lcd1602_wrcmd(offset+0x40);   //换行
				a=a*10+5;
	      	    xianshu(a);  
               }
            else if (key==6)
		     	 {
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
				
                for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
                lcd1602_wrcmd(offset+0x40);   //换行
				a=a*10+6;
	      	    xianshu(a);  
                }
			else if (key==8)
		     	 {
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
				
                for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
               lcd1602_wrcmd(offset+0x40);   //换行
				a=a*10+7;
	      	    xianshu(a);  
                }
			else if (key==9)
		     	 {
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);

                for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
  				lcd1602_wrcmd(offset+0x40);   //换行
			     a=a*10+8;
	      	     xianshu(a);  
                 }
			else if (key==10)
		     	 {
		  		lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
				for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
            	lcd1602_wrcmd(offset+0x40);   //换行
			 	a=a*10+9;
	      	    xianshu(a);  
                }
			else if (key==13)
		     	 {
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
				for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
            	lcd1602_wrcmd(offset+0x40);   //换行
				a=a*10+0;
	      	    xianshu(a);  
                 }
              
              }
		    
	          return a;
			 
			
        	}						    





/*****************TLC0838驱动程序***********************/
uint adc_tlc0838(uchar channel)
{
    uchar t,i;
	uint Temp1=0,Temp2=0;
    if (channel==0)     t=0;
	else if(channel==1) t=1;
	else if(channel==2) t=4;
	else if(channel==3) t=5;
	else if(channel==4) t=2;
	else if(channel==5) t=3;
	else if(channel==6) t=6;
	else if(channel==7) t=7;
   
    CS=1;
   _nop_();_nop_();_nop_();_nop_();

   
    CLK=0;
    CS=0;            //使AD通道打开
    DI = 1;          //Start bit=1
    CLK = 1;
    _nop_();
    _nop_();

    CLK=0;
    CS=0;          
    DI = 1;          
    CLK = 1;
    _nop_();
    _nop_();


    for(i=0;i<3;i++)
	{
      CLK = 0;
      _nop_();
      _nop_();
      if(t&1)DI=1;
	  else DI=0;
	  t=t>>1;       
      CLK = 1;
      _nop_();
      _nop_();
    }


    CLK=0;
    _nop_();
    _nop_();
    CLK=1;
    _nop_();
    _nop_();


     for(i=0;i<=6;i++)
	 {
         CLK = 0;                  //时钟为低电平
         if(DO)
		 {                         //如果采集到的位为1
           Temp1=Temp1+1;          //给临时存储Temp1加1
           Temp1=Temp1<<1;
		 }         //临时存储器左移一位
         else
           Temp1=Temp1<<1;          //如果采集到的数位为0,临时存储器左移一位
		 _nop_();
         _nop_();
         _nop_();
         _nop_();
         CLK = 1;    
      }                             //时钟为高电平,完成一个时钟周期数据采集
       CLK = 0;
       if(DO)  Temp1=Temp1+1;
       if(DO)  Temp2=0x80;

       CLK = 1; 
                                      //采集数据校验          
       
       for(i=0;i<=6;i++)

⌨️ 快捷键说明

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