矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: wey05

帮助新手学习单片机数码管电子钟:原理,c程序详解

  [复制链接]
 楼主| 发表于 2011-5-4 14:27:04 | 显示全部楼层
原帖由 millwood 于 2011-5-3 23:26 发表


those are fairly long calculations so you shouldn't be putting them in the isr. instead, put them in the main() loop.



code like that is very unportable: what if you were to move the led to  ...

英文先生:
1,如果把显示值刷新放在main循环中也可以,只是由于主循环中又要进行按键处理,这样在按键时就会破坏刷新,造成显示在按键时黑掉。因为中断间隔此时长达2ms,处理这些刷新没有问题。,
2,也就是增加
# define   LED_DATA_PORT  P0
# define   LED_BIT_PORT  P2
在程序中就是用   LED_DATA_PORT   和   LED_BIT-PORT    不再直接使用P0 P2以便修改其他口只要在宏定义中修改便可。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-6 09:25:17 | 显示全部楼层

深入一小步:看看头文件

在C程序中,开始第一句就是头文件包含,这里仅仅是:
#include "reg52.h"
有些比较复杂的场合,还可能有更多的头文件xxx.h要包含进去,那头文件里究竟是什么货色呢?让我们就打开这个头文件一看究竟:在编程平台KEIL中,左边源文件目录展开找到我们编程时添加进去的头文件,双击打开如下图所示
hh.jpg
看见了吧,它就是对于C52里面所有的特殊功能寄存器的实际位置(内存地址),以及可寻址位的地址的定义,在这里已经定义好了所以我们早程序中就可以直接以这些寄存器和可寻址位的名称直接加以使用。例如在下节9052扩展中,定义了8051所没有的定时计数器T/C2有关的寄存器,=号左方是寄存器名,右方是他的地址:
/*  8052 Extensions  */
sfr T2CON  = 0xC8;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2    = 0xCC;
sfr TH2    = 0xCD;
但是,你会发现其中没有T2MOD,所以如果在程序中直接使用T2MOD,并给它赋值时编译时就会出错。
怎么办呢:
1,就是用它的默认值,在程序里不出现T2MOD。例如这个数字钟,就确定T2的16位自动重载方式T2MOD=0;和它的默认值相同,也不要求取其他数值。干脆就不提他。
2,在程序里按照他的地址,自己追加定义sfr T2MOD = 0xc9;如果要使用它的两个可寻址位T2OE 和  DCEN则还要加上
sbit T2OE =T2MOD^1;
sbit DCEN = T2MOD^0;
3,直接修改头文件,编辑reg52.h把这三项 加进去在另存为一个新的头文件reg52_1.h在程序中就直接包含他就行了。
实际上在程序比较复杂,牵涉到东西较多,例如液晶显示、使用实时钟电路和测温电路的日历钟,我们可以把程序分为几个部分来写,头文件也就不止一个,可以自己根据需要编辑新的头文件。让里面含有全局变量的声明、相关函数的声明以及上一级头文件的包含,等等,还要编制功能相对集中的C文件是整个大程序化整为零,进一步模块化。除了便于理解以外,各个模块还可以用于其它的程序,以减少重复劳动的麻烦。
回复 支持 反对

使用道具 举报

发表于 2011-5-6 18:49:27 | 显示全部楼层
#include "reg52.h"


unless you want to use your own header file or a particular instance of a customized header file, use the header file provided by the compiler.

so instead of what you wrote above, use
#include <reg52.h>


and better yet, use the vendor specific header file. like regx52 if you are using certain atmel '52 chips.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-7 11:55:30 | 显示全部楼层

yea!

#include "stc89c51rc_rd_plus.h"
回复 支持 反对

使用道具 举报

     
发表于 2011-5-9 13:31:47 | 显示全部楼层
很好的资料,俺去年暑假开始自学单片机和习语言的,不懂得就看书(图书馆的),走了不少弯路,不过书读百遍其义自现啊,基本懂中断和定时、计数了。能否讲一下指针函数啊,看书看了N遍不懂。还有12864的显示,及I2C通信。谢谢啦,谢谢。
回复 支持 反对

使用道具 举报

发表于 2011-5-11 16:43:15 | 显示全部楼层
很好的教材,对我一个初学者来说太好啦,收藏,谢谢楼主
回复 支持 反对

使用道具 举报

     
发表于 2011-5-11 17:43:30 | 显示全部楼层
顶一个,硬件、软件都交代的很清楚,贡献巨大!
回复 支持 反对

使用道具 举报

发表于 2011-5-16 22:53:17 | 显示全部楼层

多谢辛苦了

谢谢楼主  辛苦了.这几天一直在研究你的这个.慢慢学习.希望再接再厉.也希望大家不要打断.楼主就是针对我们这些菜鸟的.不是技术讨论
回复 支持 反对

使用道具 举报

     
发表于 2011-5-20 08:29:09 | 显示全部楼层
俺也是来学习的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-20 08:53:22 | 显示全部楼层

再补充一个P0口输出的使用问题

在51单片机,P0口和其它口不同,它是“双向口”输出由上下MOS管构成,其它口是“准双向口”输出由下部MOS管和上部电阻构成。
P0口用作输出,可分为两种清隽:
1,做IO口,也就是程序中MOV  P0,XX的情况
2,做外存的地址、数据总线。也就是当单片机EA接地,或者寻址内部ROM更高的地址,以及MOVX指令。
对应这两种情况,如以下示意图:
PORT0.JPG
做IO口如左图,信号来源是绿色箭头:内部总线IB,控制线C为低,使得与门封锁以红色表示,输出级上部MOS管总是断开,信号加到锁存器D端,一旦来了写信号W,锁存器反向输出/Q经开关加到输出级下部MOS管栅极,使得输出端P0.X电位或者是低,或是悬空。(因上部MOS管已经断开)
做外部数据地址总线如右图,可见信号变了,控制线C为高,与门开通用绿色表示,这时输出级上部MOS管直接由输入信号控制,下部MOS管是输入信号经过反相控制,所以这两个管子是是交替通断:上通下断或者上断下通,输出端P0.X电位不是高就是低,不存在悬空状态
因为现在51机大多数情况都是使用片内ROM和RAM,使用片外的情况较少,所以经常用P0口做IO口。如果是使用它驱动LED,那么如右下两种情况都是可以的。如果是驱动别的电路,例如液晶,则最好加上外部上拉电阻,使得P0口有确定的电位不至于悬空,在某些情况下电位不确定(例如某些液晶)会导致驱动失败。
回复 支持 反对

使用道具 举报

     
发表于 2011-5-20 12:59:36 | 显示全部楼层
记号一下,回头看看
回复 支持 反对

使用道具 举报

     
发表于 2011-5-22 05:13:38 | 显示全部楼层
好贴,要收藏学习。
回复 支持 反对

使用道具 举报

     
发表于 2011-5-22 23:42:41 | 显示全部楼层
好贴,刚开始学习单片机。
回复 支持 反对

使用道具 举报

     
发表于 2011-5-24 21:02:11 | 显示全部楼层
感谢楼主老师讲解啊
回复 支持 反对

使用道具 举报

发表于 2011-6-3 18:48:18 | 显示全部楼层
顶一个,硬件、软件都交代的很清楚, 要收藏学习。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-3 06:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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