找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2248|回复: 0
打印 上一主题 下一主题
收起左侧

74hc595驱动代码

[复制链接]
跳转到指定楼层
楼主
ID:211301 发表于 2017-6-14 21:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下载:
74hc595.rar (2.27 KB, 下载次数: 7)
  1. #include <reg52.h>
  2. #include <intrins.h>           /*used for _nop_() function*/

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

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

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

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

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

  19. /****************************************************************/
  20. /* 更新显示数组Dis_Tab[]函数Dis_Updata()*/
  21.            void Dis_Updata()
  22.          {
  23.               /*数据访问通过全局的num1*/
  24.               //unsigned char data temp1;
  25. ///////////////////////////////////////////////
  26.           float  data temp2;  //定义存放计算得到的电压值
  27.          unsigned long data temp3;
  28.          
  29.          // {
  30.          // temp1=num1;
  31.                  // num1&=0x0F;/*屏蔽高四位*/
  32.                  // Dis_Tab[16]=Dig_Tab[num1];   /*A为代显示数据*/
  33.                                                                             /*Dig_Tab[]数组为段码表,序号A值用来检索对应段码,同时赋制值更新显示表*/
  34.              // num1=temp1;
  35.                  // /*此语句编译时有问题,requires ANSI-style prototype ;missing function-prototype*/
  36.                  // /*asm ("SWAP  num1;" );*/
  37.              // /*用C实现高低四位交换程序如下,一个问题ACC是否为带符号数*/
  38.              // num1>>=4;
  39.                  // num1&=0x0F;
  40.               
  41.                  // Dis_Tab[14]=Dig_Tab[num1];
  42.          // }
  43.         //////////////////添加/////////////////////////////////         
  44.               temp2=(num1*5)/255.0;
  45.          //temp2=(num1*5)/0xFF+((num1*5)%0xFF);  此除法运算有问题
  46.             
  47.                 if(temp2<0)
  48.             {
  49.               Dis_Tab[8]=0xbf;              //若小于零,显示负号
  50.                   //temp2=(-temp2);               //若是负数,取正
  51.             }         
  52.            
  53.             temp2*=1000;                    //扩大1000倍,分别提取各个位的数值
  54.             temp3=temp2;
  55.                            
  56.            // temp3=( unsigned long)temp2;  //强制浮点数转换为长整型
  57.                 Dis_Tab[10]=Dig_Tab[temp3/1000]&0x7f; //数制转化,向高看齐,必须的用长整型,浮点数不可
  58.                 Dis_Tab[12]=Dig_Tab[temp3/100%10];
  59.                 Dis_Tab[14]=Dig_Tab[temp3%100/10];
  60.                 Dis_Tab[16]=Dig_Tab[temp3%10];
  61.                
  62.          
  63.            
  64.          }
  65. /****************************************************************/
  66. /*延时子程序void Delay(unsinged char data i)*/
  67.   void Delay1(unsigned char i)
  68.   {
  69.            while(--i);

  70.   }
  71. /****************************************************************/
  72. /* 精确延时time=2i+4,at 12MHZ AXIAL*/
  73.   void Delay2(unsigned char data j)
  74.   {
  75.      while(--j);
  76.   
  77.   }
  78. /****************************************************************/
  79. /*Int0 AD转换结束读取数据程序*/
  80. void Int0_ISR(void) interrupt 0
  81. {
  82.    AD_RD=0;   /*开始读数据*/
  83.    num1=P0;   /*读人数据*/
  84.    
  85.    AD_RD=1;

  86.    Dis_Updata();
  87.   

  88. }
  89. /****************************************************************/
  90. /*A/D数据采集子程序ADC0804*/
  91.   void AD_start(void)
  92.   {
  93.           AD_WR=0;
  94.         _nop_();
  95.         _nop_();
  96.         AD_WR=1;                /*发出写信号,启动AD转换*/

  97.   }



  98. /****************************************************************/
  99. /*T0中断程序,定时启动AD转换*/
  100. void T0_ISR(void) interrupt 1
  101. {
  102.    TL0=0x00;
  103.    TH0=0x00;
  104.    ///////////////////////////////////////////
  105.    AD_start(); /* 每隔0.256ms启动一次AD*/
  106.    
  107.    Dis_Updata();

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

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

  124.   IE=0x83;   /*开INT0,开T0,总中断*/
  125.   
  126. }


  127. /****************************************************************/

  128. /*写数据到74HC595函数*/
  129. void  WR_595(unsigned char data num2 )
  130. {
  131.    unsigned char data count1;
  132.    
  133.    for(count1=0;count1<=7;count1++)
  134.    {
  135.      if((num2&0x80)==0x80)  /*最高位为1,则向SDATA_595发送1*/
  136.             SDATA_595=1;/*发出数据的最高位*/
  137.          else  
  138.             SDATA_595=0;

  139.          num2<<=1;    /*右移位*/
  140.          SCLK_595=0;           
  141.          _nop_();
  142.          _nop_();
  143.          SCLK_595=1; /*产生上生沿*/
  144.    
  145.         }  

  146. }

  147. /****************************************************************/
  148. /*更新74HC595输出数据函数void  Out_595(void)*/
  149. void  Out_595(void)
  150. {
  151.    RCK_595=0;
  152.    _nop_();
  153.    _nop_();
  154.    RCK_595=1;  /*上升沿锁存数据*/


  155. }

  156. /****************************************************************/
  157. /*LED驱动程序void Led_Drive(void)*/
  158. void Led_Drive(void)
  159. {
  160.    unsigned char data Dis_Count;
  161.    
  162.    while(1)
  163.    {   ++num1;
  164.        for(Dis_Count=1;Dis_Count<=16;Dis_Count++)
  165.         {
  166.              WR_595(Dis_Tab[Dis_Count]);
  167.                  if(Dis_Count%2==0)         /*判断若传完两个字节数据,则更新74HC595输出数据,并延时*/
  168.                     {
  169.                            Out_595();
  170.                         //Delay1(1);
  171.                   
  172.                     }                                          
  173.         
  174.              }
  175.     }


  176.   }
  177. /****************************************************************/
  178.   main()
  179. {
  180.    //P0=0xff;
  181.    //P1=0xff;
  182.    Init_Mcu51();
  183.    Led_Drive();         //自身是个无限循环显示的程序
  184.    
  185.    

  186. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表