打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
零基础学习单片机

近公司要做智能小车的改装。笔者很是惭愧,浑浑噩噩在大学读了4年的电子专业,到头来单片机都没玩过2次。

  计划花一段时间来玩单片机,从最简单的LED入手。

  该系列的学习笔记 开发环境是:开发板:HC800EM3  感觉是一块很不错的开发板,提供的外部接口不少,板子还提供了单片机与arm的“转换接口”。

  单片机型号:STC90C516RD+ arm:STM32开发工具:keil 3 (单片机版)

  一、原理图由于网上的教程很多,对于keil的使用以及板子的电路分析 就不具体介绍了

  二、单片机延时程序的粗浅分析为了让LED灯能够具有多种效果(例如闪烁),必然要用到延时程序。部分网友说,单片机的延时程序精度不高,建议用定时器。但是毕竟是入门,之后再研究定时器吧。

  下面的程序是在12MHZ 晶振源,延时1ms的c程序。

  view plain void delay_ms(void)

  { unsigned char a,b,c;

  for(c = 1;c > 0; c——)

  for(b = 142; b > 0; b——)

  for(a = 2; a>0; a——);} 1、机器周期一个机器周期包含12个时钟周期。时钟周期的计算公式=(1/晶振频率)秒。

  例如,晶振为12MHZ该单片机的时钟周期=(1/12)微秒,由此可以得到机器周期为1us.在这里机器周期可以理解为指令周期,就是单片机执行一条指令花费的时间。注:这里的指令并不是C语言的指令,而且机器指令,可以通过反汇编查看。

  2、反汇编我们要计算一个程序执行的时间,毕竟查看其对应的反汇编代码。这里附上上面程序的反汇编代码,keil 可以调出反汇编代码查看窗口。

  view plain 54: void delay(void)

  55: { 56:     unsigned char a,b,c;57:     for(c=1;c>0;c——)

  C:0x0045    7F01     MOV      R7,#0x01 58:         for(b=142;b>0;b——)

  C:0x0047    7E8E     MOV      R6,#0x8E 59:             for(a=2;a>0;a——);C:0x0049    7D02     MOV      R5,#0x02 C:0x004B    DDFE     DJNZ     R5,C:004B C:0x004D    DEFA     DJNZ     R6,C:0049 C:0x004F    DFF6     DJNZ     R7,C:0047 60: } C:0x0051    22       RET 3、反汇编分析下面列出了 delay_ms() 每条指令对应的机器周期。

  这里附上8051 的指令周期表下载地址。

  view plain <span style="white-space:pre">    </span>指令     机器周期C:0x0045    7F01     MOV      R7,#0x01      1

  C:0x0047    7E8E     MOV      R6,#0x8E      1

  C:0x0049    7D02     MOV      R5,#0x02      1 C:0x004B    DDFE     DJNZ     R5,C:004B     2 C:0x004D    DEFA     DJNZ     R6,C:0049     2 C:0x004F    DFF6     DJNZ     R7,C:0047     2

  C:0x0051    22       RET                2下面我们来计算 该程序 需要耗费多少时间。(不理解汇编指令的话,可以查看8051 指令周期表)

  DJNZ     R5,C:004B,执行该循环所用的机器周期数为2*2=4.从第三条指令到第五条指令的循环,执行该循环所用的机器周期数为(1+2*2+2)*142从第二条指令到第六条指令的循环,执行该循环所用的机器周期数为(1+(1+2*2+2)*142+2)*1 view plain delay_time = 1+(1+(1+2*2+2)*142+2)*1+2 秒网上提供了一个很不错的延时程序计算软件。单片机小精灵软件三、主程序view plain <pre name="code" class="cpp">int main(void)

  { P2 = 0xFE;

  while(1)

  { delay_ms(100);      //延时100ms P2 ^= (1 << 0);       //取反}

  return 0;}程序的执行效果是 D1每隔100ms会闪烁一次

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【专业知识】>>【关于延时】
MCS51汇编精确延时程序分析
编写延时函数的简单方法
5课:单片机延时程序分析
单片机入门教程
51单片机ram扩展该怎样?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服