EDN首页   博客首页

最新日志

发表于:2009/7/3 15:32:54
标签:无标签

1

2407的定时器测试

1 基于2407的定时器测试程序
/*  往WDKEY连续写0x5555和0xAAAA即可禁止2407内置的看门狗 */
void KickDog()                                    /*  踢除看门狗 */
{
        WDKEY = 0x5555;
        WDKEY = 0xAAAA;
}
void EVAInit()
{
        EVAIMRA = 0x0080;                        /*  定时器1周期中断使能 */
        EVAIFRA = 0xFFFF;                        /*  清除中断标志 */
        GPTCONA = 0x0000;
        T1PR = 0x1f40;                        /*  定时器1的初值,定时16us */
        T1CNT = 0x0000;             /*  定时器的计数初值 */
        T1CON = 0x164C;                            /*  连续增计数模式,128分频,16M/128=0.125M*/       
}

void DSPInit()
{   
        asm(" SETC        INTM ");        /* 关闭总中断 */
        asm(" CLRC  SXM  ");        /* 禁止符号位扩展 */
        asm(" CLRC  CNF  ");    /* B0块映射为 on-chip SDRAM*/
        asm(" CLRC  OVM  ");    /* 累加器结果正常溢出*/
        SCSR1 = 0x06D4;    /* 打开ADC,EVA,CAN和SCI的时钟,系统时钟CLKOUT=16M */
        WDCR = 0x006F;                        /* 禁止看门狗,看门狗时钟64分频 */
        KickDog();                            /* 剔除看门狗 */
    IFR = 0xFFFF;                        /* 清除中断标志 */             
    IMR = 0x0003;                    /* 打开中断级1,2 */
}

main()                 
{        
      DSPInit();
      EVAInit();                                /* 定时器初始化*/
      MCRC = MCRC&0x0000;                        
          asm(" NOP ");
      PFDATDIR = PFDATDIR|0x2000;
          asm(" NOP ");
          PFDATDIR = PFDATDIR&0xFFDF;   
           
      asm(" CLRC INTM ");
          while(1);
}

void c_int2()
{
        if(PIVR!=0x27)
        {       
                asm(" CLRC INTM ");
                return;
        }
               
        //T1CNT = 0;                /*删掉这一句可以使定时器准确*/
       
        PFDATDIR="PFDATDIR"^0x0020; /******* 发送指示灯极性反转 ***********/
        EVAIFRA = 0xFFFF;
    asm(" CLRC INTM ");
}   

2 测试结果
以上程序是使DSP每16us进入一次中断,然后使LED亮灭交替,故灯的闪烁周期为2*16us=32us。定时器不能采用太高的频率,否则会使示波器观察到的波形失真严重。
用示波器进行测量,可以发现,如果在DSP程序进入中断后对T1CNT清零,会使LED处的方波频率变为22.99kHz,即周期为43.497us;而取消对T1CNT清零,会使LED处的方波频率变为31.01kHz~31.25kHz,即31.25us~32us,很接近预计值。
对两次测量周期进行对比,可以看到相差为43.497us-31.25us=12.247us。折合成DSP的时钟数,为12.247us*16MHz=192。
3 误差分析
在汇编窗口中观察定进器中断程序,可以看到如下代码:
c_int2
CALL        I$$SAVE,*
SAR        AR1,*
LAR        AR0,#1h
LAR        AR0,*0+
LDP        #e0h
LACC        1eh
SUB        #27h
BCND        L18,EQ
CLRC        INTM
B                EPIO_8,*
L18:
LACL        #0h
LDP        #e8h
SACL        1h

……
……

I$$SAVE:
MAR        *,AR1
ADRK        #1h
SST                #1,*+
SST                #0,*+
SACH        *+,0
SACL        *+,0
CLRC        OVM
SPM
SPH        *+
SPL                *+
SAR        AR0, *+
SAR        AR2, *+
SAR        AR3, *+
SAR        AR4, *+
SAR        AR5, *+
SAR        AR6, *+
SAR        AR7, *+
POPD        *
LACC        *,0
RPT        #6h
POPD        *+
BACC
从以上的汇编代码,可以大致看到那多出的192个周期花在这些自动生成的代码里面去了。
3 结论
51单片机的定时器开启后,每次进入中断都要对计数值进行重载。而TMS320LF2407的定时器具有自动重载功能,不需要程序对它清零。

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(25)
发表于:2009/7/3 15:25:08
标签:无标签

2

新版时钟(顶!!!顶!!!)带遥控器的

最近宝宝总会怕到桌子上按时钟的按键,为了不让她再乱调时间,讲数码管电子钟升级,要遥控,用遥控器来控制,哈哈。

做过时钟吗?答案是肯定的

做过带键盘的时钟吗?答案也是肯定的

有兴趣的同志可以和我交流哦点击开大图

系统分类: 资源共享   |    用户分类:    |    来源: 原创

评论(0) | 阅读(137)
发表于:2009/7/2 16:44:27
标签:无标签

0

51单片机学习板 开发板 ADC+温度+万年历+数字存储+红外 送遥控器

标准版】优惠推广活动进行中!原价178元/套,2009.7.1-2009.7.31期间优惠价:158元/套!在7.1日-7.31日买学习板送遥控器。数量有限,预购从速!

新版 51单片机学习板/开发板/实验板 含优质带背光LCM1602液晶屏/时钟万年历/AD转换/断电保存数据/数字温度计/ 一体化红外遥控解码/LCM12864液晶接口,仿真(需选配仿真芯片)+烧录+实验+开发于一体,功能强大,扩展性极强,功能发挥淋漓尽致!100%单片机I/O接口扩展,充分发挥你的想象力!!

 

可选购LCM12864液晶屏学习汉字及图形驱动程序编写!(全新优质汉字/图形点阵蓝屏,带背光,128*64点阵,通用标准接口) 原价85元,现价每片68元.

更可以配合4*4键盘设计自己的汉字输入法程序和图形界面游戏程序!

 

附带光盘里成熟源代码可以直接用在你的项目中!

 

集仿真(需选配仿真芯片),烧录,实验,开发于一体 功能强劲 为单片机爱好者朋友们精心打造!强烈推荐!

 

ZC-51学习板从推出以来,受到很多单片机爱好者的关注和支持,一些网友还提出了自己宝贵的意见和建议!现推出第三版ZC-51学习板!功能更强,布局更合理,更美观,性价比更高!

布局优势:

1.按键4*4的16个排于右边,操作更方便。

2.USB口,备用电源座,DB9串口座,ISP下载座,统一排于左边。如我们的笔记本电脑接线口排列方便。

3.显示屏接口排在最上面,不用影响或遮盖到下面的元件,调整亮度方便,更美观。

4.扩展口用配有跳线块,避免无跳线块在试验时造成干扰,更合理。

  新推出学习板的新功能和特点

1128*64图形汉字点阵液晶屏接口,可以配合4*4键盘设计自己的汉字输入法程序!

AD转换芯片,模数转换对于学习单片机很重要!很多同价位的学习板上都没有,大家可以对比一下!

3支持仿真芯片(需选配)可以单步、断点、全速调试运行程序!

100%释放单片机I/O,可以随意引出做扩展实验,不浪费!

支持Atmel 89系列51单片机和AVR AT90S8515,Atmega8515系列单片机,更具信价比!

八位流水灯

八位数码管显示

8   标准51 ISP下载接口插座,下载更方便!

9  一体化红外接收头,做红外遥控接收实验!

10 一线制数字温度传感器,做温度计实验!

11 零力插拔活动自锁座,安装单片机方便,更灵活!

12   PCB布局更合理、美观!

13  电源指示灯,是否上电更直观!

14   增加4个白色塑料支撑座,防止电路板下面短路!学习、开发更舒适!

15 更多的资源配置请看下面的资源配置介绍!

 

ZC-51【标准版】装箱清单:

1  测试好的ZC-51 V3.0单片机学习板  一套

2  优质 LCM1602字符型液晶屏    一片

3  STC89C52单片机(具有ISP串口下载功能、8K程序空间)    1片

4  DS18B20 数字温度芯片(已焊在板子上) 1只

5  HX1838一体化红外接收头(已焊在板子上) 1只

6  串口通讯线(通讯用)  1条

7  USB接口线/连接线(给学习板供电) 1条

8  万用电路板 1块 赠品

9  配套资料光盘 1套

10  白色塑料底座 4只

 

选配件(根据个人需要购买,非必须购买!):

SST89E516仿真头芯片(具有64K程序空间,可单步、连续、设置断点仿真调试程序) 成本价15元一片

2USB转串口线,含驱动程序光盘(电脑没有串口的用户需选配,比如笔记本电脑用户)成本价15元一条

3AT89S52单片机(支持ISP下载,需配下载器实现下载)  每片7元

隔离型STK200 51 AVR ISP 下载线(利用电脑并口下载烧录S51/S52/AVR单片机)  15元/套

LCM12864优质图形点阵液晶屏(全新蓝屏,带背光,128*64点阵,通用标准接口,可显示汉字、图片) 68元/块 (原价85元)

步进电机和DA转换模块(做步进电机和DA转换实验) 59元/套 (原价65元/套)

7USBASP/USBISP 极速下载器(用USB口对S51/S52/AVR单片机下载烧录程序,速度极快!)25元/套 (原价30元)

8红外遥控器(单片机学习板配套用)4元/套(原价8元)

  详细情况欢迎大家访问智成单片机淘宝店铺:http://shop34218752.taobao.com/

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(53)
发表于:2009/7/2 14:04:02
标签:无标签

0

基于AT89C2051的红外线接收控制器的制作

红外线接收控制器的制作
  在生活中,我们常用到红外线控制各类电器,如彩电、空调、电风扇等。为我们带来较多的方便。但有时我们仍感到不方便。如看完电视后,用遥控器只能关掉电视主电源,电视仍处于待机状态。使用者还得走到电视跟前.按下电小
视电源开关方能放心。若想看电视。还得动身开电视,显得很麻烦。尤其是冬天躺在床上看电视,上上下下,深感不便。本文以利用红外遥控器来遥控风扇的制作方法为例(可任选一只红外线遥控器.能调速,软件稍作改变,可增加
定时功能等),来介绍红外线接收控制器的制作方法,如果制作电视交流电源的开、关控制器,可与电视共用一只遥控器,制作也较简单些。
    制作思路
  红外遥控发射器是利用红外线作载体传送信息的,发射周期不等的经过调制后串行码.该串行码一般由引导码、用户识别码、操作码组成。经红外接收头解码后得到一串周期不等的矩形波。如示意图1。
    不同型号的遥控发射器的波形宽度不同。即周期T1、T2……不同.在不知手头遥控发射器的波形周期的情况下.首先要制作一个检测红外线周期的工具。根据测得的周期规律来制作红外线接收控制器。
    制作方法
    检测红外周期的器件制作.。
    当红外接收头没有接收到发射器发送来的红外线.其输出端输出高电平(约+5V)。当接收到红外线,输出端电平变低.送到单片机AT89C2051的外部中断1口即INT1,使其发生中断而进入中断服务:启动定时器1并开M-I-数。相当于在图1的A点.1个周期后即C点。单片机第二次中断。关定时器1.记下周期T1(实际上只记下TH1的数值。 TL1的值可以丢弃)。然后清TH1、TL1,再启动定时器1重新计数,第二个周期完后,同样会引起单片机发生中断.再记
下周期T2'…一,如此记下40-50个周期(一般红外编码为4字节.即32BIT.之前还有引导码。又因接收到的红外数据不一定是从引导码开始,要分析一次完整的串行码,应尽可能多记下红外矩形波周期数)。接收完后,通过按轻触开关将各记下的各周期的THl在数码管显示出来以作分析(每按一次轻触开关,显示下一个周期数)。
    编程方法
    在main()中开中断。启动定时器1.即EA=I;EX1=1:IT1=1;TRI=I:
    在外部中断1的服务程序中编写如下语名:#defineCNT50//预测50个红外线周期 DATA Byte value_h[CNT]://记录周期的变量(数组) DATA Byte count="0";//接收到的周期数 void int1(void)interrupt 2{
    if(TH1==TL1&&TL1==0)//判断是否是第一次接收到红外数据
  {
    TR1=1:
    }elseI
    TRl="0";value_h[count]:THl;
    THl="TLl"=0;TRI=I:count++;
    if(count==CNT)
    {
    EXl="0":count=u;
  l} l
  假设接收到的TH的数值为:30,50.04,08,08,08,04,04,04,04,04,08,08,08,04,04,04,04。08,04,04,08,04,04,04,04,04,04,08,08,04.08,08,08,08,3f,50....
    稍作分析可知。表示高低电平的有效数为:04,08。若将04定作低电平.08定作高电平.舍弃其他数据,得到4字节数据即:01110000。01110000,10010000。01101111。转为十六进制后得:70h,70h,90h,6fh,至此得到遥控发射器刚才按下的键值码.用同样的方法可以测得其他键键值码。假设有:70h,70h,0x90,0x6f。//0键70h,70h.0x00,0xff。//1键70h,70h.0xd0,0x2f//power键
    根据以上数据分析得.每键码为4字节.前2字节固定不变,为用户识别码。后2字节均不同,是操作码。将遥控器上的各键键值码测出后,根据这些数据可以根据制作需要进行编程了。因键值码为4字节太长。不利于编程,需要将各键键值转为相对应的1字节的数据,如:70h,70h,0x90,0x6f,对应于O,70h,70h,0x00,0xff对应于1..…·
  转换方法:
  建立一个数组,将上述测得的各键码按顺序放入数组中(去掉用户识别码)
code Byte arr[][2]=
{
0x90,0x6f.//0,尽可能按键0、键1..·…的先后顺序放,以符合习惯
0x00,0xff,//1
……
Oxl0,0xef.//9
0xd0, Ox2f //power 13
};
   在接收红外线的外部中断1函数中编写如下的键码转换语句:
DATA Byte arrtmp[4];
DATA Byte Keytmp;//转换后的键值寄存变量
DATA Byte Keyval="NOKEY";
bit KeyOk;//键值转换完成与否的标志
bit d_Ok;//接收到一个完整的键码标志
void Ex_int(void)interrupt 2
{
    Byte i;
    Byte(*p)[2];……  
if(d_Ok)//若接收到完整的键码
{
  d_Ok=0://清除
  if(arrtmp[0]==0x70&&arrtmp[1]
    ==0x70){//键码转换
    for(p=arr,bO:i<14:i++。p++)
    {if(arrtmp[2]==*(*p+0)&&arrtmp[3]
    ==*(*p+1))
    { Keytmp="i":KeyOk=1;//键值
    转换成功标志
    break;
    }else{Keytmp=NOKEY;l//未
    接收到完整的键值
    }
  }eIse{Keytmp=NOKEY;}
  } l
    经过转换后的Keytmp为0、1、2……的整数.然后再编写主函数、调速函数(参源程序)。来进行电风扇调速。
    有关电路的一些解释:单片机U1(AT89C2051)P37脚输出高低电平通过R13控制光耦可控硅MOC3041(参数可在《电子制作》网站查找)通断.通过控制其通断时间比来达到电风扇调速。

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(56)
发表于:2009/6/26 16:30:43
标签:无标签

0

单片机指令系统分析

单片机指令系统分析(1)51单片机的寻址方式

 

        学习汇编程序设计,要先了解CPU的各种寻址法,才能有效的掌握各个命令的用途,寻址法是命令运算码找操作数的方法。在我们学习的8051单片机中,有6种寻址方法,下面我们将逐一进行分析。


立即寻址


在这种寻址方式中,指令多是双字节的,一般第一个字节是操作码,第二个字节是操作数。该操作数直接参与操作,所以又称立即数,有“#”号表示。立即数就是存放在程序存储器中的常数,换句话说就是操作数(立即数)是包含在指令字节中的。


例如:
MOV  A,#3AH
这条指令的指令代码为74H、3AH,是双字节指令,这条指令的功能是把立即数3AH送入累加器A中。
MOV  DPTR,#8200H
在前面学单片机的专用寄存器时,我们已学过,DPTR是一个16位的寄存器,它由DPH及DPL两个8位的寄存器组成。这条指令的意思就是把立即数的高8位(即82H)送入DPH寄存器,把立即数的低8位(即00H)送入DPL寄存器。
这里也特别说明一下:在80C51单片机的指令系统中,仅有一条指令的操作数是16位的立即数,其功能是向地址指针DPTR传送16位的地址,即把立即数的高8位送入DPH,低8位送入DPL。


直接寻址


直接寻址方式是指在指令中操作数直接以单元地址的形式给出,也就是在这种寻址方式中,操作数项给出的是参加运算的操作数的地址,而不是操作数。
例如:MOV  A,30H 
这条指令中操作数就在30H单元中,也就是30H是操作数的地址,并非操作数。


在80C51单片机中,直接地址只能用来表示特殊功能寄存器、内部数据存储器以及位地址空间,具体的说就是:
1、内部数据存储器RAM低128单元。在指令中是以直接单元地址形式给出。
我们知道低128单元的地址是00H-7FH。在指令中直接以单元地址形式给出这句话的意思就是这0-127共128位的任何一位,例如0位是以00H这个单元地址形式给出、1位就是以01H单元地址给出、127位就是以7FH形式给出。
2、位寻址区。20H-2FH地址单元。
3、特殊功能寄存器。专用寄存器除以单元地址形式给出外,还可以以寄存器符号形式给出。例如下面我们分析的一条指令 MOV  IE,#85H 前面的学习我们已知道,中断允许寄存器IE的地址是80H,那么也就是这条指令可以以MOV  IE,#85H 的形式表述,也可以MOV  80H,#85H的形式表述。


关于数据存储器RAM的内部情况,请查看我们课程的第十二课。


直接寻址是唯一能访问特殊功能寄存器的寻址方式!


大家来分析下面几条指令:
MOV  65H,A       ;将A的内容送入内部RAM的65H单元地址中
MOV  A,direct    ;将直接地址单元的内容送入A中
MOV  direct,direct;将直接地址单元的内容送直接地址单元
MOV  IE,#85H      ;将立即数85H送入中断允许寄存器IE


前面我们已学过,数据前面加了“#”的,表示后面的数是立即数(如#85H,就表示85H就是一个立即数),数据前面没有加“#”号的,就表示后面的是一个地址地址(如,MOV 65H,A这条指令的65H就是一个单元地址)。


寄存器寻址


寄存器寻址的寻址范围是:
1、4个工作寄存器组共有32个通用寄存器,但在指令中只能使用当前寄存器组(工作寄存器组的选择在前面专用寄存器的学习中,我们已知道,是由程序状态字PSW中的RS1和RS0来确定的),因此在使用前常需要通过对PSW中的RS1、RS0位的状态设置,来进行对当前工作寄存器组的选择。
2、部份专用寄存器。例如,累加器A、通用寄存器B、地址寄存器DPTR和进位位CY。


寄存器寻址方式是指操作数在寄存器中,因此指定了寄存器名称就能得到操作数。
例如:MOV A,R0
这条指令的意思是把寄存器R0的内容传送到累加器A中,操作数就在R0中。
INC R3
这条指令的意思是把寄存器R3中的内容加1


从前面的学习中我产应可以理解到,其实寄存器寻址方式就是对由PSW程序状态字确定的工作寄存器组的R0-R7进行读/写操作。


寄存器间接寻址


寄存间接寻址方式是指寄存器中存放的是操作数的地址,即操作数是通过寄存器间接得到的,因此称为寄存器间接寻址。


MCS-51单片机规定工作寄存器的R0、R1做为间接寻址寄存器。用于寻址内部或外部数据存储器的256个单元。为什么会是256个单元呢?我们知道,R0或者R1都是一个8位的寄存器,所以它的寻址空间就是2的八次方=256。
例:MOV  R0,#30H  ;将值30H加载到R0中
    MOV  A,@R0    ;把内部RAM地址30H内的值放到累加器A中
    MOVX A,@R0    ;把外部RAM地址30H内的值放到累加器A中


大家想想,如果用DPTR做为间址寄存器,那么它的寻址范围是多少呢?DPTR是一个16位的寄存器,所以它的寻址范围就是2的十六次方=65536=64K。因用DPTR做为间址寄存器的寻址空间是64K,所以访问片外数据存储器时,我们通常就用DPTR做为间址寄存器。
例:MOV   DPTR,#1234H  ;将DPTR值设为1234H(16位)
    MOVX  A,@DPTR      ;将外部RAM或I/O地址1234H内的值放到累加器A中


在执行PUSH(压栈)和POP(出栈)指令时,采用堆栈指针SP作寄存器间接寻址。
例:PUSH  30H    ;把内部RAM地址30H内的值放到堆栈区中
堆栈区是由SP寄存器指定的,如果执行上面这条命令前,SP为60H,命令执行后会把内部RAM地址30H内的值放到RAM的61H内。


那么做为寄存器间接寻址用的寄存器主要有哪些呢?我们前面提到的有四个,R0、R1、DPTR、SP


寄存器间接寻址范围总结:
1、内部RAM低128单元。对内部RAM低128单元的间接寻址,应使用R0或R1作间址寄存器,其通用形式为@Ri(i=0或1)。


2、外部RAM 64KB。对外部RAM64KB的间接寻址,应使用@DPTR作间址寻址寄存器,其形式为:@DPTR。
例如MOVX A,@DPTR;其功能是把DPTR指定的外部RAM的单元的内容送入累加器A中。
外部RAM的低256单元是一个特殊的寻址区,除可以用DPTR作间址寄存器寻址外,还可以用R0或R1作间址寄存器寻址。
例如MOVX  A,@R0;这条指令的意思是,把R0指定的外部RAM单元的内容送入累加器A。


堆栈操作指令(PUSH和POP)也应算作是寄存器间接寻址,即以堆栈指针SP作间址寄存器的间接寻址方式。


寄存器间接寻址方式不可以访问特殊功能寄存器!!


寄存器间接寻址也须以寄存器符号的形式表示,为了区别寄存器寻址我寄存器间接寻址的区别,在寄存器间接寻址方式式中,寄存器的名称前面加前缀标志“@”。


基址寄存器加变址寄存器的变址寻址


这种寻址方式以程序计数器PC或DPTR为基址寄存器,累加器A为变址寄存器,变址寻址时,把两者的内容相加,所得到的结果作为操作数的地址。这种方式常用于访问程序存储器ROM中的数据表格,即查表操作。
变址寻址只能读出程序内存入的值,而不能写入,也就是说变址寻址这种方式只能对程序存储器进行寻址,或者说它是专门针对程序存储器的寻址方式。
例:MOVC  A,@A+DPTR
这条指令的功能是把DPTR和A的内容相加,再把所得到的程序存储器地址单元的内容送A
假若指令执行前A=54H,DPTR=3F21H,则这条指令变址寻址形成的操作数地址就是54H+3F21H=3F75H。如果3F75H单元中的内容是7FH,则执行这条指令后,累加器A中的内容就是7FH。


变址寻址的指令只有三条,分别如下:
JMP    @A+DPTR
MOVC   A,@A+DPTR
MOVC   A,@A+PC


第一条指令JMP @A+DPTR
这是一条无条件转移指令,这条指令的意思就是DPTR加上累加器A的内容做为一个16位的地址,执行JMP这条指令是,程序就转移到A+DPTR指定的地址去执行。


第二、三条指令MOVC   A,@A+DPTR和MOVC   A,@A+PC指令
这两条指令的通常用于查表操作,功能完全一样,但使用起来却有一定的差别,现详细说明如下。
我们知道,PC是程序指针,是十六位的。DPTR是一个16位的数据指针寄存器,按理,它们的寻址范围都应是64K。我们在学习特殊功能寄存器时已知道,程序计数器PC是始终跟踪着程序的执行的。也就是说,PC的值是随程序的执行情况自动改变的,我们不可以随便的给PC赋值。而DPTR是一个数据指针,我们就可以给空上数据指针DPTR进行赋值。我们再看指令MOVC   A,@A+PC这条指令的意思是将PC的值与累加器A的值相加作为一个地址,而PC是固定的,累加器A是一个8位的寄存器,它的寻址范围是256个地址单元。讲到这里,大家应可明白,MOVC   A,@A+PC这条指令的寻址范围其实就是只能在当前指令下256个地址单元。所在,这在我们实际应用中,可能就会有一个问题,如果我们需要查询的数据表在256个地址单元之内,则可以用MOVC   A,@A+PC这条指令进行查表操作,如果超过了256个单元,则不能用这条指令进行查表操作。刚才我们已说到,DPTR是一个数据指针,这个数据指针我们可以给它赋值操作的。通过赋值操作。我们可以使MOVC   A,@A+DPTR这条指令的寻址范围达到64K。这就是这两条指令在实际应用当中要注意的问题。


变址寻址方式是MCS-51单片机所独有的一种寻址方式。


位寻址


80C51单片机有位处理功能,可以对数据位进行操作,因此就有相应的位寻址方式。所谓位寻址,就是对内部RAM或可位寻址的特殊功能寄存器SFR内的某个位,直接加以置位为1或复位为0。


位寻址的范围,也就是哪些部份可以进行位寻址:


1、我们在第十二课学习51单片机存储器结构时,我们已知道在单片机的内部数据存储器RAM的低128单元中有一个区域叫位寻址区。它的单元地址是20H-2FH。共有16个单元,一个单元是8位,所以位寻址区共有128位。这128位都单独有一个位地址,其位地址的名字就是00H-7FH。
这里就有一个比较麻烦的问题需要大家理解清楚了。我们在前面的学习中00H、01H。。。。7FH等等,所表示的都是一个字节(或者叫单元地址),而在这里,这些数据都变成了位地址。我们在指令中,或者在程序中如何来区分它是一个单元地址还是一个位地址呢?这个问题,也就是我们现在正在研究的位寻址的一个重要问题。其实,区分这些数据是位地址还是单元地址,我们都有相应的指令形式的。这个问题我们在后面的指令系统学习中再加以论述。


2、对专用寄存器位寻址。这里要说明一下,不是所有的专用寄存器都可以位寻址的。具体哪些专用寄存器可以哪些专用寄存器不可以,请大家回头去看看我们前面关于专用寄存器的相关文章。一般来说,地址单元可以被8整除的专用寄存器,通常都可以进行位寻址,当然并不是全部,大家在应用当中应引起注意。


专用寄存器的位寻址表示方法:


下面我们以程序状态字PSW来进行说明


D7 D6 D5 D4  D3   D2  D1 D0

CY AC F0 RS1 RS0  OV     P


1、直接使用位地址表示:看上表,PSW的第五位地址是D5,所以可以表示为D5H
   MOV  C,D5H


2、位名称表示:表示该位的名称,例如PSW的位5是F0,所以可以用F0表示
   MOV  C,F0


3、单元(字节)地址加位表示:D0H单元位5,表示为DOH.5


   MOV  C,D0H.5


4、专用寄存器符号加位表示:例如PSW.5


   MOV C,PSW.5


这四种方法实现的功能都是相同的,只是表述的方式不同而已。


例题:


  1. 说明下列指令中源操作数采用的寻址方式。


  MOV R5,R7 答案:寄存器寻址方式


  MOV A,55H 直接寻址方式


  MOV A,#55H 立即寻址方式


  JMP @A+DPTR 变址寻址方式


  MOV 30H,C 位寻址方式


  MOV A,@R0 间接寻址方式


  MOVX A,@R0 间接寻址方式


改错题


  请判断下列的MCS-51单片机指令的书写格式是否有错,若有,请说明错误原因。


  MOV R0,@R3 答案:间址寄存器不能使用R2~R7。


  MOVC A,@R0+DPTR 变址寻址方式中的间址寄存器不可使用R0,只可使用A。


  ADD R0,R1 运算指令中目的操作数必须为累加器A,不可为R0。


  MUL AR0 乘法指令中的乘数应在B寄存器中,即乘法指令只可使用AB寄存器组合。

系统分类: 单片机   |    用户分类:    |    来源: 转贴

该用户于2009/6/26 16:31:00编辑过该文章

评论(0) | 阅读(64)
发表于:2009/6/26 15:13:11
标签:无标签

1

最新 51单片机学习板 开发板 ADC+温度+万年历+数字存储+红外

新版! 物超所值!

【标准版】优惠推广活动进行中!原价178元/套,2009.6.1-2009.6.30期间优惠价:158元/套!数量有限,预购从速!

新版 51单片机学习板/开发板/实验板 含优质带背光LCM1602液晶屏/时钟万年历/AD转换/断电保存数据/数字温度计/ 一体化红外遥控解码/LCM12864液晶接口,仿真(需选配仿真芯片)+烧录+实验+开发于一体,功能强大,扩展性极强,功能发挥淋漓尽致!100%单片机I/O接口扩展,充分发挥你的想象力!!

 

可选购LCM12864液晶屏学习汉字及图形驱动程序编写!(全新优质汉字/图形点阵蓝屏,带背光,128*64点阵,通用标准接口) 原价85元,现价每片68元.

更可以配合4*4键盘设计自己的汉字输入法程序和图形界面游戏程序!

 

附带光盘里成熟源代码可以直接用在你的项目中!

 

集仿真(需选配仿真芯片),烧录,实验,开发于一体 功能强劲 为单片机爱好者朋友们精心打造!强烈推荐!

 

ZC-51学习板从推出以来,受到很多单片机爱好者的关注和支持,一些网友还提出了自己宝贵的意见和建议!现推出第三版ZC-51学习板!功能更强,布局更合理,更美观,性价比更高!

布局优势:

1.按键4*4的16个排于右边,操作更方便。

2.USB口,备用电源座,DB9串口座,ISP下载座,统一排于左边。如我们的笔记本电脑接线口排列方便。

3.显示屏接口排在最上面,不用影响或遮盖到下面的元件,调整亮度方便,更美观。

4.扩展口用配有跳线块,避免无跳线块在试验时造成干扰,更合理。

  新推出学习板的新功能和特点

1128*64图形汉字点阵液晶屏接口,可以配合4*4键盘设计自己的汉字输入法程序!

AD转换芯片,模数转换对于学习单片机很重要!很多同价位的学习板上都没有,大家可以对比一下!

3支持仿真芯片(需选配)可以单步、断点、全速调试运行程序!

100%释放单片机I/O,可以随意引出做扩展实验,不浪费!

支持Atmel 89系列51单片机和AVR AT90S8515,Atmega8515系列单片机,更具信价比!

八位流水灯

八位数码管显示

8   标准51 ISP下载接口插座,下载更方便!

9  一体化红外接收头,做红外遥控接收实验!

10 一线制数字温度传感器,做温度计实验!

11 零力插拔活动自锁座,安装单片机方便,更灵活!

12   PCB布局更合理、美观!

13  电源指示灯,是否上电更直观!

14   增加4个白色塑料支撑座,防止电路板下面短路!学习、开发更舒适!

15 更多的资源配置请看下面的资源配置介绍!

 

ZC-51【标准版】装箱清单:

1  测试好的ZC-51 V3.0单片机学习板  一套

2  优质 LCM1602字符型液晶屏    一片

3  STC89C52单片机(具有ISP串口下载功能、8K程序空间)    1片

4  DS18B20 数字温度芯片(已焊在板子上) 1只

5  HX1838一体化红外接收头(已焊在板子上) 1只

6  串口通讯线(通讯用)  1条

7  USB接口线/连接线(给学习板供电) 1条

8  万用电路板 1块 赠品

9  配套资料光盘 1套

10  白色塑料底座 4只

多买可赠送遥控器1个

详细情况欢迎大家访问智成单片机淘宝店铺:http://shop34218752.taobao.com/

系统分类: 单片机   |    用户分类:    |    来源: 无分类

该用户于2009/6/26 15:13:28编辑过该文章

评论(0) | 阅读(77)
发表于:2009/6/10 16:14:47
标签:无标签

0

AT89C51单片机的介绍

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

1.主要特性:

·与MCS-51 兼容
·4K字节可编程闪烁存储器
寿命:1000写/擦循环
数据保留时间:10年
·全静态工作:0Hz-24Hz
·三级程序存储器锁定
·128*8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路

2.管脚说明

    VCC:供电电压。
    GND:接地。
    P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
    P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
    P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
    P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚 备选功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。

    RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。

   /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
    /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
    XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
    XTAL2:来自反向振荡器的输出。

3.振荡器特性:

    XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

4.芯片擦除:

    整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。

点击这里可以下载AT89C51芯片的英文PDF文档

    很多初学51单片机的网友会有这样的问题:AT89S51是什么?书上和网络教程上可都是8051,89C51等!没听说过有89S51 ?!

    这里,初学者要澄清单片机实际使用方面的一个产品概念,MCS-51单片机是美国INTE公司于1980年推出的产品,典型产品有 8031(内部没有程序存储器,实际使用方面已经被市场淘汰)、8051(芯片采用HMOS,功耗是630mW,是89C51的5倍,实际使用方面已经被市场淘汰)和8751等通用产品,一直到现在, MCS-51内核系列兼容的单片机仍是应用的主流产品(比如目前流行的89S51、已经停产的89C51等),各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。

    有些文献甚至也将8051泛指MCS-51系列单片机,8051是早期的最典型的代表作,由于MCS-51单片机影响极深远,许多公司都推出了兼容系列单片机,就是说MCS-51内核实际上已经成为一个8位单片机的标准。

    其他的公司的51单片机产品都是和MCS-51内核兼容的产品而以。同样的一段程序,在各个单片机厂家的硬件上运行的结果都是一样的,如ATMEL的89C51(已经停产)、89S51, PHILIPS(菲利浦),和WINBOND(华邦)等,我们常说的已经停产的89C51指的是ATMEL公司的 AT89C51单片机,同时是在原基础上增强了许多特性,如时钟,更优秀的是由Flash(程序存储器的内容至少可以改写1000次)存储器取带了原来的ROM(一次性写入),AT89C51的性能相对于8051已经算是非常优越的了。

    不过在市场化方面,89C51受到了PIC单片机阵营的挑战,89C51最致命的缺陷在于不支持ISP(在线更新程序)功能,必须加上ISP功能等新功能才能更好延续MCS-51的传奇。89S51就是在这样的背景下取代89C51的,现在,89S51目前已经成为了实际应用市场上新的宠儿,作为市场占有率第一的Atmel目前公司已经停产AT89C51,将用AT89S51代替。89S51在工艺上进行了改进,89S51采用0.35新工艺,成本降低,而且将功能提升,增加了竞争力。89SXX可以像下兼容89CXX等51系列芯片。同时,Atmel不再接受89CXX的定单,大家在市场上见到的89C51实际都是Atmel前期生产的巨量库存而以。

89S51相对于89C51增加的新功能包括:

-- 新增加很多功能,性能有了较大提升,价格却基本不变,甚至比89C51更低!

-- ISP在线编程功能,这个功能的优势在于改写单片机存储器内的程序不需要把芯片从工作环境中剥离。是一个强大易用的功能。

-- 工作频率为33MHz,大家都知道89C51的极限工作频率只有24M,就是说S51具有更高工作频率,从而具有了更快的计算速度。

-- 具有双工UART串行通道。

-- 内部集成看门狗计时器,不再需要像89C51那样外接看门狗计时器单元电路。

-- 双数据指示器。

-- 电源关闭标识。

-- 全新的加密算法,这使得对于89S51的解密变为不可能,程序的保密性大大加强,这样就可以有效的保护知识产权不被侵犯。

-- 兼容性方面:向下完全兼容51全部字系列产品。比如8051、89C51等等早期MCS-51兼容产品。也就是说所有教科书、网络教程上的程序(不论教科书上采用的单片机是8051还是89C51还是MCS-51等等),在89S51上一样可以照常运行,这就是所谓的向下兼容。

AT89S51看门狗程序例子如下:

AJMP MAIN

MAIN:

;启动看门狗
Mov 0A6H,#01EH ;先送1E
Mov 0A6H,#0E1H ;后送E1

;主程序************************************************************
;******************************************************************

START:

ACALL WDT ;调用复位看门狗子程序

AJMP START

;主程序************************************************************
;******************************************************************

;复位看门狗子程序
WDT:
Mov 0A6H,#01EH ;先送1E
Mov 0A6H,#0E1H ;后送E1
RET

END

注意事项:
1. 89S51的看门狗必须由程序激活后才开始工作。所以必须保证CPU有可靠的上电复位。
否则看门狗也无法工作。
2. 看门狗使用的是CPU的晶振。在晶振停振的时候看门狗也无效。
3. 89S51只有14位计数器。在16383个机器周期内必须至少喂狗一次。而且这个时间是固
定的,无法更改。当晶振为12M时每16个毫秒需喂狗一次。

点击看大图

点击看大图

点击看大图

以上是AT89C51单片机的汇编指令表,共111条指令。

点击看大图

上面是AT89C51单片机的RAM内存分布表,必须要了解!

点击看大图

二进制需要加B,十进制加D也可以省略,十六进制需要加H,A~F前要加0


电源控制寄存器PCON

点击看大图

 

系统分类: 单片机   |    用户分类:    |    来源: 转贴

该用户于2009/6/10 16:15:09编辑过该文章

评论(0) | 阅读(163)
发表于:2009/6/7 11:12:25
标签:无标签

1

本店具有多年成熟的51单片机开发经验,正低价促销配置超值51单片机开发板

【标准版】优惠推广活动进行中!原价178元/套,2009.6.1-2009.6.30期间优惠价:158元/套!数量有限,预购从速!

新版 51单片机学习板/开发板/实验板 含优质带背光LCM1602液晶屏/时钟万年历/AD转换/断电保存数据/数字温度计/ 一体化红外遥控解码/LCM12864液晶接口,仿真(需选配仿真芯片)+烧录+实验+开发于一体,功能强大,扩展性极强,功能发挥淋漓尽致!100%单片机I/O接口扩展,充分发挥你的想象力!!

 详细情况欢迎大家访问智成单片机淘宝店铺:http://shop34218752.taobao.com/

联系方式:

email:   zhicheng_dz@163.com
QQ:  745981992
手机:13817770698(短信)

系统分类: 单片机   |    用户分类:    |    来源: 原创

该用户于2009/6/7 11:12:35编辑过该文章

评论(0) | 阅读(99)
发表于:2009/6/1 14:15:48
标签:无标签

1

晒一下158元含蓝屏1602的51单片开发板,高性能!

     公司从大型供应商中采购器件,质量可靠,性能稳定。本提供开发板原理图,实验程序,入门资料,开发软件,调试软件等
技术支持到位,可QQ,论坛,博客,E-mail,以及手机短信做技术支持.
适合单片机的学习者入门学习,价格便宜!并在优惠活动中
       欢迎大家参观购买,有什么问题随时QQ: 745981992手机短信:13817770698其中51单片机开发板是本人设计,提供详细的代码和入门资料,以及强大的技术支持.

  

新版 51单片机学习板/开发板/实验板 含优质带背光LCM1602液晶屏/时钟万年历/AD转换/断电保存数据/数字温度计/ 一体化红外遥控解码/LCM12864液晶接口,仿真(需选配仿真芯片)+烧录+实验+开发于一体,功能强大,扩展性极强,功能发挥淋漓尽致!100%单片机I/O接口扩展,充分发挥你的想象力!!

 

集仿真(需选配仿真芯片),烧录,实验,开发于一体 功能强劲 为单片机爱好者朋友们精心打造!强烈推荐!

 

ZC-51学习板从推出以来,受到很多单片机爱好者的关注和支持,一些网友还提出了自己宝贵的意见和建议!现推出第三版ZC-51学习板!功能更强,布局更合理,更美观,性价比更高!

布局优势:

1.按键4*4的16个排于右边,操作更方便。

2.USB口,备用电源座,DB9串口座,ISP下载座,统一排于左边。如我们的笔记本电脑接线口排列方便。

3.显示屏接口排在最上面,不用影响或遮盖到下面的元件,调整亮度方便,更美观。

4.扩展口用配有跳线块,避免无跳线块在试验时造成干扰,更合理。

  新推出学习板的新功能和特点

1128*64图形汉字点阵液晶屏接口,可以配合4*4键盘设计自己的汉字输入法程序!

AD转换芯片,模数转换对于学习单片机很重要!很多同价位的学习板上都没有,大家可以对比一下!

3支持仿真芯片(需选配)可以单步、断点、全速调试运行程序!

100%释放单片机I/O,可以随意引出做扩展实验,不浪费!

支持Atmel 89系列51单片机和AVR AT90S8515,Atmega8515系列单片机,更具信价比!

八位流水灯

八位数码管显示

8   标准51 ISP下载接口插座,下载更方便!

9  一体化红外接收头,做红外遥控接收实验!

10 一线制数字温度传感器,做温度计实验!

11 零力插拔活动自锁座,安装单片机方便,更灵活!

12   PCB布局更合理、美观!

13  电源指示灯,是否上电更直观!

14   增加4个白色塑料支撑座,防止电路板下面短路!学习、开发更舒适!

15 更多的资源配置请看下面的资源配置介绍!

除了台式机用的外并配合有笔记本用的单片机学习板。 详细情况欢迎大家访问智成单片机淘宝店铺:http://shop34218752.taobao.com/

 

系统分类: 单片机   |    用户分类:    |    来源: 无分类

该用户于2009/6/1 14:16:01编辑过该文章

评论(0) | 阅读(128)
发表于:2009/5/27 16:01:58
标签:无标签

1

51单片机ARP协议实现原理

 ARP是Address Resolution Protocol的缩写。中文译做“地址解析协议”,本质是完成网络地址到物理地址的映射。从概念上讲就是找到一个映射方法f,使得“物理地址 = f(网络地址)”。物理地址有两种基本类型:以太网类型和proNET令牌环网类型,网络地址特指IP地址,对映射方法的要求就是高效。具体到以太网,它使用的是动态绑定转换的方法。为什么不直接使用同一种地址,而要这么麻烦呢?因为TCP/IP网络就是为将不同种类计算机互联而发明的,它的体系结构是分层的,层和层之间相互独立,改变物理层的实现不会影响到网络层。
32位IP地址到以太网48位物理地址的映射,采用动态绑定转换的方法会遇到许多细节问题,例如:减少广播,ARP包丢失,物理地址变更(更换网卡)、移动(移动设备到另一子网)、消失(关机)等。一般是设置ARP高速缓存,通过学习、老化、更新、溢出算法处理ARP映射表来解决这些问题。其中,学习指ARP收到任何指向本节点IP地址的ARP/IP包,从中提取出地址对,而ARP缓存中无对应项时,由ARP接收部分添加;老化指为每项设置寿命域,以便代谢掉陈旧的地址映射项;更新指ARP提取到新的地址对时,用其更新缓存里已有的对应项;溢出算法指当缓存满时,采取何种方法替换旧有的地址对儿。
    我找到了几个TCP/IP源代码,对比他们的实现,深感差别巨大,灵活多变。有的代码未实现ARP缓存,只用几个全局变量记录源目的IP地址和源目的MAC地址,每次通信前直接操作全局变量,这在使用51单片机,进行点对点通信时不失为一个有效的方案;而有的代码庞大复杂,细节处理精益求精。比如实现了ARP高速缓存、支持多址节点、支持网管查看/动态改变ARP相关参数、重发处理、支持IPv6等。我的看法是:ARP的本质是地址转换,只要抓住这个灵魂,设计的大方向就把握住了。具体实现过程各具特色,因人而异,没有统一要求,有些功能可以不实现,有些优点不能兼得,而唯一不变的只有思想。
    我参考了几种已有的IP协议栈并结合51单片机的特点,实现了自己的基于uCOS51的TCP/IP协议栈方案。它只是一种具体的实现范例,不同的人有不同的设计方法。我保证自己的方案可以正常使用并具有较好的完备性。
   
    ------------------------------
    |状态|寿命ttl|IP地址 |MAC地址|        学习
    ------------------------------
    |  0 |   FF  |X:X:X:X| XXXX  |  <---  老化
    ------------------------------
    |  0 |   FF  |X:X:X:X| XXXX  |        更新
    ------------------------------
           图1 ARP缓存表                  表满处理
   
    如图1所示,ARP缓存表由状态、寿命、IP地址、MAC地址4个字段组成。状态字段指示地址对是否有效(0-空闲 1-占用);寿命字段用于老化操作,初始存入最大值,以后由OS时间函数调用,每秒减1,直至为0清除;IP地址和MAC地址字段保存网络地址和物理地址的映射。此处,没有设计发送数据链表首指针和重发记数字段,我把重发操作交给上层软件统一处理,这是本程序的特色。围绕ARP缓存表,完成了4种操作:学习、老化、更新、表满处理,详见伪代码清单。使用OS的Shell命令ls可以查看ARP表的内容,但不支持修改,这个功能对测试很有用。(显示内容举例如图2所示)
   
    %ls
   
     ARP table:
     status     TTL      IP address      MAC address
     =================================================
       01        78     172.18.92.86     0050BABD4C7E
    
    %
              图2 ARP缓存表显示内容举例
             
   
             表满处理
                |
                v                               ARP请求 
            ---------             ----------- ---------->
            |       |  学习/更新  |         | <- - - - -
    老化--->| ARP表 |<------------| ARP处理 |
            |       |             |         | - - - - - >
            ---------             ----------- <----------
                ^                               ARP应答
                |学习/更新
            ---------
            |       |
            | IP_in |
            |       |
            ---------
                        图3 ARP处理过程
                       
    0                 8               16              24               31                   
    ---------------------------------------------------------------------
    |             硬件类型            |            协议类型             |
    ---------------------------------------------------------------------
    |硬件地址长度(HLEN)|协议长度(PLEN)|               操作              |
    ---------------------------------------------------------------------
    |                         发送方首部(八位组0-3)                     |
    ---------------------------------------------------------------------
    |      发送方首部(八位组4-5)      |      发送方IP地址(八位组0-1)    |
    ---------------------------------------------------------------------
    |     发送方IP地址(八位组2-3)     |        目标首部(八位组0-1)      |
    ---------------------------------------------------------------------
    |                         目标首部(八位组2-5)                       |
    ---------------------------------------------------------------------
    |                        目标IP地址(八位组0-3)                      |
    ---------------------------------------------------------------------
                                图4 ARP包结构
   
    如图3,整个ARP处理过程,我主要用5个函数实现。ARP初始化(ARP_init)、ARP请求(ARP_request)、ARP应答(ARP_answer)、ARP回应处理(ARP_process)、IP包接收预处理(IP_in)。在实现网卡驱动程序后,所有ARP处理操作就是填写ARP包(ARP包结构见图4),详见伪代码清单。
    ARP_init完成ARP表初始化,概括说就是ARP表state字段清0。
    ARP_request完成ARP请求操作。ARP协议要求程序根据子网掩码判断IP地址是否属于同一子网,如果在同一子网内,ARP请求目的MAC地址,否则请求默认网关MAC地址。
    ARP_answer比较简单,只要交换ARP请求包地址内容,填写自己的MAC地址和很少的改动后发送即可。
    ARP_process完成ARP回应回来的信息处理。主要进行ARP表的学习和更新。
    IP_in完成IP包接收预处理,用于提取地址映射信息,以便主动学习和及时更新。我的程序不会主动学习不是发给自己IP地址的MAC地址信息,因为ARP表在51中的容量有限,只有频繁用到的地址对才应该存放在里面,否则一旦出现“颠簸”,ARP表就失效了。
    有的ARP实现方案采用数据驱动方式,参数可配置,使用统一的程序,通过加载不同的配置数据,执行不同的操作。这样做使程序版本统一,不同的应用只要加载不同的配置数据即可,不用更换程序,有利于后期维护。但是考虑到51资源紧张和安全性,我的方案只能显示ARP表不允许修改其内容,用户可发挥想象力在此处增加新功能。另外,ARP程序应该记住上一次发过的请求,以避免重发,但同样考虑到资源紧张,也免了。其实无所谓,重发就重发了。表满处理采用有损性能的加速算法,快速有效。另外,本程序不能直接用于嵌入式网关产品。
    uCOS51操作系统本身提供了良好的内存管理功能,我利用它设置了大中小三种缓冲区存放不同类型的数据包。内存使用前申请,使用后释放,有效利用了资源。
    系统特点是:1.抢占式优先级;2.消息驱动;3.串行服务器模式。
    系统优点是:1.等待时不耗费CPU资源;2.有超时保护,不会死锁;3.思路清晰易懂。
    系统基于中断驱动,使用Int0做网卡中断输入口。ISR寄存器只用到4位:OVW 收溢出错/TXE 发被中断错/PTX  发送成功/PRX 接收成功。TCP/IP协议栈做成任务,脱离内核。整体框架如图5、6、7所示。主程序框架见伪代码清单(RxSem和TxSem初始化为0)
   
            ----------
            |网卡中断|
            ----------
                |
                V
            ----------  |>
            |发信号量|  |  收完/收溢出错
            |SemPost |---->-------------- RxSemPost
            ----------  |>
                |       |  发完/发被中断错
                ---------->-------------- TxSemPost
          图5 网卡中断处理程序
         
         
                进入
                 |   ------
                 V   |    |                          发
             ----------   |                       低优先级
     ------> |  等待  |<---  
     |       |TxQPend |<---------------------         -----
     |       ----------                     |          | |
     |           | TxQFIFO非空              |          | |
     |           V                          |   ---<---| |---<---
     |       ----------                     |   数据源 | |  各任务发送来的数据
     |       | 发送包 |                     |          | |
     |       ----------                     |         -----
     |           |                          |        TxQFIFO
     |           V                          |
     |   ---------------------              |
     |   |    释放内存       |              |
     |   |(包已存入网卡RAM里)|              |
     |   ---------------------              |
     |           |    -----                 |
     |           V    |   |                 |
     |       -----------  |                 |
     |       |  等待   |<--                 | (等效发送包被抛弃)
     |       |TxSemPend|<-----------        |
     |       -----------           |        |
     |           | 发完/超时       |        |
     |           V                 |        |
     | Y  ----------------    -----------   |
     -<---| 发送成功吗? |    |重发第n次|   |
          |(无错且不超时)|    |   n<N   |   |
          ----------------    -----------   |
                 | N              /^\       |
                 V         N       |        |
           ------------------>------        |
           |已发了N次吗?|---------->--------
           ---------------       Y
             
              图6 发送流程图
             
             
                                    进入
                                     |   -----
                                     V   |   |                       收
                                -----------  |                    高优先级
             ------------------>|   等待  |<--
             |        --------->|RxSemPend|<---------------
             |        |         -----------       /|\    /|\
             |        |              | 收到包 或   |      |
             |        |              V 收错 或     |      |
             |        |              | 超时        |      |
             |        |         -----------        |  ----------
             |        |         |存并清ISR|        |  |复位网卡|
        -----------   |         -----------        |  ----------
        |RxSemPost|   |              |             |   /^\  /^\
        -----------   |              V             |    |    |
             |        |      --------------------  |    |    |
             |        |      |超时且无新包且无错| Y|    |    |
             |        |      |    (防死锁)      |->-    |    |
             |        |      --------------------       |    |
            /|\       |(不执行       | N                |    |
             |        |RxSemPost)    V                  |    |
             |        |         ------------  Y         |    |
             |        |         | 收溢出错 |--->---------    |
             |        |         | ISR之OVW |                 |
             | Y      | N       ------------                 |
        ------------------           | N                     |
        |网卡中还有包吗?|           V                       |
        |  CURR!=BNRY+1  | ------------------------  Y       |
        ------------------ |读出包头,查有无逻辑错|--->-------
               |           ------------------------
              /|\                    | N
               |                     V
               |           ------------------------
           ----------      |按包长度申请合适的大中|
           |释放内存|      |小号内存,并存入整个包|
           ----------      |,再调整BNRY          |
             /^\ /^\       ------------------------
              |   |                  |
              |   |                  V
              |   |   N  ----------------------------
              |   ---<---|是否是发给自己IP地址的包?|
              |          ----------------------------
              |                      | Y
              |                      V
              |                 ------------
              |                 |  包分发  |
              |                 ------------
              |                      |
              |                      V
              |           ----------------------------
              |           |        |        |        |
              |           V      -------------------------- IP_in过滤
              |           |        V        V        V
              |          ARP   ICMP(Ping)  UDP      TCP
              |           |        |        |        |
              |           ----------------------------
              |                      | 串行处理
              |                      | (32bitMCU可设计成并发模式)
              |---------<-------------
                
                              图7 接收流程图
        
    我仔细检查了几遍,似乎比较完备了,各种情况下均可以正常工作。在超负荷流量下,只会抛包,不会死机。当然,由于本人接触资料有限和个人局限性,肯定有错误和疏漏之处,希望大家提出意见和建议。
   
伪代码清单:
ARP_init() //ARP缓存初始化
{
  for(i=0;i<ARPTabSize;i++)
    ARPTable[i].status=0;
}

ARP_request(目的IP地址) //ARP请求
{
//判断IP地址是否属于同一子网的任务交给上层软件处理
//(由它决定请求网卡IP地址还是默认网关IP地址),
//这有利于减少代码量。

  //申请小号内存
  pARP="OSMemGet"();

  //填以太网帧
  以太网协议=0x0806;//ARP协议
  目的MAC地址=0xffff;//广播地址
  源MAC地址=自己的MAC地址;

  //填ARP表
  硬件类型=0x0001;
  协议类型=0x0800;
  硬件地址长度=0x06;
  协议长度=0x04;
  操作=0x0001;//请求
  发送方首部=自己的MAC地址;
  发送方IP地址=源IP地址;
  目标首部=0x0000;
  目标IP地址=目的IP地址;
 
  //填充PAD
  没有内容处填充0;

  //发送ARP包至TxQFIFO缓存
  OSQSend(QID,*pARP);
}

ARP_answer(*pARP) //ARP应答
{
  学习/更新ARP缓存表;
 
  //修改收到的ARP包,形成ARP应答
  //填以太网帧
  目的MAC地址=对方(网卡/网关)发来的源MAC地址;
  源MAC地址=自己的MAC地址;

  //填ARP表
  目标首部=发送方首部;发送方首部=自己的MAC地址;
  交换发送方IP地址和目标IP地址;
  操作=0x0002;//ARP应答

  //发送ARP包至TxQFIFO缓存
  OSQSend(QID,*pARP);
}

ARP_process(*pARP) //ARP应答处理
{
  //更新
  for(i=0;i<ARPTabSize;i++){
    if(ARPTab[i].status==1){
      if(ARPTab[i].IPAdr==收到的ARP应答包源IP地址){
        ARPTab[i].ttl=最大寿命;
        ARPTab[i].IPAdr=收到的包的源IP地址;
        ARPTab[i].MACAdr=收到的包的源MAC地址;
        return;
      }
    }
  }
 
  //学习
  for(i=0;i<ARPTabSize;i++){
    if(ARPTab[i].status==0){
      ARPTab[i].status=1;
      ARPTab[i].ttl=最大寿命;
      ARPTab[i].IPAdr=收到的包的源IP地址;
      ARPTab[i].MACAdr=收到的包的源MAC地址;
      return;    
    }
  }

  //表满处理,有损性能的快速算法
  ARPTab[index].status=1; //注:index为全局变量,保存ARP缓存表项索引。每次处理加1取模。
  ARPTab[index].ttl=最大寿命;
  index++;
  if(index>=ARPTabSize) index="0";
}

IP_in(*pIP) //IP包过滤(ARP地址学习) 注:这里处理的是IP包,伪代码与上面程序相似,但源代码差别很大。
{
  //更新
  for(i=0;i<ARPTabSize;i++){
    if(ARPTab[i].status==1){
      if(ARPTab[i].IPAdr==收到的IP包源IP地址){
        ARPTab[i].ttl=最大寿命;
        ARPTab[i].IPAdr=收到的包的源IP地址;
        ARPTab[i].MACAdr=收到的包的源MAC地址;
        return;
      }
    }
  }
 
  //学习
  for(i=0;i<ARPTabSize;i++){
    if(ARPTab[i].status==0){
      ARPTab[i].status=1;
      ARPTab[i].ttl=最大寿命;
      ARPTab[i].IPAdr=收到的包的源IP地址;
      ARPTab[i].MACAdr=收到的包的源MAC地址;
      return;    
    }
  }

  //表满处理,有损性能的快速算法
  ARPTab[index].status=1; //注:index为全局变量,保存ARP缓存表项索引。每次处理加1取模。
  ARPTab[index].ttl=最大寿命;
  index++;
  if(index>=ARPTabSize) index="0";
}

timer() //软定时器任务,用于ARP老化
{
  for(;;){
    taskDelay(1秒);
    for(i=0;i<ARPTabSize;i++){
      if(ARPTab[i].status==1){
        if(ARPTab[i].ttl==0)
          ARPTab[i].status=0;
        else
          ARPTab[i].ttl--;
    }
  }
}

主程序框架:
    initNIC    //初始化网卡
    //创建资源
    TxSem和RxSem信号量
    TxQFIFO队列
    大中小内存设立
    //创建任务
    收
    发
    。
    。
    。
   
参考文献:
1。《用TCP/IP进行网际互连》(第3版)第一、二、三卷 DOUGLAS E.COMER著 电子工业出版社

系统分类: 单片机   |    用户分类:    |    来源: 转贴

该用户于2009/5/27 16:02:30编辑过该文章

评论(0) | 阅读(99)
2345678910>>Next >Total , Page /