VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 13848|回复: 21

[原创] [开源]哂一下我的小小经验!(单片机控制595实例精解)

[复制链接]
 楼主| 发表于 2008-12-19 23:39:23 | 显示全部楼层 |阅读模式
74HC595这款芯片想必大家都很熟悉吧,其实我也早在学校的时候就听说过了,但只听其名,未见其玩意。刚出校门不久的前几星期,我就碰到了,还有点小波折,说一(应为“所以”,VBProFan注)说社会才是我们最好的学校啊,好了,闲话不扯了,说点正事,望能给大家一点点帮助,有则改之,无则加勉!
   我用的MCU是台湾义隆的EM78P153S的内核做成的RV805,本想着,C语言在手,编程不愁,这次可真抽死我了,义隆的C和51的C有点不一样的,就拿这次碰到的问题说吧,51的取位可以是a=(bit){b&0x01};或a=(bit){b&0x80};具体用那个就看你的移位是左移还是右移,可是这一句放在义隆仿真界面里却没有取位的作用,到底干什么的我也不清楚,呵呵,后来发现,义隆的取位可以用读取其内部的一个进位标志位C来完成,就光这点我弄了好长时间,还有,595D OE输入端加一个10K左右的电阻接地,这样可以房子无信号输入时有干扰信号进入,导致后面的LED误动作。最主要的就是,用595芯片的时候,请大家注意它Q的输出练级端的波形信号,与各个输出端的信号都不一样的,提前或者滞后那些输出信号半个身位的。
    这次我用595来控制3路LED,即RGB,595共8个IO口,由于模块的原因,我只用了每片IC中的三个口,看是浪费,其实是降低了成本,据我了解,现在3位的LED控制IC都是比较贵的,比如中庆的ZQ9712HV,银港的SD600,SDMX5124A,都是专业做LED驱动IC的,只要IC能达到你想要的要求,那么专业和不专业也就不存在了,实用才是硬道理,
    好了,这次的收获其实不只这些,认识了不少电子行业的朋友,嘿嘿
  下面就把我的程序晾出来,程序很是简单,供初学者学习之用!!
/******************************************************
**      电路接口:R60接595的DS,R61接595的SH_CP    ******
********         R62接595的ST_CP,R65接595的/OE    *****
***********                /MR接VCC              ******
***功能:通过对153S的编程,来控制595各个I/O口按要求***
*******  输出相应的电平,使LED产生要求的闪烁效果  *****/
#include "EM78x153xx.h"

#define uchar unsigned char
#define uint unsigned int

#define NOP()  _asm{nop}

#define DS    R60
#define SHCP  R61
#define STCP  R62
#define OE    R65
void init(void);  
void delay_nop(uint b);   
void delay_ys(uint a);   
void mov_ds(void);            
void jianbian_a(void);        
void jianbian_b(void);        
void lock();      
const uchar tab[]={
                   0x01,   //  R
                   0x02,   //  G
                   0x04,   //  B
                   0x00,   //  OFF
                   0xff,   //  ON
                   0x03,   //  R-G
                   0x05,   //  R-B
                   0x06,   //  G-B
                  };
uchar temp;
/***********************************************************
函数功能:主函数
函数类型:无符号整型
入口参数:无
出口参数:无
有无返回值:无
***********************************************************/
void main(void)
{
  uchar i,j,t;
  uchar NUM,COLOR;
  init();
  NUM=9;    // 连级数
  COLOR=3;  // 颜色数
  
  for (i=0; i<NUM;i++)
       {
        temp=tab[3];      
        mov_ds();
        lock();
        OE=0;
       }                    //清零
      
while(1)
{

/***********    RGB追逐     ******************/
   for(j=0;j<COLOR;j++)
       {
       for(i=0; i<NUM; i++)
           {
             temp=tab[j];    //取显示数据
             mov_ds();
             lock();
             OE=0;
             delay_ys(100);
           }                  
       }
      
/*************    RGB渐变    **************/
   for(j=0;j<COLOR;j++)
       {  
       for(i=0; i<NUM; i++)
           {
             temp=tab[j];
             mov_ds();
             lock();
           }  
                       jianbian_a();
                       jianbian_b();
                       for (i=0; i<NUM;i++)
                             {
                               OE=1;
                               temp=tab[3];      
                               mov_ds();
                               lock();
                             }                    //清零
                             OE=0;  
       }
      
/**********     RGB单循环    ***************/
   for(j=0;j<COLOR;j++)
       {  
       for(i=0; i<NUM; i++)
           {
             temp=tab[j];
             mov_ds();
             lock();
             delay_ys(100);
           }  
           for (i=0; i<NUM;i++)
                {
                  OE=1;
                  temp=tab[3];      
                  mov_ds();
                  lock();
                }                    //清零
                OE=0;  
       }  
         
/********    含R基色G混色   *************/
   for(j=0;j<NUM;j++)
       {     
         temp=tab[0];    //打R基色
         mov_ds();
         lock();
         OE=0;      
       }
   for(j=0;j<NUM;j++)
       {     
         temp=tab[5];    //打G混色
         mov_ds();
         lock();
         OE=0;
         delay_ys(100);      
       }  
/********    含R基色B混色   *************/
   for(j=0;j<NUM;j++)
       {     
         temp=tab[0];    //打R基色
         mov_ds();
         lock();
         OE=0;      
       }
   for(j=0;j<NUM;j++)
       {     
         temp=tab[6];    //打G混色
         mov_ds();
         lock();
         OE=0;
         delay_ys(100);      
       }         
/********    含G基色B混色   *************/
   for(j=0;j<NUM;j++)
       {     
         temp=tab[1];    //打R基色
         mov_ds();
         lock();
         OE=0;      
       }
   for(j=0;j<NUM;j++)
       {     
         temp=tab[7];    //打G混色
         mov_ds();
         lock();
         OE=0;
         delay_ys(100);      
       }         
      
/********    含G基色R混色   *************/
   for(j=0;j<NUM;j++)
       {     
         temp=tab[2];    //打R基色
         mov_ds();
         lock();
         OE=0;      
       }
   for(j=0;j<NUM;j++)
       {     
         temp=tab[6];    //打G混色
         mov_ds();
         lock();
         OE=0;
         delay_ys(100);      
       }      
/***********************************************************/               
   }   
   
}

/***********************************************************
函数功能:初始化程序
函数类型:无符号整型
入口参数:无
出口参数:无
有无返回值:无
***********************************************************/
void init(void)
{
_asm
     {
        DISI;
        MOV A,@0XD8;
        IOW 0x06;    //定义PORT6的第0,1,2,5为输出口
        MOV A,@0X9F;
        CONTW;
        wdtc ;
     }
     DS=1;
     SHCP=0;
     STCP=0;
     OE=1;
}


/***********************************************************
函数功能:595移位脉冲
函数类型:无符号整型
入口参数:temp
出口参数:无
有无返回值:无
***********************************************************/
void mov_ds(void)
{
      uint e;
      for(e=0;e<8;e++)   
          {
            SHCP=0;
            temp=temp<<1;
            DS=C;
            SHCP=1;
          }  
}

/***********************************************************
函数功能:锁存脉冲
函数类型:无符号整型
入口参数:  无
出口参数:  无
有无返回值:无
***********************************************************/
void lock(void)
{
   STCP=0;
   NOP();NOP();
   STCP=1;
   NOP();NOP();
   STCP=0;
}

/***********************************************************
函数功能:渐变函数(渐暗)
函数类型:无符号整型
入口参数:无
出口参数:无
有无返回值:无
***********************************************************/

void jianbian_b(void)
{   
    uchar f,u;
    for(f=0;f<250;f++)

        {
              for(u=0;u<f;u++)
            OE=1;
              for(u=0;u<250-f;u++)
                 OE=0;
        }
}

/***********************************************************
函数功能:渐变函数(渐亮)
函数类型:无符号整型
入口参数:无
出口参数:无
有无返回值:无
***********************************************************/
void jianbian_a(void)
{   
    uchar f,u;
    for(f=0;f<250;f++)
        {
              for(u=0;u<f;u++)

            OE=0;
              for(u=0;u<250-f;u++)
                   OE=1;
        }
}

/***********************************************************
函数功能:时间延时
函数类型:无符号整型
入口参数:a
出口参数:无
有无返回值:无
***********************************************************/
void delay_ys(uint a)
{
  uint x,y;
  for(x=a;x>0;x--)
      for(y=200;y>0;y--);
}

[ 本帖最后由 VBProFan 于 2008-12-20 10:53 编辑 ]

单点光源

单点光源

三点光源

三点光源

NCU板

NCU板

评分

参与人数 2威望 +20 金钱 +22 人气 +6 收起 理由
VBProFan + 10 + 12 + 3 原创精品
DreamonII + 10 + 10 + 3 好贴!经典!

查看全部评分

发表于 2008-12-19 23:42:06 | 显示全部楼层
沙发!
强贴留名!
回复 支持 反对

使用道具 举报

发表于 2008-12-20 09:49:33 | 显示全部楼层
楼主,此地是Basic语言的网站,偶们是非Basic语言不嫁,非Basic语言不娶,希望你单片机也用Basic语言来编程!
回复 支持 反对

使用道具 举报

发表于 2008-12-20 10:52:16 | 显示全部楼层
昏倒。。。
电子版块可以有些例外。。。
允许讨论一些非VB内容和纯电子内容。。。
这里是对VB程序员进行硬件扫盲和扩展知识面的小课堂
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-20 12:11:20 | 显示全部楼层
原帖由 修齐治平 于 2008-12-20 09:49 发表
楼主,此地是Basic语言的网站,偶们是非Basic语言不嫁,非Basic语言不娶,希望你单片机也用Basic语言来编程!

好的,下次学好VB后再结合一下,现在VB还没入门!!:)

[ 本帖最后由 DreamonII 于 2008-12-20 13:18 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2008-12-22 14:02:25 | 显示全部楼层

什么叫工控板?

我老看到有人说这个词,但总搜不到它的定义。。。
符合什么特征的就可以称为工控板,有一堆可控IO么?那我把51的40个脚都引出来是不是。。。。。。
回复 支持 反对

使用道具 举报

发表于 2008-12-22 14:19:54 | 显示全部楼层
偶看不懂。。。。 能不能传原理图而不是PCB,再说下控制那个LED的RGB的原理~~:)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-24 14:11:24 | 显示全部楼层

595控制LED原理图

原理图上来了,请大家多多指教,,不对之处请加以指正!

原理图

原理图

评分

参与人数 1威望 +6 金钱 +10 人气 +3 收起 理由
DreamonII + 6 + 10 + 3 精品文章

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2008-12-24 14:15:35 | 显示全部楼层
好文章!
感谢LZ分享。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-25 00:50:41 | 显示全部楼层

回复 #9 DreamonII 的帖子

大家交流才能学到好技术,,嘿嘿

评分

参与人数 1威望 +4 人气 +1 收起 理由
DreamonII + 4 + 1 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-1-21 12:54

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表