社区导航

 

搜索
查看: 99932|回复: 264

[资料分享] 【社区大讲堂】之万人学习51单片机!

[复制链接]

1848

TA的帖子

0

TA的资源

禁止发言

发表于 2008-9-12 17:23 | 显示全部楼层 |阅读模式

(, 下载次数: 19)


1848

TA的帖子

0

TA的资源

禁止发言

 楼主| 发表于 2008-9-16 10:24 | 显示全部楼层
第二讲
单片机外部中断使用 (09.16)


  很多人都知道51单片机中中断的重要性,但是书中的长篇累牍让我们一下子理解有点很不适应。所以我们尽可能简化51单片机的中断,目前我们是要学会单片机中断的使用就可以了,而不是从原理基本说起。

  在51单片机中有2个外部中断,这两个外部中断口处于低电平的时候开始触发中断信号,使得程序可以进入中断处理中断部分的程序。

  我们还是老规矩,先看看硬件电路:

 
(, 下载次数: 12)

回复

使用道具 举报

1848

TA的帖子

0

TA的资源

禁止发言

 楼主| 发表于 2008-9-16 10:25 | 显示全部楼层
第三部分 定时器中断培训(09.17)

  关于定时器中断,我们简单介绍一下原理就可以了,因为具体介绍已经有很多资料都已经提供了。

  80C
51单片机内部设有两个16位的可编程定时器/计数器。可编程的意思是指其功能(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。在定时器/计数器中除了有两个16位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1 构成。其访问地址依次为8AH-8DH。每个寄存器均可单独访问。这些寄存器是用于存放定时或计数初值的。此外,其内部还有一个8位的定时器方式寄存器 TMOD和一个8位的定时控制寄存器TCON。这些寄存器之间是通过内部总线和控制逻辑电路连接起来的。TMOD主要是用于选定定时器的工作方式; TCON主要是用于控制定时器的启动停止,此外TCON还可以保存T0、T1的溢出和中断标志。当定时器工作在计数方式时,外部事件通过引脚T0 (P3.4)和T1(P3.5)输入。定时计数器的原理:

当定时器/计数器为定时工作方式时,计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出为止。显然,定时器的定时时间与系统的振荡频率有关。因一个机器周期等于12个振荡周期,所以计数频率fcount=1/12osc。如果晶振为12MHz,则计数周期为:

T=1/(12×106)Hz×1/12=1μs


  这是最短的定时周期。若要延长定时时间,则需要改变定时器的初值,并要适当选择定时器的长度(如8位、13位、16位等)。
 

当定时器/计数器为计数工作方式时,通过引脚T0和T1对外部信号计数,外部脉冲的下降沿将触发计数。计数器在每个机器周期的S5P2期间采样引脚输入电 平。若一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。此后的机器周期S3P1期间,新的计数值装入计数器。所以检测一个由1至0的跳 变需要两个机器周期,故外部事年的最高计数频率为振荡频率的1/24。例如,如果选用12MHz晶振,则最高计数频率为0.5MHz。虽然对外部输入信号 的占空比无特殊要求,但为了确保某给定电平在变化前至少被采样一次,外部计数脉冲的高电平与低电平保持时间均需在一个机器周期以上。

当CPU用软件给定时器设置了某种工作方式之后,定时器就会按设定的工作方式独立运行,不再占用CPU的操作时间,除非定时器计满溢出,才可能中断CPU 当前操作。CPU也可以重新设置定时器工作方式,以改变定时器的操作。由此可见,定时器是单片机中效率高而且工作灵活的部件。

  综上所述,我们已知定时器/计数器是一种可编程部件,所以在定时器/计数器开始工作之前,CPU必须将一些命令(称为控制字)写入定时/计数器。将控制字写入定时/计数器的过程叫定时器/计数器初始化。在初始化过程中,要将工作方式控制字写入方式寄存器,工作状态字(或相关位)写入控制寄存器,赋定时/计 数初值。下面我们就提出的控制字的格式及各位的主要功能与大家详细的讲解。

控制寄存器 定时器/计数器T0和T1有2个控制寄存器-TMOD和TCON,它们分别用来设置各个定时器/计数器的工作方式,选择定时或计数功能,控制启动运行,以及作为运行状态的标志等。其中,TCON寄存器中另有4位用于中断系统。

  TMOD定时器/计数器方式寄存器

  定时器方式控制寄存器TMOD在特殊功能寄存器中,字节地址为89H,无位地址。TMOD的格式如下图所示。

(, 下载次数: 1)

回复

使用道具 举报

1848

TA的帖子

0

TA的资源

禁止发言

 楼主| 发表于 2008-9-16 10:26 | 显示全部楼层
第四部分 串口中断培训(09.18)

MCS-51单片机的串行口具有两条独立的数据线——发送端TXD和接收端RXD,它允许数据同时往两个相反的方向传输。一般通信时发送数据由TXD端输出,接收数据由RXD端输入。MCS-51单片机的串行口既可以用于网络通信,亦可实现串行异步通信,还可以用作同步移位寄存器。如果在串行口的输入输出引脚上加上电平转换器,就可方便地构成标准的RS-232接口。MCS-51单片机的串行接口是一个全双工通信接口,它有两个物理上独立的接收、发送缓冲器SBUF,可以同时发送和接收数据。但是发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。两个缓冲器共用一个地址(99H)。


数据通信的基本概念


常用于数据通信的传输方式有单工、半双工、全双工和多工方式。


  •   单工方式:数据仅按一个固定方向传送。因而这种传输方式的用途有限,常用于串行口的打印数据传输与简单系统间的数据采集。
  •   半双工方式:数据可实现双向传送,但不能同时进行,实际的应用采用某种协议实现收/发开关转换。
  •   全双工方式:允许双方同时进行数据双向传送,但一般全双工传输方式的线路和设备较复杂。
  •   多工方式:以上三种传输方式都是用同一线路传输一种频率信号,为了充分地利用线路资源,可通过使用多路复用器或多路集线器,采用频分、时分或码分复用技术,即可实现在同一线路上资源共享功能。


根据同步方式,串行数据通信有两种形式,如图5-5所示。


  •   异步通信。在这种通信方式中,接收器和发送器有各自的时钟,它们的工作是非同步的。异步通信用一帧来表示一个字符,其内容是一个起始位,紧接着是若干个数据位。
  •   同步通信。同步通信格式中,发送器和接收器由同一个时钟源控制,在异步通信中,每传输一帧字符都必须加上起始位和停止位,占用了传输时间,若要求传送数据 量较大,速度就会慢得多。同步传输方式去掉了这些起始位和停止位,只在传输数据块时先送出一个同步头(字符)标志即可。
  •   同步传输方式比异步传输方式速度快,这是它的优势。但同步传输方式也有其缺点,即它必须要用一个时钟来协调收发器的工作,所以它的设备也较复杂。


MCS-51的串行口控制寄存器


在完成串行口初始化后,发送数据时,采用MOV SBUF,A指令,将要发送的数据写入SBUF,则CPU自动启动和完成串行数据的输出;接收数据时,采用MOV A,SBUF指令,CPU就自动将接收到的数据从SBUF中读出。


控制MCS-51单片机串行接口的控制寄存器有两个——特殊功能寄存器SCON和PCON,用以设置串行端口的工作方式、接收/发送的运行状态、接收/发送数据的特征、数据传输率的大小,以及作为运行的中断标志等,其格式如下:


① 串行口控制寄存器SCON。SCON的字节地址是98H,位地址(由低位到高位)分别是98H一9FH。SCON的格式如下:




(, 下载次数: 1)

回复

使用道具 举报

1848

TA的帖子

0

TA的资源

禁止发言

 楼主| 发表于 2008-9-16 10:29 | 显示全部楼层

keil c语法参考

很多人对keilc不是很了解 我收集了一些资料,提供如下:
Keil C51 vs 标准C
深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一。因为大多数扩展功能都是直接针对8051系列CPU硬件的。大致有以下8类:
l 8051存储类型及存储区域
2 存储模式
3 存储器类型声明
4 变量类型声明
5 位变量与位寻址
6 特殊功能寄存器(SFR)
7 C51指针
8 函数属性
具体说明如下(8031为缺省CPU)。
1. 第一节 Keil C51扩展关键字
C51 V4.0版本有以下扩展关键字(共19个):
_at_ idata sfr16 alien interrupt small
bdata large _task_ Code bit pdata
using reentrant xdata compact sbit data sfr
2. 第二节 内存区域(Memory Areas):
1. 1. Pragram Area:
由Code说明可有多达64kBytes的程序存储器
2. 2. Internal Data Memory:
内部数据存储器可用以下关键字说明:
data:直接寻址区,为内部RAM的低128字节 00H~7FH
idata:间接寻址区,包括整个内部RAM区 00H~FFH
bdata:可位寻址区,  20H~2FH
3. 3. External Data Memory
外部RAM视使用情况可由以下关键字标识:
xdata:可指定多达64KB的外部直接寻址区,地址范围0000H~0FFFFH
pdata:能访问1页(25bBytes)的外部RAM,主要用于紧凑模式(Compact Model)。
4. 4. Speciac Function Register Memory
8051提供128Bytes的SFR寻址区,这区域可位寻址、字节寻址或字寻址,用以控制定时器、计数器、串口、I/O及其它部件,可由以下几种关键字说明:
sfr:字节寻址 比如 sfr P0=0x80;为PO口地址为80H,“=”后H~FFH之间的常数。
sfr16:字寻址,如sfr16 T2=0xcc;指定Timer2口地址T2L=0xcc T2H=0xCD
sbit:位寻址,如sbit EA="0xAF";指定第0xAF位为EA,即中断允许
还可以有如下定义方法:
sbit 0V=PSW^2;(定义0V为PSW的第2位)
sbit 0V=0XDO^2;(同上)
或bit 0V-=0xD2(同上)。

存储类型与存储区关系
     data > 可寻址片内ram
     bdata > 可位寻址的片内ram
     idata > 可寻址片内ram,允许访问全部内部ram
     pdata > 分页寻址片外ram (MOVX @R0) (256 BYTE/页)
     xdata > 可寻址片外ram (64k 地址范围)
     code > 程序存储区 (64k 地址范围),对应MOVC @DPTR
     二、指针类型和存储区的关系对变量进行声明时可以指定变量的存储类型如:
     uchar data x和data uchar x相等价都是在内ram区分配一个字节的变量。同样对于指针变量的声明,因涉及到指针变量本身的存储位置和指针所指向的存储区位置不同而进行相应的存储区类型关键字的使用如:uchar xdata * data pstr是指在内ram区分配一个指针变量("*"号后的data关键字的作用),而且这个指针本身指向xdata区("*"前xdata关键字的作用),可能初学C51时有点不好懂也不好记。没关系,我们马上就可以看到对应“*”前后不同的关键字的使用在编译时出现什么情况。......
     uchar xdata tmp[10]; //在外ram区开辟10个字节的内存空间,地址是外ram的0x0000-0x0009
     ......第1种情况:uchar data * data pstr;
     pstr="tmp";首先要提醒大家这样的代码是有bug的, 他不能通过这种方式正确的访问到tmp空间。 为什么?我们把编译后看到下面的汇编代码:MOV 0x08,#tmp(0x00) ;0x08是指针pstr的存储地址看到了吗!本来访问外ram需要2 byte来寻址64k空间,但因为使用data关键字(在"*"号前的那个),所以按KeilC编译环境来说就把他编译成指向内ram的指针变量了,这也是初学C51的朋友们不理解各个存储类型的关键字定义而造成的bug。特别是当工程中的默认的存储区类为large时,又把tmp[10] 声明为uchar tmp[10] 时,这样的bug是很隐秘的不容易被发现。第2种情况:uchar xdata * data pstr;
     pstr = tmp;这种情况是没问题的,这样的使用方法是指在内ram分配一个指针变量("*"号后的data关键字的作用),而且这个指针本身指向xdata区("*"前xdata关键字的作用)。编译后的汇编代码如下。MOV 0x08,#tmp(0x00) ;0x08和0x09是在内ram区分配的pstr指针变量地址空间
     MOV 0x09,#tmp(0x00)这种情况应该是在这里所有介绍各种情况中效率最高的访问外ram的方法了,请大家记住他。第3种情况:uchar xdata * xdata pstr;
     pstr="tmp";这中情况也是对的,但效率不如第2种情况。编译后的汇编代码如下。MOV DPTR, #0x000A ;0x000A,0x000B是在外ram区分配的pstr指针变量地址空间
     MOV A, #tmp(0x00)
     MOV @DPTR, A
     INC DPTR
     MOV A, #tmp(0x00)
     MOVX @DPTR, A这种方式一般用在内ram资源相对紧张而且对效率要求不高的项目中。第4种情况:uchar data * xdata pstr;
     pstr="tmp";如果详细看了第1种情况的读者发现这种写法和第1种很相似,是的,同第1 种情况一样这样也是有bug的,但是这次是把pstr分配到了外ram区了。编译后的汇编代码如下。MOV DPTR, #0x000A ;0x000A是在外ram区分配的pstr指针变量的地址空间
     MOV A, #tmp(0x00)
     MOVX @DPTR, A第5种情况:uchar * data pstr;
     pstr="tmp";大家注意到"*"前的关键字声明没有了,是的这样会发生什么事呢?下面这么写呢!对了用齐豫的一首老歌名来说就是 “请跟我来”,请跟我来看看编译后的汇编代码,有人问这不是在讲C51吗? 为什么还要给我们看汇编代码。C51要想用好就要尽可能提升C51
     编译后的效率,看看编译后的汇编会帮助大家尽快成为生产高效C51代码的高手的。还是看代码吧!MOV 0x08, #0X01 ;0x08-0x0A是在内ram区分配的pstr指针变量的地址空间
     MOV 0x09, #tmp(0x00)
     MOV 0x0A, #tmp(0x00)注意:这是新介绍给大家的,大家会疑问为什么在前面的几种情况的pstr指针变量都用2 byte空间而到这里就用3 byte空间了呢?这是KeilC的一个系统内部处理,在KeilC中一个指针变量最多占用 3 byte空间,对于没有声明指针指向存储空间类型的指针,系统编译代码时都强制加载一个字节的指针类型分辩值。具体的对应关系可以参考KeilC的help中C51 User's Guide。第6种情况:uchar * pstr;
     pstr="tmp";这是最直接最简单的指针变量声明,但他的效率也最低。还是那句话,大家一起说好吗!编译后的汇编代码如下。MOV DPTR, #0x000A ;0x000A-0x000C是在外ram区分配的pstr指针变量地址空间
     MOV A, #0x01
     MOV @DPTR, A
     INC DPTR
     MOV DPTR, #0x000A
     MOV A, #tmp(0x00)
     MOV @DPTR, A
     INC DPTR
     MOV A, #tmp(0x00)
     MOVX @DPTR, A这种情况很类似第5种和第3种情况的组合,既把pstr分配在外ram空间了又增加了指针类型的分辨值。 小结一下:大家看到了以上的6种情况,其中效率最高的是第2种情况,既可以正确访问ram区又节约了代码,效率最差的是第 6种,但不是说大家只使用第2种方式就可以了,还要因情况而定,一般说来应用51系列的系统架构的内部ram资源都很紧张,最好大家在定义函数内部或程序段内部的局部变量使用内ram,而尽量不要把全局变量声明为内ram区中。所以对于全局指针变量我建议使用第 3 种情况,而对于局部的指针变量使用第2种
本征库函数(intrinsic routines)和非本征证库函数
C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统。
C51提供的本征函数是指编译时直接将固定的代码插入当前行,而不是用ACALL和LCALL语句来实现,这样就大大提供了函数访问的效率,而非本征函数则必须由ACALL及LCALL调用。
C51的本征库函数只有9个,数目虽少,但都非常有用,列如下:
_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回
_iror_,_irol_:将int型变量循环向左(右)移动指定位数后返回
_lrol_,_lror_:将long型变量循环向左(右)移动指定位数后返回
_nop_: 相当于插入NOP
_testbit_: 相当于JBC bitvar测试该位变量并跳转同时清除。
_chkfloat_: 测试并返回源点数状态。
使用时,必须包含#inclucle 一行。
如不说明,下面谈到的库函数均指非本征库函数。
第二节 几类重要库函数
1. 专用寄存器include文件
例如8031、8051均为REG51.h其中包括了所有8051的SFR及其位定义,一般系统都必须包括本文件。
2. 绝对地址include文件absacc.h
该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。
3. 动态内存分配函数,位于stdlib.h中

4. 缓冲区处理函数位于“string.h”中
其中包括拷贝比较移动等函数如:
memccpy memchr memcmp memcpy memmove memset
这样很方便地对缓冲区进行处理。
5. 输入输出流函数,位于“stdio.h”中
流函数通8051的串口或用户定义的I/O口读写数据,缺省为8051串口,如要修改,比如改为LCD显示,可修改lib目录中的getkey.c及putchar.c源文件,然后在库中替换它们即可。


Keil C51库函数原型列表
1. CTYPE.H
bit isalnum(char c);
bit isalpha(char c);
bit iscntrl(char c);
bit isdigit(char c);
bit isgraph(char c);
bit islower(char c);
bit isprint(char c);
bit ispunct(char c);
bit isspace(char c);
bit isupper(char c);
bit isxdigit(char c);
bit toascii(char c);
bit toint(char c);
char tolower(char c);
char __tolower(char c);
char toupper(char c);
char __toupper(char c);
2. INTRINS.H
unsigned char _crol_(unsigned char c,unsigned char b);
unsigned char _cror_(unsigned char c,unsigned char b);
unsigned char _chkfloat_(float ual);
unsigned int _irol_(unsigned int i,unsigned char b);
unsigned int _iror_(unsigned int i,unsigned char b);
unsigned long _irol_(unsigned long l,unsigned char b);
unsigned long _iror_(unsigned long L,unsigned char b);
void _nop_(void);
bit _testbit_(bit b);
3. STDIO.H
char getchar(void);
char _getkey(void);
char *gets(char * string,int len);
int printf(const char * fmtstr[,argument]…);
char putchar(char c);
int puts (const char * string);
int scanf(const char * fmtstr.[,argument]…);
int sprintf(char * buffer,const char *fmtstr[;argument]);
int sscanf(char *buffer,const char * fmtstr[,argument]);
char ungetchar(char c);
void vprintf (const char *fmtstr,char * argptr);
void vsprintf(char *buffer,const char * fmtstr,char * argptr);
4. STDLIB.H
float atof(void * string);
int atoi(void * string);
long atol(void * string);
void * calloc(unsigned int num,unsigned int len);
void free(void xdata *p);
void init_mempool(void *data *p,unsigned int size);
void *malloc (unsigned int size);
int rand(void);
void *realloc (void xdata *p,unsigned int size);
void srand (int seed);
5. STRING.H
void *memccpy (void *dest,void *src,char c,int len);
void *memchr (void *buf,char c,int len);
char memcmp(void *buf1,void *buf2,int len);
void *memcopy (void *dest,void *SRC,int len);
void *memmove (void *dest,void *src,int len);
void *memset (void *buf,char c,int len);
char *strcat (char *dest,char *src);
char *strchr (const char *string,char c);
char strcmp (char *string1,char *string2);
char *strcpy (char *dest,char *src);
int strcspn(char *src,char * set);
int strlen (char *src);
char *strncat (char 8dest,char *src,int len);
char strncmp(char *string1,char *string2,int len);
char strncpy (char *dest,char *src,int len);
char *strpbrk (char *string,char *set);
int strpos (const char *string,char c);
char *strrchr (const char *string,char c);
char *strrpbrk (char *string,char *set);
int strrpos (const char *string,char c);
int strspn(char *string,char *set);



#############################################################################
#############################################################################




老练最新的“单片机复位电路分析专题”

http://bbs.eeworld.com.cn/thread-66492-1-1.html





回复

使用道具 举报

9

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2008-9-18 09:26 | 显示全部楼层
想学习一下

回复

使用道具 举报

2万

TA的帖子

74

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2008-9-18 09:41 | 显示全部楼层
原帖由 317179403 于 2008-9-18 09:26 发表
想学习一下


有什么问题,317179403 可以随时发问哦,专家会定期给与解答。

回复

使用道具 举报

491

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

发表于 2008-9-18 15:46 | 显示全部楼层
期待这样的活动已经很久了,感谢eeworld

回复

使用道具 举报

7

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2008-9-18 15:48 | 显示全部楼层
要是结合proteus软件讲就好了

回复

使用道具 举报

491

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

发表于 2008-9-18 16:07 | 显示全部楼层
我会一直关注的

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2008-9-18 16:18 | 显示全部楼层

要是能有个ARM的就好了。

要是能有个ARM的就好了。ARM貌似很复杂,没有条件搞

=========================练祥华======================================
arm下面有精力的话 一定去做得 因为暂时先从51做起吧 面临的对象也多,何况我最近也比较忙点。

arm将配合相关的开发板进行讲座,这样比较有针对性。等目前单片机的项目做到一定程度的时候,将开始的方式进行。

arm下面将开展2个课题:
1、是atmel的arm9 工业级芯片 linux系统
2、是s3c2410 商业级芯片 linux系统 wince系统 ucos系统,(后面2个我现在还没学会,到时候学会了就教大家)

活动将在11月初开展

[ 本帖最后由 njlianjian 于 2008-9-20 13:15 编辑 ]

回复

使用道具 举报

491

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

发表于 2008-9-18 16:38 | 显示全部楼层
void int_0() interrupt 0 using 0
{
    Led1=1;             //关闭D1
    LED0=0;            //点亮D0
}

可不可以把 interrupt 0 using 0 的完整语法和用法详细讲解一下,谢谢

这个就是c51中的通用的语法 用法也请你参考一下相关资料 我基本都是套用的 但是并不觉得这个东西的语法和用法有问题啊?您有何问题 还请多多交流

我是菜鸟,还请多多指教

[ 本帖最后由 springvirus 于 2008-9-19 09:59 编辑 ]

回复

使用道具 举报

2万

TA的帖子

74

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2008-9-18 23:35 | 显示全部楼层
原帖由 sungodmg 于 2008-9-18 16:18 发表
要是能有个ARM的就好了。ARM貌似很复杂,没有条件搞


ARM也在考虑中哦,我们会一步步把活动推进,敬请期待。

回复

使用道具 举报

2万

TA的帖子

74

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2008-9-18 23:37 | 显示全部楼层
原帖由 springvirus 于 2008-9-18 15:46 发表
期待这样的活动已经很久了,感谢eeworld


也谢谢你对EEWORLD的关注,希望EEWORLD与你一同进步!

回复

使用道具 举报

2万

TA的帖子

74

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2008-9-18 23:38 | 显示全部楼层
原帖由 marxgqy 于 2008-9-18 15:48 发表
要是结合proteus软件讲就好了


这个建议可以提请给讲座的专家,看看安排里是否可以插入进去。

回复

使用道具 举报

1848

TA的帖子

0

TA的资源

禁止发言

 楼主| 发表于 2008-9-18 23:58 | 显示全部楼层
原帖由 marxgqy 于 2008-9-18 15:48 发表
要是结合proteus软件讲就好了

对不起 这个软件我没有 您有麻烦您发一个给我可以么 我可以结合这个软件来做我的讲座 谢谢

回复

使用道具 举报

103

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2008-9-19 10:16 | 显示全部楼层

哈哈不错呀,我从今天开始跟着听课~

很好很好呀,适合我这样的初学者,谢谢小51,soso,及各位管理参与人员~~
还没有仔细看,我一边看一边问哈~:P

回复

使用道具 举报

2万

TA的帖子

74

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2008-9-19 15:14 | 显示全部楼层

回复

使用道具 举报

491

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

发表于 2008-9-19 15:30 | 显示全部楼层
我查到的资料上说
中断服务函数的语法如下:
返回值   函数名 {【参数】} 【模式】【重入】 interrupt  n  【using  n  】
interrupt  后接一个0~31的整数,不允许使用表达式。

interrupt  n  和  using  n  其中的 n 到底是什么数值啊,请指教


======================练祥华回答如下==================
interrupt  n  和  using  m 中的n是中断号,
n=0,表示外部中断0 中断地址8n+3=0x03
n=1 表示定时器中断0 中断地址8n+3=0x0b
m表示寄存器组 取值范围0-3
一共4个寄存器工作组

[ 本帖最后由 njlianjian 于 2008-9-19 19:49 编辑 ]

回复

使用道具 举报

103

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2008-9-19 17:14 | 显示全部楼层

我也要举手问问题~~

[interrupt n] 中的n书上叫做“中断号”,编译器从8n+3处产生中断向量,不知道是不是51类型的单片机都是这样计算的?
于是就有了这样的对应关系:
中断号n

中断源

中断向量8n+3

0

外部中断0

0003H

1

定时器0

000BH

2

外部中断1

0013H

3

定时器1

001BH

4

串行口

0023H

中断向量,我的理解是,它是一个地址,在产生中断时,告诉单片机去哪里找中断程序并执行。不知道对不对哈。
[using n] 中的n,我也不是很明白~
“8051系列单片机可以在片内RAM中使用4个不同的工作寄存器组,每个寄存器组中包含8个工作寄存器(R0~R7)。”这个n就是用来选择寄存器组的。
我不明白的是:
1、在什么情况下要使用不同的工作寄存器组?也就是说,这样设计有什么用呀?
2、好像通用寄存器的存取速度很快,为什么呢?
3、这4个工作寄存器组,在芯片内部是很么样子的呢?

谢谢呀~:P

=======================练祥华回答如下===========================
中断向量,我的理解是,它是一个地址,在产生中断时,告诉单片机去哪里找中断程序并执行。不知道对不对哈。
回答:这样解释是对的。
========
[using n] 中的n,我也不是很明白~  
回答:这里的n是个变量,取值范围0-3,表示中断使用的通用寄存器哪一个工作组。
1、在什么情况下要使用不同的工作寄存器组?也就是说,这样设计有什么用呀?
回答:在中断里面可以进行寄存器的相互切换,用来保存主程序中或其他中断中使用的值
========
2、好像通用寄存器的存取速度很快,为什么呢?
回答:这个是单片机设计的时候决定的 至于为什么这样做,请给单片机设计的人的联系方式 我打个电话问一下再告诉你
========
3、这4个工作寄存器组,在芯片内部是很么样子的呢?
回答:芯片我没打开看过 据说要密码,我说了芝麻开门,结果芯片还是那样,所以没看成,你要是看到了请告诉我一下。

[ 本帖最后由 njlianjian 于 2008-9-19 19:51 编辑 ]

回复

使用道具 举报

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

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-29 18:45 , Processed in 0.571236 second(s), 18 queries , Gzip On, MemCache On.

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