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

📄 74hc595.txt

📁 74HC595+LED显示程序,好东西
💻 TXT
字号:
#include <reg52.h>
#include <intrins.h>	   /*used for _nop_() function*/

sbit  SDATA_595 =P1^3 ;/*串行数据输入*/  
sbit  SCLK_595  = P1^1;/*移位时钟脉冲*/
sbit  RCK_595   =P1^2 ;  /*输出锁存器控制脉冲*/

#define  AD_WR    WR
#define  AD_RD    RD
#define  AD_INTR  INT0		  /*51的相应端口连接ADC0804的三个控制端口*/

//#define  Vin_Max  5
////////////////////////////////////////
 static unsigned char data num1=15;	/*存放AD转换数据的全局变量*/
/****************************************************************/

unsigned char code Dig_Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 
                             0x88,0x82,0xc6,0xa1,0x84,0x8e};/*0到F的共阳段码表*/

//unsigned char data Dis_Tab[17]={0x00,0x01,0xff,0x02,0xff,0x04,0xff,0x08,0xff,0x10,0xff,0x20,0xff,0x40,0xbf,0x80,
//                                   0xbf};
unsigned char data Dis_Tab[17]={0x00,0x01,0xf7,0x02,0xf7,0x04,0xf7,0x08,0xff,0x10,0x7f,0x20,0xbf,0x40,0xbf,0x80,
                                    0xbf};

 /****************************************************************/
 /* 更新显示数组Dis_Tab[]函数Dis_Updata()*/
   	void Dis_Updata()
	 {
	      /*数据访问通过全局的num1*/
	      //unsigned char data temp1;
///////////////////////////////////////////////
          float  data temp2;  //定义存放计算得到的电压值
         unsigned long data temp3;
          
         // {
         // temp1=num1;
		 // num1&=0x0F;/*屏蔽高四位*/
		 // Dis_Tab[16]=Dig_Tab[num1];   /*A为代显示数据*/
		  							  /*Dig_Tab[]数组为段码表,序号A值用来检索对应段码,同时赋制值更新显示表*/
	     // num1=temp1;
		 // /*此语句编译时有问题,requires ANSI-style prototype ;missing function-prototype*/
		 // /*asm ("SWAP  num1;" );*/ 
	     // /*用C实现高低四位交换程序如下,一个问题ACC是否为带符号数*/
	     // num1>>=4;
		 // num1&=0x0F;
	      
		 // Dis_Tab[14]=Dig_Tab[num1];
         // }
	//////////////////添加/////////////////////////////////	  
	      temp2=(num1*5)/255.0;
	 //temp2=(num1*5)/0xFF+((num1*5)%0xFF);  此除法运算有问题
	     
	        if(temp2<0)
            {
              Dis_Tab[8]=0xbf;              //若小于零,显示负号
	          //temp2=(-temp2);               //若是负数,取正
            }          
           
            temp2*=1000;                    //扩大1000倍,分别提取各个位的数值
            temp3=temp2;
                            
           // temp3=( unsigned long)temp2;  //强制浮点数转换为长整型
	        Dis_Tab[10]=Dig_Tab[temp3/1000]&0x7f; //数制转化,向高看齐,必须的用长整型,浮点数不可
	        Dis_Tab[12]=Dig_Tab[temp3/100%10];
	        Dis_Tab[14]=Dig_Tab[temp3%100/10];
	        Dis_Tab[16]=Dig_Tab[temp3%10];
	        
          
	   
	 }
 /****************************************************************/
 /*延时子程序void Delay(unsinged char data i)*/
  void Delay1(unsigned char i)
  {
  	 while(--i); 

  }
 /****************************************************************/
 /* 精确延时time=2i+4,at 12MHZ AXIAL*/
  void Delay2(unsigned char data j)
  {
     while(--j);
  
  }
/****************************************************************/
 /*Int0 AD转换结束读取数据程序*/
 void Int0_ISR(void) interrupt 0
 {
   AD_RD=0;   /*开始读数据*/
   num1=P0;   /*读人数据*/
   
   AD_RD=1;
 
   Dis_Updata();
  
 
 }
/****************************************************************/
 /*A/D数据采集子程序ADC0804*/
  void AD_start(void)
  {
  	AD_WR=0;
	_nop_();
	_nop_();
	AD_WR=1;		/*发出写信号,启动AD转换*/
 
  }



/****************************************************************/ 
 /*T0中断程序,定时启动AD转换*/
 void T0_ISR(void) interrupt 1
 {
   TL0=0x00;
   TH0=0x00;
   ///////////////////////////////////////////
   AD_start(); /* 每隔0.256ms启动一次AD*/
   
   Dis_Updata();

 }
/****************************************************************/
 /*串口、定时器、TNT0中断 初始化函数*/
 void Init_Mcu51(void)
 { 
  //TMOD|=0x22;/*T1波特率发生,MODE=2;T0为8位自动重装,*/
  TMOD|=0x21;/*T1波特率发生,MODE=2;T0为16位,*/
  TL1=0xF4;
  TH1=0xF4; /*2400bps  @AXIAL=11.0592MHZ*/
  TL0=0x00;
  TH0=0x00; /*定时时间为0.256ms*/
  IT0=1;    //下降沿触发
  
  TR1=1;     /*start T1*/
  TR0=1;

  SCON|=0x52;/*MODE=1,TI=1*/

  IE=0x83;   /*开INT0,开T0,总中断*/
  
 }


/****************************************************************/
 
/*写数据到74HC595函数*/
 void  WR_595(unsigned char data num2 )
 {
   unsigned char data count1;
   
   for(count1=0;count1<=7;count1++)
   {
     if((num2&0x80)==0x80)  /*最高位为1,则向SDATA_595发送1*/
	    SDATA_595=1;/*发出数据的最高位*/
	 else  
	    SDATA_595=0;
	 
	 num2<<=1;    /*右移位*/
	 SCLK_595=0;	   
	 _nop_();
	 _nop_();
	 SCLK_595=1; /*产生上生沿*/
    
	}  

 }

 /****************************************************************/
 /*更新74HC595输出数据函数void  Out_595(void)*/
 void  Out_595(void)
 {
   RCK_595=0;
   _nop_();
   _nop_();
   RCK_595=1;  /*上升沿锁存数据*/


 }

/****************************************************************/
 /*LED驱动程序void Led_Drive(void)*/
 void Led_Drive(void)
 {
   unsigned char data Dis_Count;
   
   while(1)
   {   ++num1;
       for(Dis_Count=1;Dis_Count<=16;Dis_Count++)
        {
	     WR_595(Dis_Tab[Dis_Count]);
		 if(Dis_Count%2==0)	 /*判断若传完两个字节数据,则更新74HC595输出数据,并延时*/
		    {
		   	Out_595();
			//Delay1(1);
		  
		    }					  
	
	     }
    }


  }
/****************************************************************/
  main()
{
   //P0=0xff;
   //P1=0xff;
   Init_Mcu51();
   Led_Drive();	 //自身是个无限循环显示的程序
   
   

}

⌨️ 快捷键说明

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