平凡老师单片机书中的问题,初学,高人指点,谢谢大家了,初学,在线等,指教了!!!!!!!!!!!
1、计数器
首先根据硬件连线写出LED数码管的字型码、位驱动码
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};//位驱动码
uchar code
DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x8
6,0x8E,0xFF};//字型码
------------------------------------------------------------
请问这个是怎么写出来的,怎么根据电路图写出来的?
那个图在:http://slamhoop.blog.sohu.com/ 由于不会传图,只能传到这了,大家不要笑话。^_^
=======================================================================================
串行口编程
void main()
{ uchar KeyValue;
P1=0xff; //关闭P1 口接的所有灯
TMOD=0x20; //确定定时器工作模式
TH1=0xFD;
TL0=0xFD; //定时初值
PCON&=0x80; //SMOD=1
TR1=1; //开启定时器1
SCON=0x40; //串口工作方式1
REN=1; //允许接收
for(;;)
{ if(KeyValue=Key())------------------------------这句话干什么呢?keyvalue本身没有值,那这个if干什么呢?
{ if((KeyValue|0xfb)!=0xff) //K1 按下
SendData(0x55);
if((KeyValue|0xf7)!=0xff)
SendData(0xaa);
}
if(RI)
{ P1=SBUF;
RI=0;
}
}
}
================================================================================================
寄存器组切换
使用c语言编程时,内存由编译器分配的,因此,不能简单的由RS0、RS1来切换工作寄存器组,否则会造成内存冲突。
----------是否可以解释一下以上这句话,为什么会造成内存冲突,是否可以详细解释一下,最好举个例子,谢谢了。
ps:本人初学,希望大家不要笑话,不吝赐教,谢谢了,万分感激。
另一本单片机书里的问题。
再将DATA、CODE区的地方有如下一段话:
数据段中有两个小段第一个子段包含四组寄存器组每组寄存器组包含八个寄存器
共32 个寄存器可在任何时候通过修改PSW 寄存器的RS1 和RS0 这两位来选择四组寄存器
的任意一组作为工作寄存器组8051 也可默认任意一组作为工作寄存器组工作寄存器组
的快速切换不仅使参数传递更为方便而且可在8051 中进行快速任务转换
另外一个子段叫做位寻址段BDATA 包括16 个字节共128 位每一位都可单独寻
址8051 有好几条位操作指令这使得程序控制非常方便并且可帮助软件代替外部组合
逻辑这样就减少了系统中的模块数位寻址段的这16 个字节也可像数据段中其它字节一
样进行字节寻址
------------------------数据段中怎么能包含寄存器,寄存器就是ram?寄存器在硬件上就是ram?
=====================================================================================
2.4 IDATA 区
8051 系列的一些单片机如8052 有附加的128 字节的内部RAM 位于从80H 开始的地址
空间中被称为IDATA 因为IDATA 区的地址和SFRs 的地址是重叠的通过区分所访问的
存储区来解决地址重叠问题因为IDATA 区只能通过间接寻址来访问
----------------------------------请问IDATA 区的地址和SFRs 的地址是重叠的,这个是怎么回事,理解不了,为什么地址是重叠的呢,还有是怎么做成地址重叠的呢,地址重叠是怎么一回事?用间接寻址是怎么区分所访问的空间的,既然重叠了,就肯定会访问同一块空间啊?
-------大家指教本人菜鸟,谢谢大家了,希望不吝赐教啊。谢谢了!!!!!!!!!
===============================================================================
2.5 XDATA 区
如果不需要和外部器件进行I/O 操作或者希望在和外部器件进行I/O 操作时开关RAM
则XDATA 可全部使用64K RAM
----------------------------------这个开关ram是怎么回事,为什么要这么做?是开还是关时全部使用ram的?
===============================================================================
psw寄存器中f0通用标志位是做什么的?smod寄存器中gf0、gf1通用标志位是做什么用的?
=========================================================================================
电平触发和边沿触发有什么区别,为什么存在两种方式,是不是cpu用脉冲触发(边沿)而I/O口用电平触发。
=========================================================================================
本人很菜,希望大家帮忙,指教了。
DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x8
6,0x8E,0xFF};//字型码
------------------------------------------------------------
请问这个是怎么写出来的,怎么根据电路图写出来的?
八段数码管,每一段对应一条显示边,再对应连到驱动控制的管脚上,在显示的时候就得到对应的编码,因不同的连接而异.
for(;;)
{ if(KeyValue=Key())------------------------------
这句话干什么呢?keyvalue本身没有值,那这个if干什么呢?
这个是取出键盘的返回值,我猜,没有按键回返回0,不进入后面的按键识别
{ if((KeyValue ?0xfb)!=0xff) //K1 按下
按键识别
寄存器组切换
使用c语言编程时,内存由编译器分配的,因此,不能简单的由RS0、RS1来切换工作寄存器组,否则会造成内存冲突。
----------是否可以解释一下以上这句话,为什么会造成内存冲突,是否可以详细解释一下,最好举个例子,谢谢了。
51比较单纯,什么资源都能用,要是用户改动了,编译器检测不到,就可能复写,得不到正确的值
如果不需要和外部器件进行I/O 操作或者希望在和外部器件进行I/O 操作时开关RAM
则XDATA 可全部使用64K RAM
----------------------------------这个开关ram是怎么回事,为什么要这么做?是开还是关时全部使用ram的?
RAM开关就是RAN阵的片选....
psw寄存器中f0通用标志位是做什么的?smod寄存器中gf0、gf1通用标志位是做什么用的?
我也没怎么用过...
电平触发和边沿触发有什么区别,为什么存在两种方式,是不是cpu用脉冲触发(边沿)而I/O口用电平触发。
边缘触发:在IO检测到一个上升沿或下降沿的时候就触发中断
电平触发:在IO检测到一个稳定的电平后才触发中断
字形码那个简单吧,怎么来的有如下几个步骤
1)确定共阴极还是共阳极,以共阳极为例。
2)确定哪个管脚与哪一笔画对应
3)确定管脚与单片IO管脚连接方式,(共阳极时,哪个管脚为0,哪个笔划亮)
4)在纸上(或专用的数码管计算器)写出,比如“A”的时候,要亮的管脚置成0,暗的置成1
5)使用的时候向IO口送数据即可。
if(KeyValue=Key())------------------------------这句话干什么呢?keyvalue本身没有值,那这个if干什么呢?
----------------
key()
肯定是有按键的时候返回按键,否则返回0,这句的作用就是执行 KeyValue=Key() 并判断KeyValue的值。
这一版块,太没人气了,是不是大家都成大侠了
如果成大侠了,也常回家看看嘛,家里太冷清了
据说努力顶帖也是一种美德,但我只想大家常回家看看
毕竟每天都有新手需要帮忙,而我能帮的只能是把帖子顶起来