找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7290|回复: 42
打印 上一主题 下一主题
收起左侧

本人是51新手,想实现灯100ms开,400ms关的一个小程序

  [复制链接]
跳转到指定楼层
楼主
ID:162773 发表于 2017-1-23 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人是51新手,想实现灯100ms开,400ms关的一个小程序;
不知道如何选择一个51 MCU,简单、经济AT或STC的;请老师们指点
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:153041 发表于 2017-1-24 09:29 | 只看该作者
1、程序要自己写,自己调试;参考思路:做一个100ms延时函数(空循环N次),一个400ms延时函数,在主程序里做一个死循环,每个循环里面:1开灯,2调用100ms延时,3关灯,4调用400ms延时;
2、51单片机网上可以去淘货对比,亲自对比过才有体会。你这个功能用2051就行了,便宜小巧。

评分

参与人数 1黑币 +5 收起 理由
25786136 + 5 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:162773 发表于 2017-1-25 09:03 | 只看该作者
utzuzu 发表于 2017-1-24 09:29
1、程序要自己写,自己调试;参考思路:做一个100ms延时函数(空循环N次),一个400ms延时函数,在主程序里 ...

谢谢老师!
回复

使用道具 举报

地板
ID:162773 发表于 2017-1-25 16:39 | 只看该作者

#include <REG52.h>
#define uint unsigned int
#define uchar unsigned char
sbit LED=P1^0;

void delay(uint x);
void main()
{
                while(1)
                {
                                LED=0;
                                delay(100);
                                LED=1;
                                delay(400);
                }

}
void delay(uint x)
{
        uint i,j;
        for(i=0;i<x;i++)
        for(j=1;j<1000;j++);
}
请老师给指点
回复

使用道具 举报

5#
ID:162343 发表于 2017-1-25 20:41 | 只看该作者
本帖最后由 tzh1982657735 于 2017-1-25 20:50 编辑

你的延时函数可能有误差
回复

使用道具 举报

6#
ID:162343 发表于 2017-1-25 20:48 | 只看该作者
本帖最后由 tzh1982657735 于 2017-1-25 20:53 编辑

给你一个延时函数,基本没有误差
void delay1ms(void)
{  
unsigned char a,b,c;
for(c=1;c>0;c--)  
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}


回复

使用道具 举报

7#
ID:162343 发表于 2017-1-25 21:12 | 只看该作者
个人认为51单片机其实选STC比较好,可通过串口下载程序,省去下载器,更方便

评分

参与人数 1黑币 +5 收起 理由
25786136 + 5 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:162773 发表于 2017-1-26 10:59 | 只看该作者
tzh1982657735 老师:能讲一下你的这个延时函数吗?
回复

使用道具 举报

9#
ID:155507 发表于 2017-1-27 05:55 | 只看该作者
C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。 以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。

一. 500ms延时子程序

程序:

  1. void delay500ms(void)

  2. {

  3.         unsigned char i,j,k;

  4.         for(i=15;i>0;i--)
  5.                 for(j=202;j>0;j--)
  6.                         for(k=81;k>0;k--);

  7. }
复制代码

计算分析:

程序共有三层循环

一层循环n:R5*2 = 81*2 = 162us DJNZ 2us

二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值 1us = 3us

三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值 1us = 3us

循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us

延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms

计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5
回复

使用道具 举报

10#
ID:68499 发表于 2017-1-28 23:29 来自手机 | 只看该作者
用stc15w204s 1片一块多,便宜,先进,小巧
回复

使用道具 举报

11#
ID:68499 发表于 2017-1-28 23:29 来自手机 | 只看该作者
可以用软件定时,也可以用timer
回复

使用道具 举报

12#
ID:163124 发表于 2017-1-30 16:43 | 只看该作者
可以定时器来做,也可以延时函数来做。如延时函数做,可以先做100ms的延时函数,然后调用该函数就行,开灯形参选1,关灯形参选4
回复

使用道具 举报

13#
ID:162839 发表于 2017-1-30 20:45 | 只看该作者
可以选择STC,如果对时间要求严格的话可以用定时器进行定时操作,如果不严格的话用延时函数就可以了
回复

使用道具 举报

14#
ID:106021 发表于 2017-1-30 22:27 | 只看该作者
延时程序  基本上在所有的教程里都有
回复

使用道具 举报

15#
ID:163348 发表于 2017-2-3 13:49 | 只看该作者
试试看
回复

使用道具 举报

16#
ID:163348 发表于 2017-2-3 13:51 | 只看该作者
有用得
回复

使用道具 举报

17#
ID:162773 发表于 2017-2-4 08:16 | 只看该作者

angmall 老师:你给我的延时函数分析,说时话我看不懂,
R7、R6、R5等,我都不知道
回复

使用道具 举报

18#
ID:163469 发表于 2017-2-4 17:23 | 只看该作者
用STC89C51足矣,经济实惠,另外精确延时用定时器吧
回复

使用道具 举报

19#
ID:163669 发表于 2017-2-7 23:57 | 只看该作者
买快开发板学习,资料都有,stc89c51大概5元一片在某宝上买,能干不少东西,基本上满足初学
回复

使用道具 举报

20#
ID:164032 发表于 2017-2-9 16:03 来自手机 | 只看该作者
定时可以软件定时也可以定时器定时。
回复

使用道具 举报

21#
ID:164049 发表于 2017-2-9 19:14 | 只看该作者
STM32C51 就不错,用for循环就可以实现,这些程序在新买的的单片机里面都提供的
回复

使用道具 举报

22#
ID:164090 发表于 2017-2-10 08:14 | 只看该作者
不需要太多资源,建议用STC的,STC编程软件里有选型和报价,程序的话看你延时要不要精确,如果稍微精确一点的话,需要用定时器+12MHZ晶振,如果不需要太精确用软件延时就行了,就是DELAY()
回复

使用道具 举报

23#
ID:164127 发表于 2017-2-10 13:36 | 只看该作者
这类程序很多的,多找找
回复

使用道具 举报

24#
ID:164156 发表于 2017-2-10 17:08 | 只看该作者
请使用定时器。主循环中时间是不确定的,尤其是用C写,编译器的效率,中断运行情况都影响delay的时间,做产品时大部分公司规范中是不容许使用delay函数的。
回复

使用道具 举报

25#
ID:152237 发表于 2017-2-11 09:25 | 只看该作者
这么简单的可以选择STC八脚的单片机,
时间用定时器来操作,
晶振用12M或24M,
一般都很准了。。。
回复

使用道具 举报

26#
ID:164222 发表于 2017-2-11 11:56 来自手机 | 只看该作者
可能是晶振采用的不一样
回复

使用道具 举报

27#
ID:164263 发表于 2017-2-11 19:05 | 只看该作者
可以用定时器来做,定时器比较精准
回复

使用道具 举报

28#
ID:164363 发表于 2017-2-12 20:33 | 只看该作者
定时器 直接可以搞定
回复

使用道具 举报

29#
ID:164369 发表于 2017-2-12 21:16 | 只看该作者
AT89C51单片机是最简单的,要实现这个程序,可用延时程序,这是最简单的,要是想提高,可用中断功能
回复

使用道具 举报

30#
ID:162773 发表于 2017-2-13 08:03 | 只看该作者
要实现如下:
1、要求每个LED灯泡的闪烁由一个MCU控制;
2、要求100ms开;400ms关(1秒两个周期);
3、要求在同一输入AC 90--110V 线上并N个灯泡,灯泡的闪烁要同步;
4、我选择的MCU STC15F10W
这里主要是如何实现同步,并且保证100ms开;400ms关(1秒两个周期)时间不错;
回复

使用道具 举报

31#
ID:164450 发表于 2017-2-13 14:39 | 只看该作者
最好用定时器功能,要是使用循环功能,其他事情都做不了
回复

使用道具 举报

32#
ID:155507 发表于 2017-2-13 19:01 | 只看该作者
wuzijun 发表于 2017-2-4 08:16
angmall 老师:你给我的延时函数分析,说时话我看不懂,
R7、R6、R5等,我都不知道

  1. stmt level    source

  2.    1          #include<reg52.h>
  3.    2         
  4.    3         
  5.    4          void delay500ms(void)
  6.    5          {
  7.    6   1      
  8.    7   1        unsigned char i,j,k;
  9.    8   1      
  10.    9   1        for(i=15;i>0;i--)
  11.   10   1          for(j=202;j>0;j--)
  12.   11   1            for(k=81;k>0;k--);
  13.   12   1      
  14.   13   1      }
  15.   14         
  16.   15         
  17.   16          void main (void)
  18.   17          {
  19.   18   1        delay500ms();
  20.   19   1      
  21.   20   1      }
  22.   21         

  23. ASSEMBLY LISTING OF GENERATED OBJECT CODE

  24. ;这几条汇编语言是系统构建
  25.              ; FUNCTION delay500ms (BEGIN) 延时子程序
  26.                                            ; SOURCE LINE # 4
  27.                                            ; SOURCE LINE # 5
  28.                                            ; SOURCE LINE # 9
  29. ;---- Variable 'i' assigned to Register 'R7' ----
  30. 0000 7F0F              MOV     R7,#0FH           ; i=15
  31. 0002         ?C0001:
  32.                                            ; SOURCE LINE # 10
  33. ;---- Variable 'j' assigned to Register 'R6' ----
  34. 0002 7ECA              MOV     R6,#0CAH                ; j=202
  35. 0004         ?C0004:
  36.                                            ; SOURCE LINE # 11
  37. ;---- Variable 'k' assigned to Register 'R5' ----
  38. 0004 7D51              MOV     R5,#051H                ; k=81
  39. 0006         ?C0007:
  40. 0006 DDFE              DJNZ    R5,?C0007
  41. 0008         ?C0006:
  42. 0008 DEFA              DJNZ    R6,?C0004
  43. 000A         ?C0003:
  44. 000A DFF6              DJNZ    R7,?C0001
  45.                                            ; SOURCE LINE # 13
  46. 000C         ?C0010:
  47. 000C 22                RET     
  48.              ; FUNCTION delay500ms (END)
复制代码

R0~R7,是8个工作寄存器。
每个寄存器,可存储 8 位数,即:0~255。
R0~R7就和普通寄存器一样用就行,只不过代码的速度要比普通寄存器快一些。
回复

使用道具 举报

33#
ID:164496 发表于 2017-2-13 21:12 | 只看该作者
用延时,开灯,100毫秒延时,关灯,延时400毫秒,这个步骤写

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

34#
ID:162773 发表于 2017-2-14 06:36 | 只看该作者
angmall 老师:
那如何实现在同一输入AC 90--110V 线上并N个灯泡,灯泡的闪烁要同步;
回复

使用道具 举报

35#
ID:164624 发表于 2017-2-14 16:34 | 只看该作者
P1=0x01  ; delay_ms(100); P1=0x00;delay_ms(400);
回复

使用道具 举报

36#
ID:164721 发表于 2017-2-15 10:29 | 只看该作者
用单片机内的延时程序就行
回复

使用道具 举报

37#
ID:67774 发表于 2017-2-16 02:43 | 只看该作者
常用的51单片机都可以吧。 你选 一下最常用的就好的。 省事。 方便。 网上丰富的资料都可以更方便的剪来用,可以省很多脑细胞哦。另外要注意的是与你现有的板是不是配套。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

38#
ID:164695 发表于 2017-2-16 09:06 | 只看该作者
utzuzu 发表于 2017-1-24 09:29
1、程序要自己写,自己调试;参考思路:做一个100ms延时函数(空循环N次),一个400ms延时函数,在主程序里 ...

程序要自己写,自己调试;参考思路:做一个100ms延时函数(空循环N次),一个400ms延时函数,在主程序里做一个死循环,每个循环里面:1开灯,2调用100ms延时,3关灯,4调用400ms延时;
2、51单片机网上可以去淘货对比,亲自对比过才有体会。你这个功能用2051就行了,便宜小巧。
回复

使用道具 举报

39#
ID:164859 发表于 2017-2-16 09:09 来自手机 | 只看该作者
推荐用stc的有高精度内部时钟的芯片,不用外接晶振,电路设计简单便宜,你可以用官网的下载程序进行单片机选型
回复

使用道具 举报

40#
ID:164851 发表于 2017-2-16 14:05 | 只看该作者
围观大神回答
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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