??xml version="1.0" encoding="utf-8" standalone="yes"?>久久天天躁狠狠躁夜夜不卡 ,久久丫精品国产亚洲av不卡 ,国产精品九九久久免费视频 http://www.shnenglu.com/guojingjia2006/archive/2010/08/01/121871.html果?/dc:creator>果?/author>Sun, 01 Aug 2010 08:11:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/08/01/121871.htmlhttp://www.shnenglu.com/guojingjia2006/comments/121871.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/08/01/121871.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/121871.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/121871.html//|上看了下资?借鉴了别人的一些好的东西,同时自己装了下
#ifndef __mycom__h__
#define __mycon__h__
#include 
<string.h>
//数据格式
//W 8  
#define SUCCESS 1
#define ERROR   0

#define uchar unsigned char
#define uint  unsinged int

#define BUF_LEN 30  //传冲区大?/span>
#define RECIEVED_MAX_DATA_LEN 16
#define SEND_MAX_DATA_LEN 25
#define END_NUM 4   //l束W长?/span>


typedef 
void (*PTRFUN)(uchar*,uchar);
PTRFUN ptrFun;
 
uchar END_CODE[
4]="#end";
uchar end_num
=0;
uchar data_num
=0;       //接受数据个数
uchar data_buf[BUF_LEN];//~冲区大?/span>
uchar data_addr=0;      //数据在data_buf位置
bit isComplete=0;     //处理

typedef  
struct
{
char name[10];   //姓名
int age;         //q龄
char sex[5];     //性别
}st;

st b;

//初始?/span>
void init_serialcomm(void)
{
    SCON 
= 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr
    TMOD |= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload
    PCON |= 0x80;       //SMOD=1;
    TH1   = 0xF4;       //Baud:4800 fosc=11.0592MHz
    IE   |= 0x90;       //Enable Serial Interrupt
    TR1   = 1;          // timer 1 run
   
// TI=1;
}

//*******数据转换*********************
uchar decoderData(){
    uchar state,i;
    state
=0;
    i
=2;
    
//-----------------------计算地址-------------------------------
    while(1){
        
if( (data_buf[i]>47)&&(data_buf[i]<58) )             // ?#8216;0’-‘9’Q?/span>
            state = (state*10)+(data_buf[i]-48);        // 计算
        else if( data_buf[i]==' ' )    break;            // 是空?跛_
        else                                                     // ?0'-'9'? '
        {
            
return ERROR;                                    // q回错误
        }
        
if( i>4 )                                            // 输入数字q大
        {
            
return ERROR;
        }
        i
++;
    }
    data_buf[
1]=state;//数据个数
    data_addr=++i;
    
return SUCCESS;
}
//***************************接收处理**************************************
void afterRecived(void)
{
    
if( decoderData()==ERROR )    return;            // 错误Q返?/span>
    if( data_buf[1]>RECIEVED_MAX_DATA_LEN )                                    // 写入个数判断
    {
        
return;                                            // 数据个数太多Q返?/span>
    }
    ptrFun(
&data_buf[data_addr],data_buf[1]);
}

//向串口发送一个字W?/span>
void send_char_com(unsigned char ch)  
{
    SBUF
=ch;
    
while(TI==0);
    TI
=0;
}

//向串口发送一个字W串Qstrlen字符串长?/span>
void send_string_com(unsigned char *str,uchar len)
{
    unsigned 
int k=0;
    
do
    {
        send_char_com(
*(str + k));
        k
++;
    } 
while(k < len);
}
void sendBefore(void* p){
    
char* m=(char*)p;
    uchar len
=sizeof(st);
    send_string_com(m,len);
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
    unsigned 
char state;
    
if( RI==1 )
    {
        state 
= SBUF;                // ~存接收到的数据
        RI = 0;                        // 接收标志清零
//---------------------结束命?end---------------------------
        if( state==END_CODE[end_num] )    
        {
            end_num
++;
            
if( end_num==END_NUM )
            {
                end_num 
= 0;
                isComplete 
= 1;
                ES
=0;
            }
        }
        
else end_num = 0;
//---------------------串口数据处理-------------------------------
        if( data_num>SEND_MAX_DATA_LEN )        
        {
            data_num 
= 0;
            
//ERROR 接受数据q长
        }
        data_buf[data_num
++= state;
    }
}


#endif

#include <REGX52.H>
#include 
"51com.h"
#include 
"util.h"

unsigned 
char key_map[]={0,7,8,9,'/',4,5,6,'*',1,2,3,'-','c',0,'=','+'};
unsigned 
char tab[]={0xFE,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};

void process(uchar* p,len){
    P1
=tab[string_to_int(p,len)];
}

void main(void)
{   
    init_serialcomm(); 
//初始化串?/span>
    ptrFun=process;


    b.age=10;
 

    sendBefore(&b);

   
//send_string_com("b",1);
    while(1)
    {
        
if( isComplete==1 )                 // 串口接收C串数?/span>
        {    
            isComplete 
= 0;                    // 标志清零
            if( data_buf[0]=='R' )afterRecived();
            
else if( data_buf[0]=='S' )send_string_com("b",1);
            data_num 
= 0;              // 重新开始接收数?/span>
            ES = 1;                            // 允许串口中断
        }
    }
}




]]>
crc 原理及实?/title><link>http://www.shnenglu.com/guojingjia2006/archive/2010/07/30/121711.html</link><dc:creator>果?/dc:creator><author>果?/author><pubDate>Fri, 30 Jul 2010 09:34:00 GMT</pubDate><guid>http://www.shnenglu.com/guojingjia2006/archive/2010/07/30/121711.html</guid><wfw:comment>http://www.shnenglu.com/guojingjia2006/comments/121711.html</wfw:comment><comments>http://www.shnenglu.com/guojingjia2006/archive/2010/07/30/121711.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guojingjia2006/comments/commentRss/121711.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guojingjia2006/services/trackbacks/121711.html</trackback:ping><description><![CDATA[<font size="3" face="宋体"> <table id="table4" border="0" cellpadding="0" cellspacing="0" width="605"> <tbody> <tr> <td valign="top"><strong>引言</strong> <p align="left">CRC的全UCؓCyclic Redundancy CheckQ中文名UCؓ循环冗余校验。它是一c重要的U性分l码Q编码和解码Ҏ单,错和U错能力强,在通信领域q泛地用于实现差错控制。实际上Q除 数据通信外,CRC在其它很多领域也是大有用武之地的。例如我们读软盘上的文gQ以及解压一个ZIP文gӞ偶尔会碰?#8220;Bad CRC”错误Q由此它在数据存储方面的应用可略见一斑?/p> <p align="left">差错控制理论是在代数理论基础上徏立v来的。这里我们着g介绍CRC的算法与实现Q对原理只能捎带说明一下。若需要进一步了解线性码、分l码、@环码、纠错编码等斚w的原理,可以阅读有关资料?/p> <p align="left">利用CRCq行错的q程可简单描qCؓQ在发送端Ҏ要传送的k位二q制码序列,以一定的规则产生一个校验用的r位监? ?CRC?Q附在原始信息后边,构成一个新的二q制码序列数共k+r位,然后发送出厅R在接收端,Ҏ信息码和CRC码之间所遵@的规则进行检验,? 定传送中是否出错。这个规则,在差错控制理ZUCؓ“生成多项?#8221;?/p> <p align="left"><br> </p> <p align="left"><strong>1 代数学的一般性算?/strong></p> <p align="left">在代数编码理ZQ将一个码l表CZؓ一个多式Q码l中各码元当作多式的系数。例?1100101 表示?br>1·x<sup>6</sup>+1·x<sup>5</sup>+0·x<sup>4</sup>+0·x<sup>3</sup>+1·x<sup>2</sup>+0·x+1Q即 x<sup>6</sup>+x<sup>5</sup>+x<sup>2</sup>+1?/p> <p align="left">讄码前的原始信息多式为P(x)QP(x)的最高幂ơ加1{于kQ生成多式为G(x)QG(x)的最高幂ơ等于rQCRC多项式ؓR(x)Q编码后的带CRC的信息多式为T(x)?/p> <p align="left">发送方~码ҎQ将P(x)乘以xr(卛_应的二进制码序列左移r?Q再除以G(x)Q所得余式即为R(x)。用公式表示?br>T(x)=x<sup>r</sup>P(x)+R(x)</p> <p align="left">接收方解码方法:T(x)除以G(x)Q如果余Cؓ0Q则说明传输中无错误发生Q否则说明传输有误?/p> <p align="left">举例来说Q设信息码ؓ1100Q生成多式?011Q即P(x)=x<sup>3</sup>+x<sup>2</sup>QG(x)=x<sup>3</sup>+x+1Q计CRC的过Eؓ</p> <div align="left"> <pre> x<sup>r</sup>P(x) x<sup>3</sup>(x<sup>3</sup>+x<sup>2</sup>) x<sup>6</sup>+x<sup>5</sup> x<br> -------- = ---------- = -------- = (x<sup>3</sup>+x<sup>2</sup>+x) + --------<br> G(x) x<sup>3</sup>+x+1 x<sup>3</sup>+x+1 x<sup>3</sup>+x+1<br></pre> </div> <p align="left">?R(x)=x。注意到G(x)最高幂ơr=3Q得出CRC?10?/p> <p align="left">如果用竖式除法,计算q程?/p> <div align="left"> <pre> 1110<br> ------- <br> 1011 /1100000 (1100左移3?<br> 1011<br> ----<br> 1110<br> 1011<br> -----<br> 1010<br> 1011<br> -----<br> 0010<br> 0000<br> ----<br> 010<br></pre> </div> <p align="left">因此QT(x)=(x<sup>6</sup>+x<sup>5</sup>)+(x)=x<sup>6</sup>+x<sup>5</sup>+x, ?1100000+010=1100010</p> <p align="left">如果传输无误Q?/p> <div align="left"> <pre> T(x) x<sup>6</sup>+x<sup>5</sup>+x<br> ------ = --------- = x<sup>3</sup>+x<sup>2</sup>+x,<br> G(x) x<sup>3</sup>+x+1<br></pre> </div> <p align="left">无余式。回头看一下上面的竖式除法Q如果被除数?100010Q显然在商第三个1Ӟp除尽?/p> <p align="left">上述推算q程Q有助于我们理解CRC的概c但直接~程来实C面的法Q不仅繁琐,效率也不高。实际上在工E中不会直接q样去计和验证CRC?/p> <p align="left">下表中列Z一些见于标准的CRC资料Q?/p> <table id="table9" align="center" border="1" cellpadding="1" cellspacing="1" width="396"> <tbody> <tr> <td style="font-size: 9pt;" width="58"> <p align="left"> 名称 </p> </td> <td style="font-size: 9pt;" width="136"> <p align="left"> 生成多项?nbsp;</p> </td> <td style="font-size: 9pt;" width="54"> <p align="left"> 记式<sup>*</sup> </p> </td> <td style="font-size: 9pt;" width="120"> <p align="left"> 应用举例 </p> </td> </tr> <tr> <td style="font-size: 9pt;" width="58"> <p align="left"> CRC-4 </p> </td> <td style="font-size: 9pt;" width="136"> <p align="left"> x<sup>4</sup>+x+1 </p> </td> <td style="font-size: 9pt;" width="54"> <p align="left">  </p> </td> <td style="font-size: 9pt;" width="120"> <p align="left"> ITU G.704 </p> </td> </tr> <tr> <td style="font-size: 9pt;" width="58"> <p align="left"> CRC-12 </p> </td> <td style="font-size: 9pt;" width="136"> <p align="left"> x<sup>12</sup>+x<sup>11</sup>+x<sup>3</sup>+x+1 </p> </td> <td style="font-size: 9pt;" width="54"> <p align="left">  </p> </td> <td style="font-size: 9pt;" width="120"> <p align="left">  </p> </td> </tr> <tr> <td style="font-size: 9pt;" width="58"> <p align="left"> CRC-16 </p> </td> <td style="font-size: 9pt;" width="136"> <p align="left"> x<sup>16</sup>+x<sup>12</sup>+x<sup>2</sup>+1 </p> </td> <td style="font-size: 9pt;" width="54"> <p align="left"> 1005 </p> </td> <td style="font-size: 9pt;" width="120"> <p align="left"> IBM SDLC </p> </td> </tr> <tr> <td style="font-size: 9pt;" width="58"> <p align="left"> CRC-ITU<sup>**</sup> </p> </td> <td style="font-size: 9pt;" width="136"> <p align="left"> x<sup>16</sup>+x<sup>12</sup>+x<sup>5</sup>+1 </p> </td> <td style="font-size: 9pt;" width="54"> <p align="left"> 1021 </p> </td> <td style="font-size: 9pt;" width="120"> <p align="left"> ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS </p> </td> </tr> <tr> <td style="font-size: 9pt;" width="58"> <p align="left"> CRC-32 </p> </td> <td style="font-size: 9pt;" width="136"> <p align="left"> x<sup>32</sup>+x<sup>26</sup>+x<sup>23</sup>+...+x<sup>2</sup>+x+1 </p> </td> <td style="font-size: 9pt;" width="54"> <p align="left"> 04C11DB7 </p> </td> <td style="font-size: 9pt;" width="120"> <p align="left"> ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS </p> </td> </tr> <tr> <td style="font-size: 9pt;" width="58"> <p align="left"> CRC-32c </p> </td> <td style="font-size: 9pt;" width="136"> <p align="left"> x<sup>32</sup>+x<sup>28</sup>+x<sup>27</sup>+...+x<sup>8</sup>+x<sup>6</sup>+1 </p> </td> <td style="font-size: 9pt;" width="54"> <p align="left"> 1EDC6F41 </p> </td> <td style="font-size: 9pt;" width="120"> <p align="left"> SCTP </p> </td> </tr> </tbody> </table> <div align="left"> <pre> * 生成多项式的最高幂ơ项pL是固定的1Q故在简记式中,最高的1l一L了,?4C11DB7实际上是104C11DB7?br> ** 前称CRC-CCITT。ITU的前w是CCITT?/pre> </div> </td> </tr> </tbody> </table> </font> <p><br><font size="3" face="宋体">4.CRC法的实?br>---------------<br>要用E序实现CRC法Q考虑对第2节的镉K法做一下变换,依然是M = 11100110QG = 1011Q?br>其系数r??br>                                            <br>             11001100                      11100110000     <br>         -------------                     1011    <br>    1011 )11100110000                      -----------<br>          1011.......                       1010110000    <br>          ----.......                      1010110000<br>           1010......                      1011<br>           1011......        ===>          -----------<br>           ----......                       001110000     <br>              1110...                      1110000<br>              1011...                      1011<br>              ----...                      -----------<br>               1010..                       101000        <br>               1011..                      101000<br>               ----                        1011<br>                  100  <---校验?nbsp;         -----------<br>                                            00100         <br>                                            100           <---校验?br>                                            <br>E序可以如下实现Q?br>    1)Mx^r的前r位放入一个长度ؓr的寄存器Q?br>    2)如果寄存器的首位?Q将寄存器左U??Mx^r剩下部分的MSBUd寄存器的LSB)Q?br>      再与G的后r位异或,否则仅将寄存器左U??Mx^r剩下部分的MSBUd寄存器的LSB)Q?br>    3)重复W?步,直到M全部Mx^rUd寄存器;<br>    4)寄存器中的值则为校验码?nbsp;                                       </font></p> <p><font size="3" face="宋体">用CRC16-CCITT的生成多式0x1021Q其C代码(本文所有代码假定系lؓ32位,且都在VC6?br>~译通过)如下Q?/font></p> <p><font size="3" face="宋体">unsigned short do_crc(unsigned char *message, unsigned int len)<br>{<br>    int i, j;<br>    unsigned short crc_reg;<br>        <br>    crc_reg = (message[0] << 8) + message[1];<br>    for (i = 0; i < len; i++) <br>    {<br>        if (i < len - 2)<br>            for (j = 0; j <= 7; j++) <br>            { <br>                if ((short)crc_reg < 0)<br>                    crc_reg = ((crc_reg << 1) + (message[i + 2] >> (7 - i))) ^ 0x1021;<br>                else <br>                    crc_reg = (crc_reg << 1) + (message[i + 2] >> (7 - i));      <br>            }<br>         else<br>            for (j = 0; j <= 7; j++) <br>            { <br>                if ((short)crc_reg < 0)<br>                    crc_reg = (crc_reg << 1) ^ 0x1021;<br>                else <br>                    crc_reg <<= 1;             <br>            }         <br>    }<br>    return crc_reg;<br>}  </font></p> <p><font size="3" face="宋体">昄Q每ơ内循环的行为取决于寄存器首位。由于异或运满交换率和结合律Q以及与0?br>或无影响Q消息可以不Ud寄存器,而在每次内@环的时候,寄存器首位再与对应的消息?br>异或。改q的代码如下Q?/font></p> <p><font size="3" face="宋体">unsigned short do_crc(unsigned char *message, unsigned int len) <br>{<br>    int i, j;<br>    unsigned short crc_reg = 0;<br>    unsigned short current;<br>        <br>    for (i = 0; i < len; i++) <br>    {<br>        current = message[i] << 8;<br>        for (j = 0; j < 8; j++) <br>        { <br>            if ((short)(crc_reg ^ current) < 0)<br>                crc_reg = (crc_reg << 1) ^ 0x1021;<br>            else <br>                crc_reg <<= 1; <br>            current <<= 1;            <br>        }<br>    }<br>    return crc_reg;<br>} </font></p> <p><font size="3" face="宋体">以上的讨ZQ消息的每个字节都是先传输MSBQCRC16-CCITT标准却是按照先传输LSBQ消?br>右移q寄存器来计的。只需代码改成判断寄存器的LSBQ将0x1021按位颠倒后(0x8408)?br>寄存器异或即可,如下所C:</font></p> <p><font size="3" face="宋体">unsigned short do_crc(unsigned char *message, unsigned int len) <br>{<br>    int i, j;<br>    unsigned short crc_reg = 0;<br>    unsigned short current;<br>        <br>    for (i = 0; i < len; i++) <br>    {<br>        current = message[i];<br>        for (j = 0; j < 8; j++) <br>        { <br>            if ((crc_reg ^ current) & 0x0001)<br>                crc_reg = (crc_reg >> 1) ^ 0x8408;<br>            else <br>                crc_reg >>= 1; <br>            current >>= 1;            <br>        }<br>    }<br>    return crc_reg;<br>}    </font></p> <p><font size="3" face="宋体">该算法用了两层循环Q对消息逐位q行处理Q这h率是很低的。ؓ了提高时间效率,?br>常的思想是以I间换时间。考虑到内循环只与当前的消息字节和crc_reg的低字节有关Q对?br>法做以下等效{换:</font></p> <p><font size="3" face="宋体">unsigned short do_crc(unsigned char *message, unsigned int len) <br>{<br>    int i, j;<br>    unsigned short crc_reg = 0;<br>    unsigned char  index;<br>    unsigned short to_xor;<br>       <br>    for (i = 0; i < len; i++) <br>    {<br>        index = (crc_reg ^ message[i]) & 0xff; <br>        to_xor = index;       <br>        for (j = 0; j < 8; j++) <br>        { <br>            if (to_xor & 0x0001)<br>                to_xor = (to_xor >> 1) ^ 0x8408;<br>            else <br>                to_xor >>= 1;           <br>        }<br>        crc_reg = (crc_reg >> 8) ^ to_xor;<br>    }<br>    return crc_reg;<br>} </font></p> <p><font size="3" face="宋体">现在内@环只与index相关了,可以事先以数lŞ式生成一个表crc16_ccitt_tableQ?br>to_xor = crc16_ccitt_table[index]Q于是可以简化ؓQ?/font></p> <p><font size="3" face="宋体">unsigned short do_crc(unsigned char *message, unsigned int len) <br>{<br>    unsigned short crc_reg = 0; <br>          <br>    while (len--) <br>        crc_reg = (crc_reg >> 8) ^ crc16_ccitt_table[(crc_reg ^ *message++) & 0xff];<br>        <br>    return crc_reg;<br>}   </font></p> <p><font size="3" face="宋体">crc16_ccitt_table通过以下代码生成Q?/font></p> <p><font size="3" face="宋体">int main()<br>{<br>    unsigned char index = 0;<br>    unsigned short to_xor;<br>    int i;</font></p> <p><font size="3" face="宋体">    printf("unsigned short crc16_ccitt_table[256] =\n{");<br>    while (1) <br>    {<br>        if (!(index % 8))<br>            printf("\n");<br>        <br>        to_xor = index;       <br>        for (i = 0; i < 8; i++) <br>        { <br>            if (to_xor & 0x0001)<br>                to_xor = (to_xor >> 1) ^ 0x8408;<br>            else <br>                to_xor >>= 1;           <br>        }            <br>        printf("0x%04x", to_xor);<br>        <br>        if (index == 255)<br>        {<br>            printf("\n");<br>            break;<br>        }<br>        else<br>        {<br>            printf(", ");<br>            index++;<br>        }<br>    }<br>    printf("};");<br>    return 0;<br>}</font></p> <p><font size="3" face="宋体">生成的表如下Q?/font></p> <p><font size="3" face="宋体">unsigned short crc16_ccitt_table[256] =<br>{<br>0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,<br>0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,<br>0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,<br>0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,<br>0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,<br>0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,<br>0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,<br>0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,<br>0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,<br>0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,<br>0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,<br>0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,<br>0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,<br>0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,<br>0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,<br>0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,<br>0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,<br>0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,<br>0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,<br>0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,<br>0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,<br>0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,<br>0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,<br>0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,<br>0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,<br>0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,<br>0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,<br>0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,<br>0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,<br>0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,<br>0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,<br>0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78<br>};</font></p> <p><font size="3" face="宋体">q样对于消息unsigned char message[len]Q校验码为:<br>    unsigned short code = do_crc(message, len);<br>q且按以下方式发送出去:<br>    message[len] = code & 0x00ff;<br>    message[len + 1] = (code >> 8) & 0x00ff; <br>    <br>接收端对收到的len + 2字节执行do_crcQ如果没有差错发生则l果应ؓ0?/font></p> <p><font size="3" face="宋体">在一些传输协议中Q发送端q不指出消息长度Q而是采用l束标志Q考虑以下几种差错Q?br>    1)在消息之前,增加1个或多个0字节Q?br>    2)消息?个或多个q箋?字节开始,丢掉1个或多个0Q?br>    3)在消?包括校验?之后Q增?个或多个0字节Q?<br>    4)消息(包括校验??个或多个q箋?字节l尾Q丢?个或多个0Q?<br>    <br>昄Q这几种差错都检不出来Q其原因是如果寄存器gؓ0Q处?消息字节(或位)Q寄<br>存器g变。ؓ了解军_2个问题,只需寄存器的初值非0卛_Q对do_crc作以下改q:<br> <br>unsigned short do_crc(unsigned short reg_init, unsigned char *message, unsigned int len) <br>{<br>    unsigned short crc_reg = reg_init; <br>          <br>    while (len--) <br>        crc_reg = (crc_reg >> 8) ^ crc16_ccitt_table[(crc_reg ^ *message++) & 0xff];<br>        <br>    return crc_reg;<br>} </font></p> <p><font size="3" face="宋体">在CRC16-CCITT标准中reg_init = 0xffffQؓ了解军_2个问题,在CRC16-CCITT标准中将?br>出的校验码?xffffq行异或Q即Q?br>    unsigned short code = do_crc(0xffff, message, len);<br>    code ^= 0xffff;<br>    message[len] = code & 0x00ff;<br>    message[len + 1] = (code >> 8) & 0x00ff;   <br>    <br>昄Q现在接收端Ҏ到的所有字节执行do_crcQ如果没有差错发生则l果应ؓ某一常?br>GOOD_CRC。其满以下关系Q?br>    unsigned char p[]= {0xff, 0xff}; <br>    GOOD_CRC = do_crc(0, p, 2); <br>其结果ؓGOOD_CRC = 0xf0b8?/font></p><img src ="http://www.shnenglu.com/guojingjia2006/aggbug/121711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guojingjia2006/" target="_blank">果?/a> 2010-07-30 17:34 <a href="http://www.shnenglu.com/guojingjia2006/archive/2010/07/30/121711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c51 串口 理解(?http://www.shnenglu.com/guojingjia2006/archive/2010/07/30/121689.html果?/dc:creator>果?/author>Fri, 30 Jul 2010 05:38:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/07/30/121689.htmlhttp://www.shnenglu.com/guojingjia2006/comments/121689.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/07/30/121689.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/121689.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/121689.html阅读全文

]]>
c51 串口 波特率的计算http://www.shnenglu.com/guojingjia2006/archive/2010/07/30/121688.html果?/dc:creator>果?/author>Fri, 30 Jul 2010 05:32:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/07/30/121688.htmlhttp://www.shnenglu.com/guojingjia2006/comments/121688.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/07/30/121688.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/121688.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/121688.html 波特率计?/td>




在串行通信?收发双方对发送或接收的数据速率要有一定的U定Q我们通过软g对MCS?1串行口编E可U定四种工作方式。其中,方式0和方?的L特率是固定的Q而方?和方?的L特率是可变的Q由定时器T1的溢出率军_?br> 串行口的四种工作方式对应着三种波特率。由于输人的UM旉的来源不同,所以,各种方式的L特率计算公式也不同?
一、方?的L特率
方式0ӞUM旉脉冲?6(即第6个状态周期,W?2个节?l出Q即每个机器周期产生一个移位时钟,发送或接收一位数据。所以,波特率ؓ振荡频率的十二分之一Qƈ不受 PCON寄存器中SMOD的媄响,卻I

方式0的L特率QfoscQ?2




三、方式l和方?的L特率


方式1和方?的移位时钟脉冲由定时器T1的溢出率军_Q故波特宰由定时器T1?br> 溢出率与SMOD值同时决定,卻I
方式1和方?的L特率Q?SMOD/32·T1溢出?br> 其中Q溢出率取决于计数速率和定时器的预|倹{计数速率与TMOD寄存器中CQT的状态有兟뀂当CQTQ?Ӟ计数速率QfoscQ?Q当CQTQ?Ӟ计数速率取决于外部输入时钟频率?br> 当定时器Tl作L特率发生器用时Q通常选用可自动装入初值模?工作方式2)Q在
工作方式2中,TLl作ؓ计数用,而自动装入的初值放在THl中,设计数初gؓxQ则每过“256一x”个机器周期,定时器T1׃产生一ơ溢出。ؓ了避免因溢出而引起中断,此时应禁止T1中断。这Ӟ溢出周期为:



pȝ晶振频率选ؓ11Q?592MHZ是Z使初gؓ整数Q从而生精的波特率?br> 如果串行通信选用很低的L特率Q可定时器Tl|于工作方式0或工作方?Q但?br> q种情况下,T1溢出Ӟ需用中断服务程序重装初倹{中断响应时间和执行指o旉会波特率生一定的误差Q可用改变初值的办法加以调整?br> ??列出了各U常用的波特率及其初倹{?/p>






]]>
键盘扫描之终l者一http://www.shnenglu.com/guojingjia2006/archive/2010/07/29/121585.html果?/dc:creator>果?/author>Thu, 29 Jul 2010 07:42:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/07/29/121585.htmlhttp://www.shnenglu.com/guojingjia2006/comments/121585.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/07/29/121585.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/121585.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/121585.htmlstatic bit isKeyDown(){
    KEY
=0x0f;
    
if((KEY&0x0f)!=0x0f)
        
return 1;
    
else return 0;
}
//U反转法 q回键盘索引
unsigned char KeyScan_XF(){
    unsigned 
char r=0,c=0;
    
if(isKeyDown()){
        delayms(
20); //L?/span>
        if(isKeyDown()){
            KEY
=0x0f;
            
switch(KEY){
                
case 0x0e:c=0;break;   //W一?/span>
                case 0x0d:c=1;break//W二?/span>
                case 0x0b:c=2;break;   //W三?/span>
                case 0x07:c=3;break//W四?/span>
                default:  break;
            }
            KEY
=0xf0;//电^反向
            switch(KEY){
                
case 0xe0:r=0;break;   //W一?/span>
                case 0xd0:r=1;break//W二?/span>
                case 0xb0:r=2;break;   //W三?/span>
                case 0x70:r=3;break//W四?/span>
                default:  break;
            }

            
while(!isKeyDown());//  按键释放Q处理长?/span>
            return  r*4+c+1;
        }
   }
   
return 0;          
}

//查询?nbsp;q回键盘索引
unsigned char getRorC(){
    KEY
&=0x0F;
    KEY
|=0x70;     //0111

    
if((KEY&0x0f)!=0x0f){
        
return 3;
    }

    KEY
&=0x0f;
    KEY
|=0xB0;       //1011
    if((KEY&0x0f)!=0x0f){
        
return 2;
    }

    KEY
&=0x0f;
    KEY
|=0xD0;   //1101
    if((KEY&0x0f)!=0x0f){
        
return 1;
    }

    KEY
&=0x0f;
    KEY
|=0xE0;  //1110
    if((KEY&0x0f)!=0x0f){
        
return 0;
    }
    
return -1;//impossible
}
unsigned 
char KeyScan_CS(){
    unsigned 
char r=0,c=0;
    
if(isKeyDown()){
        delayms(
20); //L?/span>
        if(isKeyDown()){
            
switch(KEY){
                
case 0x0e:c=0;break;//W一?/span>
                case 0x0d:c=1;break;//W二?/span>
                case 0x0b:c=2;break;//W三?/span>
                case 0x07:c=3;break;//W四?/span>
                default:break;
            }
            r
=getRorC();
            
return r*4+c+1;
        }
    }
    KEY
=0x0f;

    
return 0;
}



]]>
c51 外部中断触发l验(?http://www.shnenglu.com/guojingjia2006/archive/2010/07/29/121583.html果?/dc:creator>果?/author>Thu, 29 Jul 2010 07:37:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/07/29/121583.htmlhttp://www.shnenglu.com/guojingjia2006/comments/121583.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/07/29/121583.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/121583.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/121583.html 关于51单片?#8220;外部中断触发方式”的经验ȝ

下面是本Z?1单片机的一点经验,写出来分享,h评指正?br>

51单片机的外部中断有两U触发方式可选:电^触发和边沿触发。选择电^触发Ӟ单片机在每个机器周期查中断源口线Q检到低电qI即置位中断请求标志,?/span>CPUh中断。选择Ҏ触发方式Ӟ单片机在上一个机器周期检到中断源口Uؓ高电qI下一个机器周期检到低电qI即置位中断标志,h中断?/span>

q个原理很好理解。但应用旉要特别注意的几点Q?/font>

1)        电^触发方式Ӟ中断标志寄存器不锁存中断h信号。也是_单片机把每个机器周期?/span>S5P2采样到的外部中断源口U的电^逻辑直接赋值到中断标志寄存器。标志寄存器对于h信号来说是透明的。这样当中断h被阻塞而没有得到及时响应时Q将被丢失。换句话_要电^触发的中断被CPU响应q执行,必须保证外部中断源口U的低电q维持到中断被执行ؓ止?/span>因此?/span>CPU正在执行同中断或更高中断期间Q生的外部中断源(产生低电qI如果在该中断执行完毕之前撤销Q变为高电^Q了Q那么将得不到响应,如同没发生一栗同P?/span>CPU在执行不可被中断的指令(?/span>RETIQ时Q生的电^触发中断如果旉太短Q也得不到执行?/span>

2)        Ҏ触发方式Ӟ中断标志寄存器锁存了中断h。中断口U上一个从高到低的跛_记录在标志寄存器中Q直?/span>CPU响应q{向该中断服务E序Ӟq件自动清除。因此当CPU正在执行同中断Q甚x外部中断本nQ或高中断Ӟ产生的外部中断(负蟩变)同样被记录在中断标志寄存器中。在该中断退出后Q将被响应执行。如果你不希望这P必须在中断退Z前,手工清除外部中断标志?/span>

3)        中断标志可以手工清除。一个中断如果在没有得到响应之前已l被手工清除Q则该中断将?/span>CPU忽略。就如同没有发生一栗?/span>

4)        选择电^触发q是Ҏ触发方式应从pȝ使用外部中断的目?/span>上去考虑Q而不是如许多资料上说的根据中断源信号的特性来取舍。比如,有的书上_?/span>Keil C51使用技巧及实战》)Q就有类似的观点?/span>



]]>
89c51 存储l构http://www.shnenglu.com/guojingjia2006/archive/2010/07/28/121454.html果?/dc:creator>果?/author>Wed, 28 Jul 2010 05:25:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/07/28/121454.htmlhttp://www.shnenglu.com/guojingjia2006/comments/121454.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/07/28/121454.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/121454.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/121454.htmlROM?
Flash ROM,d范围000h-fffh=2^12=4k,存放E序代码
RAM?
00h-1fh,32个字??l工作寄存器Q每l?个字?r0-r7,psw寄存器RS0,RS1 2位控制用哪l?
20h-2fh,16个字节除了一般RAM功能?可以Ҏ个字节进行位d,?0h的第一位到2fh的最后一位,d128?有固定的位地址;
30h-7fh,80个字?普通的RAM?br>80h-ffh,SPR?q21个特D寄存器,每个寄存??br>
d引脚p0,p2,p0?位,p2??/span>


]]>
proteus中英文元件对照表http://www.shnenglu.com/guojingjia2006/archive/2010/07/28/121445.html果?/dc:creator>果?/author>Wed, 28 Jul 2010 03:56:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/07/28/121445.htmlhttp://www.shnenglu.com/guojingjia2006/comments/121445.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/07/28/121445.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/121445.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/121445.html   Proteus isis 的元件库中英对照
[ 2009-12-2 8:29:00 | By: zydlyq ]
 
Proteus 元g名称对照1
元g名称 中文?说明
7407        驱动?nbsp;     
1N914        二极?nbsp;     
74Ls00        与非?nbsp;     
74LS04        非门      
74LS08        与门      
74LS390        TTL 双十q制计数?nbsp;     
7SEG        4针BCD-LED 输出?-9 对应?根线的BCD?
7SEG        3-8译码器电路BCD-7SEG[size=+0]转换电\      
ALTERNATOR 交流发电?nbsp;     
AMMETER-MILLI mA安培?nbsp;     
AND        与门      
BATTERY        甉|/甉|l?nbsp;     
BUS        ȝ      
CAP        电容      
CAPACITOR 电容?nbsp;     
CLOCK        旉信号?nbsp;     
CRYSTAL        晶振      
D-FLIPFLOP D触发?nbsp;     
FUSE        保险?nbsp;     
GROUND        ?nbsp;     
LAMP        ?nbsp;     
LED-RED        U色发光二极?nbsp;     
LM016L        2?6列液?可显C??6列英文字W,?位数据ȝD0-D7QRSQR/WQEN三个控制端口Q共14U)Q工作电压ؓ5V。没背光Q和常用?602B功能和引脚一P除了调背光的二个U脚Q?br>LOGIC ANALYSER 逻辑分析?nbsp;     
LOGICPROBE 逻辑探针      
LOGICPROBE[BIG] 逻辑探针 用来昄q接位置的逻辑状?
LOGICSTATE 逻辑状?用鼠标点?可改变该Ҏq接位置的逻辑状?
LOGICTOGGLE 逻辑触发      
MASTERSWITCH 按钮 手动闭合,立即自动打开
MOTOR        马达      
OR        或门      
POT-LIN        三引U可变电d      
POWER        甉|
RES        电阻      
RESISTOR 电阻?nbsp;     
SWITCH        按钮 手动按一下一个状?
SWITCH-SPDT 二选通一按钮      
VOLTMETER 伏特?nbsp;     
VOLTMETER-MILLI mV伏特?nbsp;     
VTERM        串行口终?nbsp;     
Electromechanical 甉|      
Inductors 变压?nbsp;     
Laplace Primitives 拉普拉斯变换      
Memory Ics         
Microprocessor Ics         
Miscellaneous 各种器g AERIAL-天线QATAHDDQATMEGA64QBATTERYQCELLQCRYSTAL-晶振QFUSEQMETER-仪表Q?
Modelling Primitives 各种仿真器g 是典型的基本元器模拟Q不表示具体型号Q只用于仿真Q没有PCB
Optoelectronics 各种发光器g 发光二极,LEDQ液晶等{?
PLDs & FPGAs         
Resistors 各种电阻      
Simulator Primitives 常用的器?nbsp;     
Speakers & Sounders      
Switches & Relays 开养Il电器,键盘      
Switching Devices 晉?
Transistors 晶体(三极,场效应管Q?br>TTL 74 series         
TTL 74ALS series         
TTL 74AS series         
TTL 74F series         
TTL 74HC series         
TTL 74HCT series         
TTL 74LS series         
TTL 74S series         
Analog Ics 模拟电\集成芯片
Capacitors 电容集合
CMOS 4000 series         
Connectors 排Q排?br>Data Converters ADC,DAC
Debugging Tools 调试工具
ECL 10000 Series
------------------------------------------------------------

PROTEUS元g库元件名U及中英对照
AND 与门
ANTENNA 天线
BATTERY 直流甉|
BELL ??
BVC 同u늼接插?
BRIDEG 1 整流?二极?
BRIDEG 2 整流?集成?
BUFFER ~冲?
BUZZER 蜂鸣?
CAP 电容
CAPACITOR 电容
CAPACITOR POL 有极性电?
CAPVAR 可调电容
CIRCUIT BREAKER 熔断?
COAX 同u늼
CON 插口
CRYSTAL 晶体整荡?
DB q行插口
DIODE 二极?
DIODE SCHOTTKY E_二极?
DIODE VARACTOR 变容二极?
DPY_3-SEG 3DLED
DPY_7-SEG 7DLED
DPY_7-SEG_DP 7DLED(带小数点)
ELECTRO 电解电容
FUSE 熔断?
INDUCTOR 甉|
INDUCTOR IRON 带铁芯电?
INDUCTOR3 可调甉|
JFET N N沟道场效应管
JFET P P沟道场效应管
LAMP 灯
LAMP NEDN 赯?
LED 发光二极?
METER 仪表
MICROPHONE 麦克?
MOSFET MOS?
MOTOR AC 交流甉|
MOTOR SERVO 伺服甉|
NAND 与非?
NOR 或非?
NOT 非门
NPN NPN三极?
NPN-PHOTO 感光三极?
OPAMP q放
OR 或门
PHOTO 感光二极?
PNP 三极?
NPN DAR NPN三极?
PNP DAR PNP三极?
POT 滑线变阻?
PELAY-DPDT 双刀双掷l电?
RES1.2 电阻
RES3.4 可变电阻
RESISTOR BRIDGE ? 桥式电阻
RESPACK ? 电阻
SCR 晉?
PLUG ? 插头
PLUG AC FEMALE 三相交流插头
SOCKET ? 插
SOURCE CURRENT 甉|?
SOURCE VOLTAGE 电压?
SPEAKER 扬声?
SW ? 开?
SW-DPDY ? 双刀双掷开?
SW-SPST ? 单刀单掷开?
SW-PB 按钮
THERMISTOR 늃调节?
TRANS1 变压?
TRANS2 可调变压?
TRIAC ? 三端双向可控?
TRIODE ? 三极真空?
VARISTOR 变阻?
ZENER ? 齐纳二极?
DPY_7-SEG_DP 数码?
SW-PB 开?nbsp;
----------------------------------------------------------------------

      PROTEUS原理囑օ器g库详l说?
Device.lib           包括电阻、电宏V二极管、三极管和PCB的连接器W号
ACTIVE.LIB           包括虚拟仪器和有源器?br>DIODE.LIB          包括二极和整流?br>DISPLAY.LIB       包括LCD、LED
BIPOLAR.LIB       包括三极?br>FET.LIB                 包括场效应管
ASIMMDLS.LIB    包括模拟元器?br>VALVES .LIB           包括电子?br>ANALOG.LIB           包括甉|调节器、运攑֒数据采样IC
CAPACITORS.LIB 包括电容
COMS.LIB             包括   4000pd
ECL.LIB                包括ECL10000pd
MICRO.LIB             包括 通用微处理器
OPAMP.LIB              包括 q算攑֤?br>RESISTORS.LIB    包括 电阻
FAIRCHLD .LIB        包括FAIRCHLD 半导体公司的分立器g
LINTEC.LIB             包括 LINTEC公司的运放大器
NATDAC.LIB          包括 国家半导体公司的数字采样器g
NATOA.LIB             包括 国家半导体公?的运放大器
TECOOR.LIB          包括TECOOR公司?SCR 和TRIAC
TEXOAC.LIB              包括 德州仪器公司的运放大器和比较器
ZETEX .LIB                 包括ZETEX 公司的分立器?


]]>
keil c51 延时(?http://www.shnenglu.com/guojingjia2006/archive/2010/07/28/121439.html果?/dc:creator>果?/author>Wed, 28 Jul 2010 02:58:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/07/28/121439.htmlhttp://www.shnenglu.com/guojingjia2006/comments/121439.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/07/28/121439.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/121439.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/121439.html阅读全文

]]>
51单片Z-跑马?/title><link>http://www.shnenglu.com/guojingjia2006/archive/2010/07/28/121437.html</link><dc:creator>果?/dc:creator><author>果?/author><pubDate>Wed, 28 Jul 2010 02:45:00 GMT</pubDate><guid>http://www.shnenglu.com/guojingjia2006/archive/2010/07/28/121437.html</guid><wfw:comment>http://www.shnenglu.com/guojingjia2006/comments/121437.html</wfw:comment><comments>http://www.shnenglu.com/guojingjia2006/archive/2010/07/28/121437.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guojingjia2006/comments/commentRss/121437.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guojingjia2006/services/trackbacks/121437.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include</span><span style="color: #000000;"><</span><span style="color: #000000;">reg52.h</span><span style="color: #000000;">></span><span style="color: #000000;"> </span><span style="color: #008000;">//</span><span style="color: #008000;">52pd单片机头文g</span><span style="color: #008000;"><br></span><span style="color: #000000;">#include </span><span style="color: #000000;"><</span><span style="color: #000000;">intrins.h</span><span style="color: #000000;">></span><span style="color: #000000;"><br></span><span style="color: #008000;">//</span><span style="color: #008000;">初始?/span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> init(){<br>    </span><span style="color: #008000;">//</span><span style="color: #008000;">中断初始?br>    </span><span style="color: #008000;">//</span><span style="color: #008000;">IE</span><span style="color: #008000;"><br></span><span style="color: #000000;">    EA</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">中断d?/span><span style="color: #008000;"><br></span><span style="color: #000000;">    ET0</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">定时?开?br><br>    </span><span style="color: #008000;">//</span><span style="color: #008000;">TCON</span><span style="color: #008000;"><br></span><span style="color: #000000;">    TF0</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>    TR0</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><br>    </span><span style="color: #008000;">//</span><span style="color: #008000;">TMOD</span><span style="color: #008000;"><br></span><span style="color: #000000;">    TMOD</span><span style="color: #000000;">=</span><span style="color: #000000;">0x01</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">定时?使用,工作方式1<br><br>    </span><span style="color: #008000;">//</span><span style="color: #008000;">初始化预|?/span><span style="color: #008000;"><br></span><span style="color: #000000;">    TH0</span><span style="color: #000000;">=</span><span style="color: #000000;">0x3C</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">预gؓ3c+b0=15536</span><span style="color: #008000;"><br></span><span style="color: #000000;">    TL0</span><span style="color: #000000;">=</span><span style="color: #000000;">0xB0</span><span style="color: #000000;">;<br><br>    </span><span style="color: #008000;">//<br></span><span style="color: #000000;">    P1</span><span style="color: #000000;">=</span><span style="color: #000000;">0x01</span><span style="color: #000000;">;<br>}<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> delay1s(){<br>    #pragma asm<br>    mov    r5,#08h         ;</span><span style="color: #008000;">//</span><span style="color: #008000;">1001.401ms   </span><span style="color: #008000;"><br></span><span style="color: #000000;">    time1s_1:               mov    r6,#0f4h        ;</span><span style="color: #008000;">//</span><span style="color: #008000;">125.173ms   </span><span style="color: #008000;"><br></span><span style="color: #000000;">    time1s_2:               mov    r7,#0ffh        ;</span><span style="color: #008000;">//</span><span style="color: #008000;">511us   </span><span style="color: #008000;"><br></span><span style="color: #000000;">                            djnz   r7,$   <br>                            djnz   r6,time1s_2  <br>                            djnz   r5,time1s_1<br>    #pragma endasm<br>}<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> time0(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">) interrupt </span><span style="color: #000000;">1</span><span style="color: #000000;"> </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> </span><span style="color: #000000;">2</span><span style="color: #000000;">{<br>     delay1s();<br>    #pragma asm<br>    mov a,p1<br>    rl a<br>    mov p1,a<br>    #pragma endasm<br>    <br>}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">){<br>    init();<br>    </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">1</span><span style="color: #000000;">){};<br>}</span></div> 初学单片?C学习路程<br>跑灯闪的旉间隔不是1s<br> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">//</span><span style="color: #008000;">头文件intrins.h介绍</span><span style="color: #008000;"><br></span><span style="color: #000000;">内部函数 描述<br>_crol_ 字符循环左移<br>_cror_ 字符循环右移<br>_irol_ 整数循环左移<br>_iror_ 整数循环右移<br>_lrol_ 长整数@环左U?br>_lror_ 长整数@环右U?br>_nop_ I操?051 NOP 指o<br>_testbit_ 试q清零位8051 JBC 指o </span></div> DSN:<a href="http://www.shnenglu.com/Files/guojingjia2006/keil/main.DSN.rar">http://www.shnenglu.com/Files/guojingjia2006/keil/main.DSN.rar</a><br> <img src ="http://www.shnenglu.com/guojingjia2006/aggbug/121437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guojingjia2006/" target="_blank">果?/a> 2010-07-28 10:45 <a href="http://www.shnenglu.com/guojingjia2006/archive/2010/07/28/121437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Keil~译模式的选择http://www.shnenglu.com/guojingjia2006/archive/2010/07/27/121393.html果?/dc:creator>果?/author>Tue, 27 Jul 2010 06:43:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/07/27/121393.htmlhttp://www.shnenglu.com/guojingjia2006/comments/121393.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/07/27/121393.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/121393.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/121393.html SMALLQ所有变量都被定义在8051单片机的片内RAM中,对这U变量的讉K速度最快。另外,堆栈也必M于片内RAM中,而堆栈的长度是很重要的,实际栈长取决与不同函数的嵌套深度。采用SMALL~译模式与定义变量时指定data存储器类型具有相同效果?br>
COMPACTQ所有变量被定义在分寻址的片外XRAM中,每一늉外XRAM的长度ؓ256字节。这时对变量的访问是通过寄存器间接寻址QMOVX @R0,MOVX @R1Q进行的Q变量的?位地址由R0和R1定Q变量的?位地址由P2口确定。采用这U模式时Q必适当改变配置文gSTARTUP.A51中的? 敎ͼPDATASTART和PDATALENQ同时还必须对uVision2?#8220;Options选项/BL51 Locator 标签?Pdata?#8221;中键入合适的地址参数Q以保P2口能输出所需要的?位地址。采用COMPACT~译模式与定义变量时指定pdata存储器类? h相同效果?br>
LARGEQ所有变量被定义在片外XRAM中(最大可?4KBQ,使用数据指针DPTR来间接访问变量(MOVX @DPTRQ,q种~译模式Ҏ据访问的效率最低,而且增加程序的代码长度。采用LARGE~译模式与定义变量时指定xdata存储器类型具有相同效 果?#8221;
摘自《Keil Cx51 V7.0单片机高U语a~程与uVision2应用实践?img src ="http://www.shnenglu.com/guojingjia2006/aggbug/121393.html" width = "1" height = "1" />

]]>
þþþþùƷ볬| avھƷþþþӰԺ| þùһ| ۺϾþҹAV | þAAAƬ69 | ަvþþ| þþƷһ99| þùֻоƷ| ŷպþþƷһ| ھƷþþþӰԺ| ŷһþ| þþƷһպ| þþþ뾫Ʒ| 69þþƷһ| ŷþһ| AVݺɫۺϾþ | þþþѾƷ | ɫþþ99Ʒ91| þˬ˰| þav| ˾þþƷӰԺ| Ʒþþþһ| þþƷAV| ˾þһ| þþþӰԺŮ| ɫۺϾþĻ| þþĻձ| þþƷ| ɫۺϾþĻ| þþһ | þþƷһAV| ŷþþþþҹƷ| ˾Ʒþ޸岻 ˾Ʒþ޸岻 ˾Ʒþ | ŷղþ99| 㽶þӰԺ| ھƷþþþӰԺ˾ | Ʒ99Ʒþ| ݺɫۺվþþþþþø| þAVĻ| þۺϾþ߾Ʒ| ŷƷþþþþþο|