标题: 怎么用51单片机点亮流水灯? [打印本页]

作者: 若n1碰到他    时间: 2016-11-8 20:55
标题: 怎么用51单片机点亮流水灯?
怎么用51单片机点亮流水灯?求电路图

作者: benq1    时间: 2016-11-8 21:01

#include <REG51.h>
#define uint unsigned int
#define uchar unsigned char
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
void delay (uint);// 延时函数
void delay (uint x)
{
uchar tw;
while (x-->0)
{
for (tw=0;tw<125;tw++){;}
}
}
void main(void)
{
while( 1)
{
P1=0xff;
delay(50);
P10=0;
delay(50);
P10=1;
P11=0;
delay(50);
P11=1;
P12=0;
delay(50);
P12=1;
P13=0;
delay(50);
P13=1;
P14=0;
delay(50);
P14=1;
P15=0;
delay(50);
P15=1;
P16=0;
delay(50);
P16=1;
P17=0;
delay(50);
}
}
我也刚试验成功。图画的不好,见谅。

作者: qwer159753    时间: 2016-11-8 21:12
简单呢
作者: wuyibin2003    时间: 2016-11-9 08:28
楼上已经给你贴出来了呀 可以用左移 也可以用右移函数
作者: ch3odndff    时间: 2016-11-9 08:46
就是规律地控制引脚点位的高低
作者: lyhot    时间: 2016-11-9 15:07
自己查资料 效果好
作者: lucky666    时间: 2016-11-9 15:16
先赋格初值,直接用左移或右移函数就搞定了。
作者: 超电磁场    时间: 2016-11-9 15:33
讲真,不会是大学作业吧
作者: 238753688    时间: 2016-11-9 16:03
简单呢
作者: woshishihaode    时间: 2016-11-9 19:25
还有更简单的;楼上那个定义太复杂了
作者: woshishihaode    时间: 2016-11-9 19:28
本帖最后由 woshishihaode 于 2016-11-9 19:31 编辑

#include<reg51.h>
#include<intrins.h>
void delay(unsigned int i)
{unsigned int k;
for(k=0;k<i;k++);
}
void main()

作者: woshishihaode    时间: 2016-11-9 19:28
{P1=0xfe;while(1){
作者: woshishihaode    时间: 2016-11-9 19:30
本帖最后由 woshishihaode 于 2016-11-9 19:32 编辑

P1=_cror_(P1,1);delay(5000);}}//里面的可更,看你要好快!!--表示分行哈
作者: 小白吕    时间: 2016-11-9 20:01
#include<reg51.h>
#include<intrins.h>
作者: 英语    时间: 2016-11-9 20:34
给你想要点亮灯的引脚给一个0,就可以了
作者: 若n1碰到他    时间: 2016-11-9 20:54
超电磁场 发表于 2016-11-9 15:33
讲真,不会是大学作业吧

不是的,我大二,自己想做点东西出来,理论知识跟不上。

作者: 若n1碰到他    时间: 2016-11-9 20:57
benq1 发表于 2016-11-8 21:01
#include
#define uint unsigned int
#define uchar unsigned char

如果我想接32个二极管呢?该怎么改写程序?
作者: jyfans    时间: 2016-11-10 12:38
这是基础 了  先学c语言
作者: mhl10103617    时间: 2016-11-10 22:01
使其左右移就可以了
作者: 794983432    时间: 2016-11-10 23:35
你要看看是想共阴还是共阳
作者: 凯伦之宝    时间: 2016-11-11 14:09
自己查资料,比较简单
作者: 王玉珍    时间: 2016-11-11 14:39
#在这#include <REGX52.H>里快速回复#
作者: zl2168    时间: 2016-11-12 13:27
本帖最后由 zl2168 于 2016-11-12 13:38 编辑
若n1碰到他 发表于 2016-11-9 20:57
如果我想接32个二极管呢?该怎么改写程序?

32个二极管,初学者一般用4个I/O口,4*8=32,但这样不好,是笨办法。应该是I/O口扩展,I/O口扩展有并行扩展和串行扩展。
给你介绍几个案例


4 扩展输入输出应用


4.1  并行扩展


实例21  并行扩展TTL输入输出口


实例22  并行扩展8255


实例23  并行扩展8155


实例24  并行扩展RAM 6264


4.2  同步移位寄存器串行扩展


实例25  74HC165串行输入8/16数据信号


实例26  CC4021串行输入8/16数据信号


实例27  CC4014串行输入8/16数据信号


实例28  74HC164串入并出控制8/16循环灯


实例29  CC4094串入并出控制8/16循环灯


实例30  74HC595串入并出控制8/16循环灯


实例31 74HC164+165串行输入输出


实例32 CC4021+4094串行输入输出


实例33 74HC164+165虚拟串行输入输出


实例34 CC4021+4094虚拟串行输入输出


Proteus仿真一下,确认有效。
51单片机仿真设计实例教程仿真文件.rar (4.88 MB, 下载次数: 21)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行


作者: dianmy    时间: 2016-11-12 22:48
用—crol_函数实现
作者: canghaiwuhen    时间: 2016-11-13 00:19
原理图?买的开发板应该都带啊
作者: qi_dianzikeji    时间: 2016-11-20 21:01
为啥传不了图。就是做好最小系统,把LED接在随意I/O口就行。在LED前接10K的电阻为上拉电阻。如接在了P0口则P0=0XFF则全亮
作者: 953164692    时间: 2016-11-20 22:02
楼上的比较麻烦,可以用位移,简单方便。
作者: liyanchao153    时间: 2016-11-20 22:26
初学者,多看几遍视频,效果比较好。
作者: jiejie001    时间: 2016-11-20 22:37
楼上回复了,祝成功,加油
作者: 灵风少人    时间: 2016-11-20 23:42
自己查资料印象高,楼上的方法都不错。
作者: qiuhao    时间: 2016-11-21 08:41
先看懂电路图
作者: 想爱无依    时间: 2016-11-21 11:51
用数组
作者: taotaobujue    时间: 2016-11-21 16:30
楼上很详细
作者: dict020    时间: 2016-11-21 16:45
谢谢分享
作者: 爱学习的小冰    时间: 2016-11-22 02:18
可以先去看看例程,然后结合自己所知的理论知识再把它彻底弄懂。


//--包含你要使用的头文件
#include <reg52.h>          //此文件中定义了51的一些特殊功能寄存器


//--声明全局函数--//
void Delay10ms(unsigned int c);   //延时10ms            


main()
{
        unsigned char LED,i;

        LED = 0xfe;          //0xfe = 1111 1110

        while (1)
        {
             P0 = LED;
                 Delay10ms(50);
        for(i=8;i>0;i--)
        {
                   LED = LED << 1;    //循环右移1位,点亮下一个LED "<<"为左移位                                     
         }
         }

void Delay10ms(unsigned int c)   //误差 0us
{
    unsigned char a, b;

                for (b=c;b>0;b--)
                {
                        for (a=114;a>0;a--);
                }
           
        }      
}

作者: Treasure9479    时间: 2016-11-22 19:20
#include<reg51.h>
#include<intrins.h>
void delay(unsigned int i)
{unsigned int k;
for(k=0;k<i;k++);
}
void main()
作者: yangwenmou8    时间: 2016-11-23 09:22
二楼正解啊,很详细
作者: zz123zz    时间: 2016-11-23 10:37

二楼正解啊,很详细
作者: yff璠    时间: 2016-11-23 16:13
循环P1=_cror_(P1,1)右移
循环P1=_crol_(P1,1)移左
作者: 1272270359    时间: 2016-11-24 10:27
挺简单的,我刚做
作者: liuguihua    时间: 2016-11-24 10:46
很简单的,点亮一个,延时一下,然后电亮下一个,熄灭之前的,延时一下,然后循环
作者: 515fgvds    时间: 2016-11-24 11:21
我有教程   983702898
作者: fbu    时间: 2016-11-24 11:44
给个高电平就好了
作者: 柔柔弱弱任溶溶    时间: 2016-11-24 13:30
网上很多的
作者: chujx1981    时间: 2016-11-24 14:48
将LED的阴极通过电阻1K接到某一个单片机引脚,阳极接5V电源,通过程序向该引脚间断写1和0,就可点亮和熄灭LED
作者: li353747021    时间: 2016-11-24 15:25
基础知识不行还是跟我一样多逛逛论坛多看看资料和视频吧!看郭天祥的视频蛮好的!我就在看!
作者: li353747021    时间: 2016-11-24 16:42
基础知识差还是多看看资料多逛逛论坛,郭天祥的视频不错你可以看看!
作者: 719738849    时间: 2016-11-24 20:25
先点亮一个灯  延时 关闭 再把位置移位再点亮 重复
如把P0^0点亮再关闭再点亮P0^1 然后继续
作者: VxpV    时间: 2016-11-25 10:54
用左移函数
作者: sgdagiuafga    时间: 2016-11-25 12:06
简单的
作者: czx_china    时间: 2016-11-25 13:26
呵呵,书上的内容仔细看看可以
作者: 四少的刀    时间: 2016-11-25 21:08
调用intrins.h库函数,P0=_crol_(P0,1); //左移
作者: 416356084    时间: 2016-11-25 21:59
大家都很积极啊
作者: Anethon    时间: 2016-11-25 22:29
延时位移
作者: qj1049167363    时间: 2016-11-25 22:52
buzhidaoa a a aa a
作者: 叽里咕噜    时间: 2016-11-25 23:55
我也想知道
作者: qwertyuio543    时间: 2016-11-26 07:31
点亮流水灯的仿真论坛里多的是
作者: 常长诀    时间: 2016-11-26 13:08
楼上是大神
作者: tbcgz66    时间: 2016-11-26 14:43
用左移或者右移,就不用单独定义8个io口了
作者: 想爱无依    时间: 2016-11-26 16:46
//**名称:单片机c语言程序设计100例 ******** //*** 时间:2016.7.19  Saturday  Sunny ***** //**** 编写:一抹微笑^一抹阳光  *************** //*****        例4:右移8位流水灯  **********************  #include<reg52.h>   #define uint unsigned int #define uchar unsigned char   void delay_ms(uint a) {          uint i;         while(a--);                  for(i=0;i<168;i++)             { } }  void main() {        uchar k;        while(1)   {           P1=0XFF;          delay_ms(30000);          for(k=0;k<8;k++)         {           P1=P1>>1;          delay_ms(30000);            }         } }
作者: 梦不虚存    时间: 2016-11-27 15:54
点亮比较简单,如果循环点亮可以用while循环语句
作者: daifei123    时间: 2016-11-27 21:21
用打火机怎么样?
作者: 3121333    时间: 2016-11-27 21:32
简单的
作者: ANSELWX    时间: 2016-11-27 22:18
这个挺容易的
作者: benq1    时间: 2016-12-1 14:33
若n1碰到他 发表于 2016-11-9 20:57
如果我想接32个二极管呢?该怎么改写程序?

那用这样的就太复杂了。
作者: 浮躁的苹果    时间: 2016-12-1 16:00
如此压缩包

流水灯.rar

62.3 KB, 下载次数: 4


作者: 兮丶哈    时间: 2016-12-1 20:36
用位操作就行
作者: 6549649    时间: 2016-12-1 20:50
去微软的确认
作者: CZM199404    时间: 2016-12-2 11:09
原理图看懂就会
作者: feichan61    时间: 2016-12-2 17:15
英语 发表于 2016-11-9 20:34
给你想要点亮灯的引脚给一个0,就可以了

这个你要看是共阴极还是共阳极啊,不能说一味的都是给0

作者: zql111000    时间: 2016-12-2 20:53
ch3odndff 发表于 2016-11-9 08:46
就是规律地控制引脚点位的高低

编写的不够简结,
作者: sadsad    时间: 2016-12-2 21:37
初学者我是
作者: HH2013.08.13    时间: 2016-12-3 17:22
把对应的P1口置0就可以了
作者: whq7059890whq    时间: 2016-12-3 17:38
也在寻找
作者: 初夏微凉    时间: 2016-12-7 18:00
用查表指令MOVC,在表中设置你想亮的方式,读表输出就可以
作者: 简单点爱情    时间: 2016-12-7 20:18
电路图很简单 就是 电阻和灯 串联在单片机的引脚上  程序在用 左右移函数
作者: 初夏微凉    时间: 2016-12-7 20:35
查表,根据查到的值输出
作者: 初夏微凉    时间: 2016-12-7 20:36
查表,根据查到的值输出
作者: 1115475664    时间: 2016-12-7 22:28
加我QQ1115475664发你视频
作者: yzg110    时间: 2016-12-7 22:43
就是规律地控制引脚点位的高低
作者: yzg110    时间: 2016-12-8 09:48
就是规律地控制引脚点位的高低
作者: yzg110    时间: 2016-12-8 09:48
挺简单的,我刚做
作者: chenguangying    时间: 2016-12-8 10:51
在网上都有很多啊
作者: myjlgsl    时间: 2016-12-8 11:20
感谢lz,好东西
作者: 候俊的论坛    时间: 2016-12-8 13:18
怎么上图/
作者: 15177749020    时间: 2016-12-8 13:26
学习楼上
作者: mr734316803    时间: 2016-12-8 14:27
第一个电路图可以
作者: yzg110    时间: 2016-12-8 15:25
自己查资料 效果好
作者: a89336430    时间: 2016-12-8 16:39
这是基础 了  先学c语言
作者: n199202    时间: 2016-12-9 19:02
网上搜资料啊,很简单的
作者: 13032808919    时间: 2016-12-9 19:17
简单的流水灯程序
作者: 13032808919    时间: 2016-12-9 19:17
#include <reg52.h> #define uint unsigned int  #define uchar unsigned char  void main(void) {         uint count, num=0;          P0 = 0xfe;         while(1)         {                          count++;                 if (count>=50000) count = 0;                   if (count==3)                          if (num < 7)                         {                                 P0=P0 << 1;                                 P0=P0 | 0x01;                                 num++;                         }                         else if (num < 14)                         {                                 P0=P0 >> 1;                                 P0=P0 | 0x80;                                 num++;                         }                         if (num >= 14) num = 0;                         }                                                   }
作者: 13032808919    时间: 2016-12-9 19:18
#include <reg52.h> #define uint unsigned int  #define uchar unsigned char  void main(void) {         uint count, num=0;          P0 = 0xfe;         while(1)         {                          count++;                 if (count>=50000) count = 0;                   if (count==3)                          if (num < 7)                         {                                 P0=P0 << 1;                                 P0=P0 | 0x01;                                 num++;                         }                         else if (num < 14)                         {                                 P0=P0 >> 1;                                 P0=P0 | 0x80;                                 num++;                         }                         if (num >= 14) num = 0;                         }                                                   }
作者: 153986166    时间: 2016-12-10 21:35
多看视频多泡论坛,学长的程序和教程可以参考,但是要学会,看会,实践会。才是真理




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1