(二)重拾单片机 第一天 LED灯

由图知道 低电平 亮,高电平 灭

控制第一个 LED1 亮灭程序代码,如下

#include<reg52.h>
#define uchar8 unsigned char
#define uint16 unsigned int
sbit      LED1=P1^0;
/*****************************/
// 函数名称: DelayMS( )
// 函数功能: 延时
// 入口函数: 延时毫秒
// 出口函数: 无
/*********                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             *******************/
void DelayMS(uint16 val)
{
       uint16  i,j;
       for(i=0;i<val;i++)
           for(j=0;j<113;j++);

}

void main()
{

   while(1)
   {
      LED1=0;
      DelayMS(1000);
      LED1=1;
      DelayMS(1000);

   }

}

__________________________________________________________________________________________________________________________

流水灯程序代码:

#include<reg52.h>
#include<intrins.h>
#define uchar8 unsigned char
#define uint16 unsigned int
#define     LED  P1
/*****************************/
// 函数名称: DelayMS( )
// 函数功能: 延时
// 入口函数: 延时毫秒
// 出口函数: 无
/*********                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             *******************/
void DelayMS(uint16 val)
{
       uint16  i,j;
       for( i=0;i<val;i++)
           for(j=0;j<113;j++);

}

void main()
{

    int i;

  while(1)
  {
    LED=0xff  ;       //  这里端口全被设置为 1111 1111 ,相当于 全灭

   for(i=0;i<8;i++)
   {

      LED=LED<<1;    // 选择了左移循环
      DelayMS(1000);

   }

  }

}

1、2亮

1、2、3亮

1、2、3、4亮

。。。。。。

1、2、3。。。。。8 全部亮

________________________________________________________________________________________________________________

跑马灯程序代码:

#include<reg52.h>
#include<intrins.h>
#define uchar8 unsigned char
#define uint16 unsigned int
#define     LED  P1
/*****************************/
// 函数名称: DelayMS( )
// 函数功能: 延时
// 入口函数: 延时毫秒
// 出口函数: 无
/*********                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             *******************/
void DelayMS(uint16 val)
{
       uint16  i,j;
       for( i=0;i<val;i++)
           for(j=0;j<113;j++);

}

void main()
{

    LED =0xfe;

  while(1)
  {
    LED=_crol_(LED,1);
       DelayMS(1000);

  }

}

只有一个LED灯 亮。

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

程序目标: 实现LED跑马灯 先从左向右移动,后从右向左移动,循环往复

方案一: 数组的字节操作

#include<reg52.h>
#define uchar8 unsigned char
#define uint16 unsigned int
#define     LED  P1
uchar8 code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe} ; 

/*****************************/
// 函数名称: DelayMS( )
// 函数功能: 延时
// 入口函数: 延时毫秒
// 出口函数: 无
/*************************                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            *******************/
void DelayMs(uint16 val)
{
       uint16  i,j;
       for( i=0;i<val;i++)
           for(j=0;j<113;j++);

}

void main()
{

    int i;

  while(1)
  {

   for(i=0;i<16;i++)
   {

      LED=tab[i];
      DelayMs(1000); 

   }

  }

}

方案二: 移位运算符的实现

#include<reg52.h>
#define uchar8 unsigned char
#define uint16 unsigned int
#define     LED  P1 

/*****************************/
// 函数名称: DelayMS( )
// 函数功能: 延时
// 入口函数: 延时毫秒
// 出口函数: 无
/*************************                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            *******************/
void DelayMs(uint16 val)
{
       uint16  i,j;
       for( i=0;i<val;i++)
           for(j=0;j<113;j++);

}

void main()
{

    int i;
    uchar8 temp;

  while(1)
  {

        temp=0x01;  // 0000 0001
        for(i=0;i<8;i++)
        {
           LED= ~temp;
           DelayMs(1000);
           temp=temp<<1;  

        }  

        temp=0x80;     // 1000 0000
        for(i=0;i<8;i++)
        {
           LED= ~temp;
           DelayMs(1000);
           temp=temp>>1;  

        }

  }

}

方案三:运用循环左右移函数来实现

#include<reg52.h>
#include<intrins.h>
#define uchar8 unsigned char
#define uint16 unsigned int
#define     LED  P1 

/*****************************/
// 函数名称: DelayMS( )
// 函数功能: 延时
// 入口函数: 延时毫秒
// 出口函数: 无
/*************************                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            *******************/
void DelayMs(uint16 val)
{
       uint16  i,j;
       for( i=0;i<val;i++)
           for(j=0;j<113;j++);

}

void main()
{

    int i;
    uchar8 temp;

  while(1)
  {

        temp=0xfe;  // 1111 1110
        for(i=0;i<7;i++)     //  注意这里i<7 ,不再是 i<8
        {
           LED= temp;
           DelayMs(1000);
           temp=_crol_(temp,1);  // 执行左移函数,将 temp 中的函数循环左移一位  

        }  

        for(i=0;i<7;i++)
        {
           LED= temp;
           DelayMs(1000);
           temp=_cror_(temp,1);   // 右移函数

        }

  }

}
时间: 2024-12-29 12:26:05

(二)重拾单片机 第一天 LED灯的相关文章

重拾单片机 第一天 LED灯

由图知道 低电平 亮,高电平 灭 控制第一个 LED1 亮灭程序代码,如下 1 #include<reg52.h> 2 #define uchar8 unsigned char 3 #define uint16 unsigned int 4 sbit LED1=P1^0; 5 /*****************************/ 6 // 函数名称: DelayMS( ) 7 // 函数功能: 延时 8 // 入口函数: 延时毫秒 9 // 出口函数: 无 10 /*********

51单片机第一弹---流水灯

转行搞硬件..acm算是走到头了,毕竟电子是自己专业的特色.. 初撸单片机,买的板子是STC89C52(某宝58大洋淘来的..) 郭天祥新概念的那本书(好像有点不配套不过凑活着弄了也..) 说一下容易犯的错误吧. 1.串口驱动搞了1个多小时..一直安装不上,后来跟着教程做的 2.书上写的控制LED端口的是P1 ,但实际上买的这快板子是P2 ,最开始搞了半天老是点不亮灯,后来一想会不会端口错了,换成0试试?换了不行,又换了2..亮了(这是个问题,以后要找学长问问,怎么根据开发板看出来每个模块的端口

重拾单片机 第三天 中断讲解(一)

52单片机: 中断源: INTO0--外部中断0,由P3.2端口线引入,低电平或下降沿引起. INTO1--外部中断1,有P3.3端口线引入,低电平或下降沿引起. T0--定时器/计数器0中断,由T0计数器计满回零引起. T1--定时器/计数器1中断,由T1计数器计满回零引起. T2--定时器/计数器2中断,由T2计数器计满回零引起. TI/RI--串口中断,串行端口完成一帧字符发送/接收后引起. 单片机在使用中断功能时,通常需要设置两个与中断有关的寄存器: ①中断允许寄存器IE ②中断优先级寄

重拾单片机 第二天 数码管的使用 (动态扫描数码管)

我们要实现的功能是什么呢? 从 第一个数码管扫描 1 到第二个数码管 2 ,第三个数码管 3,.......一直到 第8个数码管 显示8 1 /*--------------www.szjcdz.cn-------------------- 2 名称:数码管动态扫描 3 编写:shenhui 4 日期:2015.10.28 5 内容:数码管动态扫描 6 ------------------------------------------------*/ 7 #include<reg52.h>

重拾单片机 第二天 数码管的使用 ( 按下加按键,数值增加直到最大值,按减按键,数值减小,直到最小值 )

1. 1 /*--------------www.szjcdz.cn-------------------- 2 名称:2按键加减操作 3 编写:szjcdz 4 日期:2010.9 5 内容:按下加按键,数值增加直到最大值,按减按键,数值减小,直到最小值 6 ------------------------------------------------*/ 7 #include<reg52.h> 8 #define uchar8 unsigned char 9 #define uint16

TQ2440按键点亮LED灯的裸机程序

一,说到做ARM的裸机程序,很多人马上就会联想到一个名为ADS的开发工具,但是我们在linux下同样也可以做ARM的裸机程序,下面来说说其具体实施过程: 步骤一:编辑代码,这个没什么好说的. 步骤二:编译代码,编译代码分为三个方面的内容:1.链接脚本 2.用命令行确定链接时的文件顺序 3.用命令行编译.这三部分的内容可以全部写成一个Makefile文件,编译的时候执行make命令就可以了. 步骤三:把编译后的".bin"文件烧写进开发板,重新上电观察效果. 二,TQ2440按键点亮LE

[51单片机学习笔记ONE]-----LED灯的多种使用方法

一.交替闪烁8个LED灯,时间间隔为1s 1 /****************************************************** 2 实验名称: 交替闪烁8个LED灯,时间间隔1s 3 实验时间: 2014年12月2日 4 ******************************************************/ 5 6 #include <reg51.h> 7 8 void delay(unsigned char a); 9 10 void m

起航,第一个程序——还是LED灯

如同学基本语言一样,helloworld是很多语言的第一个程序.在嵌入式开发中,点亮LED灯也是各种架构和开发板的第一个程序,其中很多东西是和单片机例如stm32是类似的,只是,现在我们没有了库函数,我们要自己完成一些东西. 先说启动文件,st官方已结给我们做好了,但是jz2440开发板没有统一的启动文件,需要自己编写,那么,基础的arm汇编就得有所熟悉,在之后的学习中,遇到一个指令就学习一个. (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串1.0组成的机器码,可以由CPU读取执行.

1.2.第一个实验——点亮LED灯

1.2.第一个实验--点亮LED灯 预备知识: (1)位.字节.IO端口.IO口 字节是内存管理的最小单位,一个字节是八位,每一位可以存放一个二进制位(0或者1).一个IO端口包括一组IO口,一般一组是八个,一个端口就是一组IO引脚.一个IO口对应一个二进制位,一个IO端口对应一个字节. (2)二进制和十六进制的转换 一个十六进制位等于四个二进制位,比如0xff对应二进制是1111 1111 实验目的:点亮八颗LED灯 实验过程分析: (1)八颗LED分别由八位二进制位来控制,二进制位是1时LE