登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[学习笔记] 寒假学习笔记

[复制链接]
发表于 2019-1-27 20:45:41 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 复习一下简单的流水灯,以及非精确延时
开始时间: 2019-01-27
结束时间: 2019-01-27
已经放假了好久,家里事情清楚了,开始更贴,每天一贴。
帖子或许会迟到,但不会缺席。
今天第一次来复习一下之前在学校的时间学到的关于流水灯的部分,主要是要对位进行操作。有几个重要的操作是关于三极管,74HC245和74HC138的。
由于单片机IO口驱动能力有限,为了保护单片机,所以可以用三极管来驱动, 1548161060393.jpg 通过单片机向三极管基极发出不同的电平来控制三极管集电极于发射极的通断,进而控制小灯的亮灭。74HC245是一个双向缓冲器,这个芯片在逻辑上起不到任何作用,主要是为缓冲电流,可以通过对OE,DIR引脚的配置来确定其通断及方向,用法简单;
而74HC138的出现, 1548161072795.jpg 可以充分的利用单片机IO口,它能把三种输入状态翻译成八种输入状态,在电开的开发板上三个输出在P20 P21 P22,通过三个不同电平即可翻译出八种电平,用法也不难,了解这些后,写个简单的小流水灯肯定已经是没有任何问题。写几个流水的吧
#include "stc12c5a60s2.h"
#define unchar unsigned char
#define unint unsigned int//宏定义来简便后续操作

void DEALY(unint a)//简单的非精确延时函数
{        unint b;
        while(--a!=0)
         {
                for(b=0;b<125;b++);       
   }
}

void main()
{
        unint i=0;//循环次数
        unchar cnt;
        unchar tab1[7]={0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e};//同时亮两个及以上时可以通过定义这个P0口来完成;
        unchar tab2[8]={0x7e,0x3c,0x18,0x00,0x18,0x3c,0x7e,0xff};//同样,通过循环数组来实现各种花样;
       
        P20=0;//单片机上LED灯在138的LEDS6口上
        P21=1;//查表或者用多了就能记住这三个口输出这样的电平时为导通LEDS6;
        P22=1;//当然了,简单没有按键的情况下,完全可以用P2=0x06;d来代替以上三行操作;
        P11=0;//打开,使能74HC245;

       
        while(1)//进入死循环
        {
                 //LED小灯左向右单个点亮
                cnt=0x01;
                for(i=0;i<8;i++)
                {
                        P0=~cnt;//先移位在取反可以控制单个亮
                        DEALY(500);
      cnt<<=1;//每次左移一位即点亮了下一个LED                       
                }       
               
                //LED小灯右向左单个依次点亮
                cnt=0x80;
                for(i=0;i<8;i++)
                {
                        P0=~cnt;
                        DEALY(500);
      cnt>>=1;                       
                }       
               
                //LED从左到右依次熄灭
                cnt=0xff;
                for(i=0;i<8;i++)
                {
                        P0=~cnt;
                        DEALY(500);
      cnt<<=1;                       
                }       

                //LED从右到左依次熄灭
                cnt=0xff;//因为cnt移位在取反以后,所以若循环8次,会有最后一个LED不能熄灭,但不熄灭效果还可以,循环9次可以一次全熄灭
                for(i=0;i<9;i++)
                {
                        P0=~cnt;
                        DEALY(500);
      cnt>>=1;                       
                }
               
                cnt=0;

        for(i=0;i<8;i++)//跟第二个一样,LED小灯右向左单个依次点亮
                 {
                  P0=~(0x80>>cnt);
                  DEALY(500);
                    cnt++;
                  if(cnt>=8)
                          cnt=0;
           }
                 
                  //跟第一个一样,LED小灯左向右单个依次点亮
                 for(i=0;i<8;i++)
                 {
                  P0=~(0x01<<cnt);
                 DEALY(500);
                   cnt++;
                  if(cnt>=8)
                         cnt=0;
                       
                //LED从右到左依次熄灭,一种不同的表示方法
                for(i=0;i<8;i++)
                {
                        P0=~(0x7F>>cnt);
                        DEALY(500);
      cnt++;
                        if(cnt>=8)
                         cnt=0;
                }
               
                  //LED从左到右依次熄灭
                for(i=0;i<8;i++)
                {
                        P0=~(0xFE<<cnt);
                        DEALY(500);
      cnt++;
                        if(cnt>=8)
                         cnt=0;
                }
               
                       
               
                for(i=0;i<8;i++)//注意循环次数,从右到左全部点亮
                {
                        P0=(0x7F>>cnt);
                        DEALY(500);
      cnt++;
                        if(cnt>=8)
                         cnt=0;
                }
               
                //从左到右全部点亮
                for(i=0;i<8;i++)//一个其实挺枯燥的,但那么多花样都是由一点点的小细节组成的
                {
                        P0=~(0x7F>>cnt);//这一个循环和上一个一起循环可以成一个像过火车一样的无限循环,只要肯发现,还是很好玩的
                        DEALY(500);
      cnt++;
                        if(cnt>=8)
                         cnt=0;
                }
               

                 for(i=0;i<8;i++)//左右同时向中间亮,对tab2[]~与否就可以从中间开始向两侧亮,挺不错的,通过数组来实现
                {
                        P0=tab2;
                        DEALY(1100);
                        if(i>=8)
                                i=-1;               
                }


                for(i=0;i<4;i++)//双灯向中间循环
                {
                        P0=tab1;
                        DEALY(1100);
                        if(i>=3)
                                i=-1;       
                 }       


        }
}
今天大概就这么多吧,寒假会学单片机,C语言,在有几个小制作;
希望自己在寒假能有提升;
若有不足,请各位大佬多多指正;

好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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