专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

C51单片机学习手记之1:一盏闪烁的LED

作者:佚名   来源:本站原创   点击数:  更新时间:2010年05月21日   【字体:

  最近开始学习C51单片机,可谓磕磕绊绊,因为本人比较笨笨啦...(听听Michael Jackson的《Heal The World》就坚持下来了),不知道对大家是否有用...

闲言碎语不要讲,下面我就来说说这迈出的第一步,我从2010年才接触到单片机,想想比别人晚了10多年,不过没关系,只要有心学习,从0-1很难,但从1到100、1000、...可能就没有那么麻烦了。主要要自学单片机原理、电子线路、汇编语言,C语言,如果你刚好学过,那就恭喜啦。
本文旨在介绍单片机入门的基础知识,为和我一样的新手提供一个交流的平台。仿真所使用单片机为ATMEL公司的AT89C52,软件为PROTEUS和KEIL;只提供原理图和KEIL环境下的注释,希望对广大即将接触单片机的人有所帮助,如果有错误欢迎回帖指出与本人交流或QQ联系(93542746),共同进步。
一盏闪烁的LED


 

本人用Proteus画得原理图如下所示,该电路较简单,在P1.7上接一个发光二极管,为防止电流过大烧坏二极管(LED的Imax=10mA),因此接了一个限流电阻。单片机31引脚(EA/Vpp)要接高电平,因为单片机访问的是下载到单片机内部的程序。
原理图:
 
汇编程序:
      org 000h
      ajmp main
      org 003h
main:   mov P1,#07fh ;7fh的二进制数为01111111,P1.7输出低电平
      acall del  ;调用延时子程序
      mov p1,#0ffh ;ffh的二进制数为11111111,P1.7输出高电平
      acall del
      ajmp main
del:    mov r5,#04h
del1:   mov r6,#0ffh
del2:   mov r7,#0ffh
del3:   djnz r7,del3 ;r7中内容减1后判断,为0,向下执行;不为0,执行本身
      djnz r6,del2
      djnz r5,del1 ;共做04h*ffh*ffh次减1,即4*256*256次
      ret
      end
C程序:
#include <reg52.h>  //通用89C52头文件
/*************************************************************
* IO定义 *
/*************************************************************/
sbit LED    =   P1 ^ 7;  
//定义P1.7为LED控制口,低电平LED亮
/*************************************************************
* 毫秒级延时函数 *
调用函数必须给延时函数一个0~65535的延时值对应0MS到65535MS
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*************************************************************/
void Delay (unsigned int a){    //需要输入变量值0~65535
  unsigned int i;
  while( --a != 0){     //i 从0加到125,CPU大概就耗时1毫秒
    for(i = 0; i < 125; i++); //空指令循环  
  }
}
/*************************************************************
* 主函数 *
/*************************************************************/
void main (void){  
 while(1){   //无限循环以下程序
  LED = ~LED;  //取LED相反状态
  Delay(150);  //延时150ms
 }     //(0~65535之间)
}
仿真效果图:
 
关闭窗口

相关文章