历史上的今天
今天是:2025年11月12日(星期三)
2022年11月12日 | 【51单片机】 数据管显示HELLO
2022-11-12 来源:csdn
软件准备+硬件准备
软件:
1.Keil软件v6.12(与书中版本保持一致方便学习,如果喜欢别的版本也可以下载别的)
2. STC-ISP(将十六进制代码写到单片机上)
硬件:TX-1C(书本推荐,并非本人广告)
【学习单片机,你起码得有块单片机的板子吧…也不一定是自己的,借别人的也可以】
HELLO.程序
#include #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; //申明U1锁存器的锁存端 sbit wela=P2^7; //申明U2锁存器的锁存端 void delayms(uint xms){ //延时函数 uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void main() { while(1) { dula=1; P0=0x76; //送段选数据,显示H dula=0; P0=0xff; //原来段选数据通过位选锁存器造成混乱,专业术语叫"消影" wela=1; P0=0xfe; //送位选数据 wela=0; delayms(1); //延时 dula=1; P0=0x79; //送段选数据,显示E dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delayms(1); dula=1; P0=0x38; //送段选数据,显示L dula=0; P0=0xff; wela=1; P0=0xfb; wela=0; delayms(1); dula=1; P0=0x38; //送段选数据,显示L dula=0; P0=0xff; wela=1; P0=0xf7; wela=0; delayms(1); dula=1; P0=0x3f; //送段选数据,显示0 dula=0; P0=0xff; wela=1; P0=0xef; wela=0; delayms(1); dula=1; P0=0x80; //送段选数据,显示. dula=0; P0=0xff; wela=1; P0=0xDf; wela=0; delayms(1); } } 如果你是初学者,对其中的一些概念还不太清楚的话,那么就继续往下看。如果和我差不多的话,也可以继续看下,帮我纠正我理解上的错误~(蟹蟹) 一步一步读代码 头文件reg52.h 里面放的是定义52单片机中特殊功能寄存器的位寄存器的 (不是51单片机吗怎么变成52了,其实两者差不多52就比51多了个T2定时器) 在Keil软件中,输 接下来的定义宏我就不细说了。 再接下来就是两个锁存器的声明 什么是锁存器? 就是用来控制数据的输出输入状态的。具体原理看下面: 74HC573(锁存器)引脚图 真值表: (L:低电平H:高电平X:任意电平Z:高阻态(电平由于它相连的其他电气决定)Q0:上次的电平状态) OE 的专业术语为三态允许控制端(低电平有效),通常叫做输出使能端,或输出允许端。 1D-8D:为数据输入端 1Q-8Q:为数据输出端 LE:为锁存允许段或锁存控制端 总结:总的来说,当OE为高电平的时候,不论锁存和数据输入端是什么状态,输出都是高阻态,就是不可控。(所以一般OE都为低电平) 当OE为低电平的时候,LE也为低电平的时候,不论输入什么输出都是上一次输出的状态不会改变。但当LE为H的是什么输出和输入是一致的。 所以不想改变输出的值的时候就应该把LE设为L如果想改变就把LE设为H。 C51数据类型扩展定义 sfr 特殊功能寄存器的数据声明,声明一个8位的寄存器 sfr16 16位特殊功能寄存器的数据声明 sbit 特殊功能位声明,也就是声明某一个特殊功能寄存器中的某一位 bit 位变量声明,当定义一个位变量时可以使用此符号 例:sfr SCON=0x98; 0x98是串行口控制寄存器的开始地址,所以这样声明和赋值之后,SCON就具有此寄存器的功能可以直接对变量的操作来操作寄存器。 所以你要定义某个变量时需要知道那个寄存器的位置来去使用它。 现在来解释代码的意思 sbit dula=P2^6; 声明U1锁存器的锁存端(P2^6)用dula这个变量名表示 sbit wela=P2^7; 声明U2锁存器的锁存端(P2^7)用wela这个变量名表示 延时函数 理解这个含义我们首先要来了解一下单片机中的几个周期 时钟周期(振荡周期):定义为时钟频率的倒数就是单片机外接晶振的频率的倒数。为CPU仅完成一个最基本的动作所用的时间。是单片机中最基本最小的时间单位。 状态周期:时钟周期的两倍。 机器周期:完成一项基本操作所用的时间,如取指令、存储器读/写。为单片机的基本操作周期,由12个时钟周期组成。 指令周期:指CPU执行一条指令所需要的时间,一般一个指令周期含有1-4个机器周期 一次自减操作为机器周期这样算得传入xms就为延时多少ms 计算方法:首先算出时钟周期:T=1/(11.0529M) s 然后一次自减是机器周期 12*T s 为了达到函数效果我们需要计算出1ms所需次数:0.001/12T 次 ->对应于j的初始值 最后双重循环达到延时xms的效果 为什么填1呢?1ms人眼显然是不能辨别的。就好像固定显示一样。其实是在闪烁的。 (电影胶片是24帧 也就是每秒钟可以看到24张图像 低于这个数值就会感觉画面不流畅 如果以24帧为界限 那么人眼在高于0.04167秒的间隔就会感觉到(百度来的..)) 对数据管显示的操作理解 理解一个,其他的就好理解了。 首先你要了解寄存器之间控制的联系 看清图上数字标号的顺序,就能够了解他们输入的对应关系接下来是位选段选的原理图 这样之后应该就能够了解下面一系列代码的含义。而且也能够写出自己想要显示的内容,当然是不能超出它本来的限制的。 对于单个数据管的显示,那个h对应的就是小数点,置1就亮置0就不亮。 然后还有一个小细节需要注意的是赋值是从高位向低位赋值的并不是从低到高。 这样你就可以尝试一下,写出自己想要显示内容的代码了。 效果截图



史海拾趣
|
前提是你有一个完整的keil工程 比如ADC的 调试的时候很多时候用到串口 这里教你怎么样使用Printf 函数 在程序中添加Printf.txt 1, #include 2, /* Private functions ---------------------------------------------------------*/ 下添加 ...… 查看全部问答> |
|
大家好 我在友善2440的winCE 5.0系统中集成了一个web server,用网线连接到路由器(无线路由)上,设置了DMZ之后,可以在外网访问2440板子上的网页。 但是如果我用V6656的无线网卡插在2440板子上,只能在2440所在的局域网的电脑上访问该网页,外 ...… 查看全部问答> |
|
编译后生成的,Memory Configuration部分,这些内存分布感觉不是现在系统里实际的分布嘛。 举例: cpu/my44b0/start.o(.text) .text 0x0c500000 0x2d0 cpu/my44b0/start.o ...… 查看全部问答> |
|
从驱动的描述字面理解应当为“系统进程监视驱动” 麻烦大家帮我分析一下这个驱动文件是监视什么进程的 如何模拟一个程序逃过此驱动文件的监视,谢谢大家了! 驱动文件和软件安装文件在附件中 各位大大,麻烦利用你们的一点时间帮我分析下 软件 ...… 查看全部问答> |
|
在做post STA时碰到一个现象(反标RC(SPEF格式)进行timing分析,): 刚开始STA 脚本里是先反标的spef文件,然后再source timing constraint, 这样跑完整个chip -level STA 需要9个多小时。 后来 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:25 编辑 为什么红外接收管输出到单片机总是低电平?图示红外对管检测有无障碍物,为什么右端总是为低?(0.1v)右端直接接51单片机接口可以不?能得到开关量吗? [ 本帖最后由 lmf418482682 于 2011-5-26 10 ...… 查看全部问答> |




