找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我根据74hc595手册 写了个单片机程序 但是出现了问题 希望大家能给我点帮助

[复制链接]
跳转到指定楼层
楼主
流水灯是共阳极的 所以仿真运行的时候  实验现象:流水灯会全亮一会 然后 就变得全灭了 然后就不再变化了


问题: 我写的程序要求的是 亮灭亮灭 然后再流水 为什么 就只亮灭了一次 就不再变化了呢

各位大佬能指导下我嘛

单片机程序如下:

#include <reg52.h>
#include <intrins.h>
#include <delayms.h>

#define uchar unsigned char
#define uint unsigned int

uchar led_buff;

sbit DS1=P2^6;
sbit ST_CP1=P1^7;
sbit SH_CP1=P2^5;

void led8_Init();
void led8();

void led_sendbyte(uchar byte);
void led_595();



void main(void)
{
    led8_Init();
    while(1)
    {
        led8();
    }
}

void led8()  //流水灯
{
led_sendbyte(led_buff);
led_595();
led_buff=_crol_(led_buff,1);
delayms(500);
}

void led8_Init()  //初始化流水灯
{
led_sendbyte(0xff);
led_595();
delayms(500);
led_sendbyte(0x00);
led_595();
delayms(500);
led_sendbyte(0xff);
led_595();
delayms(500);
led_buff=0xfe;
}
void led_sendbyte(uchar byte) //传输8位数据
{
uchar i,num;
num=byte;
for(i=0;i<8;i++)
{
  if(num&0x80)
   DS1=1;
  else
   DS1=0;
  SH_CP1=0;
  _nop_();_nop_();
  SH_CP1=1;
  num=num<<1;
}
}
void led_595() // 启动传输
{
ST_CP1=0;
_nop_();_nop_();
ST_CP1=1;
}


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

使用道具 举报

沙发
ID:213173 发表于 2020-2-25 21:40 | 只看该作者
程序要求的是 亮灭亮灭 然后再流水
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. //#include <delayms.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. sbit DS1=P2^6;
  7. sbit ST_CP1=P1^7;
  8. sbit SH_CP1=P2^5;

  9. uchar code table[]={
  10.                 0xfe,0xfd,0xfb,0xf7,
  11.                 0xef,0xdf,0xbf,0x7f};

  12. void delay(uint z)
  13. {
  14.         uchar x;
  15.         while(z--)           //1ms延时程序
  16.         for(x=120;x>0;x--);
  17. }
  18. void led_sendbyte(uchar byte) //传输8位数据
  19. {
  20.         uchar i,num;
  21.         num=byte;
  22.         for(i=0;i<8;i++)
  23.         {
  24.                 if(num&0x80)
  25.                         DS1=1;
  26.                 else
  27.                         DS1=0;
  28.                 SH_CP1=0;
  29.                 _nop_();_nop_();
  30.                 SH_CP1=1;
  31.                 num=num<<1;
  32.         }
  33.         ST_CP1=0;
  34.         _nop_();_nop_();
  35.         ST_CP1=1;
  36. }

  37. void main(void)
  38. {
  39.         uchar i;
  40.         for(i=0;i<2;i++)
  41.         {       
  42.                 led_sendbyte(0x00);
  43.                 delay(500);
  44.                 led_sendbyte(0xff);
  45.                 delay(500);
  46.         }
  47.         while(1)
  48.         {
  49.                 for(i=0;i<8;i++)
  50.                 {       
  51.                         led_sendbyte(table[i]);
  52.                         delay(500);
  53.                 }
  54.         }
  55. }

复制代码
回复

使用道具 举报

板凳
ID:235200 发表于 2020-2-26 00:55 | 只看该作者
把 led8_Init();放进while循环中就会有了

void main(void)
{
  uchar k;
    while(1)
    {
        led8_Init();     //亮灭
        led8_Init();     //亮灭
       for (k=0;k<8;k++)    //流水
        led8();
    }
}
回复

使用道具 举报

地板
ID:679425 发表于 2020-2-26 09:16 | 只看该作者
把 led8_Init();放进while循环中就会有了
回复

使用道具 举报

5#
ID:164602 发表于 2020-2-26 09:54 | 只看该作者
初始化595,只要一次led_sendbyte(0x00)就可以了,一定要先用。当然,如果这样led灯亮了,就要初始化led灯,再来一次led_sendbyte(0xff)就好了。
回复

使用道具 举报

6#
ID:688261 发表于 2020-2-26 13:49 | 只看该作者
昨天经过实验 发现是因为我把keil运行模式改成了large 我仿真时用的AT89c52而写程序用的是STC 所以出现了问题 我把能放进code里面的数组都放进去了 把运行模式调回了small 现在已经能成功运行了 谢谢大家
回复

使用道具 举报

7#
ID:575020 发表于 2020-2-26 15:33 | 只看该作者
我要51啦 发表于 2020-2-26 13:49
昨天经过实验 发现是因为我把keil运行模式改成了large 我仿真时用的AT89c52而写程序用的是STC 所以出现了问 ...

发张电路原理图看看,共同学习一下。
回复

使用道具 举报

8#
ID:688261 发表于 2020-2-26 21:46 | 只看该作者
电路图

I@1W6FZOAD1XD@042K0]}GG.png (15.7 KB, 下载次数: 16)

595三个引脚接在io口上

595三个引脚接在io口上
回复

使用道具 举报

9#
ID:679425 发表于 2020-2-27 08:37 | 只看该作者
把 led8_Init();放进while循环中就会有了
回复

使用道具 举报

10#
ID:575020 发表于 2020-2-27 18:34 | 只看该作者

temp.c(4): warning C318: can't open file 'delayms.h'

在网上看别的文档说8和13脚接地,10和16脚接VCC。但是一般原理图里都缺少2个脚。
回复

使用道具 举报

11#
ID:575020 发表于 2020-2-27 19:29 | 只看该作者
楼主代码,我这缺少#include <delayms.h>文件,
自己画了个原理图做了个实物,用2楼代码通过了,先全部闪2下,然后再依次按顺序闪亮,
主要想学习控制数码管,但是现在控制led灯还是搞不太明白,还要继续努力学习啊!
在网上看好多74hc595的教学视频,好多都是用arduino单片机降解的,:(

顺便问一下,好多芯片介绍说某引脚接高或低电平有效时,如果不想用单片机控制,直接接+5V电源或负极可以么?


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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