單片機(jī)C51串口中斷接收和發(fā)送測(cè)試
發(fā)布時(shí)間:2008/5/27 0:00:00 訪問(wèn)次數(shù):1576
    
    
    通信協(xié)議: 第1字節(jié),msb為1,為第1字節(jié)標(biāo)志,第2字節(jié),msb為0,為非第一字節(jié)標(biāo)志,其余類(lèi)推……,最后一個(gè)字節(jié)為前幾個(gè)字節(jié)后7位的異或校驗(yàn)和。
    測(cè)試方法:可以將串口調(diào)試助手的發(fā)送框?qū)懮?95 10 20 25,并選上16進(jìn)制發(fā)送,接收框選上16進(jìn)制顯示,如果每發(fā)送一次就接收到95 10
    20 25,說(shuō)明測(cè)試成功。
    //這是一個(gè)單片機(jī)c51串口接收(中斷)和發(fā)送例程,可以用來(lái)測(cè)試51單片機(jī)的中斷接收
    //和查詢發(fā)送,另外我覺(jué)得發(fā)送沒(méi)有必要用中斷,因?yàn)槌绦虻拈_(kāi)銷(xiāo)是一樣的
    #include <reg51.h>
    #include <string.h>
    #define inbuf_len 4 //數(shù)據(jù)長(zhǎng)度
    unsigned char inbuf1[inbuf_len];
    unsigned char checksum,count3;
    bit read_flag= 0 ;
    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;
    }
    //向串口發(fā)送一個(gè)字符
    void send_char_com( unsigned char ch)
    {
    sbuf=ch;
    while (ti== 0 );
    ti= 0 ;
    }
    //向串口發(fā)送一個(gè)字符串,strlen為該字符串長(zhǎng)度
    void send_string_com( unsigned char *str, unsigned int strlen)
    {
    unsigned int k= 0 ;
    do
    {
    send_char_com(*(str + k));
    k++;
    } while (k < strlen);
    }
    
    //串口接收中斷函數(shù)
    void serial () interrupt 4 using 3
    {
    if (ri)
    {
    unsigned char ch;
    ri = 0 ;
    ch=sbuf;
    if (ch> 127 )
    {
    count3= 0 ;
    inbuf1[count3]=ch;
    checksum= ch- 128 ;
    }
    else
    {
    count3++;
    inbuf1[count3]=ch;
    checksum ^= ch;
    if ( (count3==(inbuf_len- 1 )) && (!checksum) )
    {
    read_flag= 1 ; //如果串口接收的數(shù)據(jù)達(dá)到inbuf_len個(gè),且校驗(yàn)沒(méi)錯(cuò),
    //就置位取數(shù)標(biāo)志
    }
    }
    }
    }
    main()
    {
    init_serialcomm(); //初始化串口
    while ( 1 )
    {
    if (read_flag) //如果取數(shù)標(biāo)志已置位,就將讀到的數(shù)從串口發(fā)出
    {
    read_flag= 0 ; //取數(shù)標(biāo)志清0
    send_string_com(inbuf1,inbuf_len
    
    
    通信協(xié)議: 第1字節(jié),msb為1,為第1字節(jié)標(biāo)志,第2字節(jié),msb為0,為非第一字節(jié)標(biāo)志,其余類(lèi)推……,最后一個(gè)字節(jié)為前幾個(gè)字節(jié)后7位的異或校驗(yàn)和。
    測(cè)試方法:可以將串口調(diào)試助手的發(fā)送框?qū)懮?95 10 20 25,并選上16進(jìn)制發(fā)送,接收框選上16進(jìn)制顯示,如果每發(fā)送一次就接收到95 10
    20 25,說(shuō)明測(cè)試成功。
    //這是一個(gè)單片機(jī)c51串口接收(中斷)和發(fā)送例程,可以用來(lái)測(cè)試51單片機(jī)的中斷接收
    //和查詢發(fā)送,另外我覺(jué)得發(fā)送沒(méi)有必要用中斷,因?yàn)槌绦虻拈_(kāi)銷(xiāo)是一樣的
    #include <reg51.h>
    #include <string.h>
    #define inbuf_len 4 //數(shù)據(jù)長(zhǎng)度
    unsigned char inbuf1[inbuf_len];
    unsigned char checksum,count3;
    bit read_flag= 0 ;
    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;
    }
    //向串口發(fā)送一個(gè)字符
    void send_char_com( unsigned char ch)
    {
    sbuf=ch;
    while (ti== 0 );
    ti= 0 ;
    }
    //向串口發(fā)送一個(gè)字符串,strlen為該字符串長(zhǎng)度
    void send_string_com( unsigned char *str, unsigned int strlen)
    {
    unsigned int k= 0 ;
    do
    {
    send_char_com(*(str + k));
    k++;
    } while (k < strlen);
    }
    
    //串口接收中斷函數(shù)
    void serial () interrupt 4 using 3
    {
    if (ri)
    {
    unsigned char ch;
    ri = 0 ;
    ch=sbuf;
    if (ch> 127 )
    {
    count3= 0 ;
    inbuf1[count3]=ch;
    checksum= ch- 128 ;
    }
    else
    {
    count3++;
    inbuf1[count3]=ch;
    checksum ^= ch;
    if ( (count3==(inbuf_len- 1 )) && (!checksum) )
    {
    read_flag= 1 ; //如果串口接收的數(shù)據(jù)達(dá)到inbuf_len個(gè),且校驗(yàn)沒(méi)錯(cuò),
    //就置位取數(shù)標(biāo)志
    }
    }
    }
    }
    main()
    {
    init_serialcomm(); //初始化串口
    while ( 1 )
    {
    if (read_flag) //如果取數(shù)標(biāo)志已置位,就將讀到的數(shù)從串口發(fā)出
    {
    read_flag= 0 ; //取數(shù)標(biāo)志清0
    send_string_com(inbuf1,inbuf_len
熱門(mén)點(diǎn)擊
- 單片機(jī)多字節(jié)BCD碼加法減法
- 單片機(jī)C51串口中斷接收和發(fā)送測(cè)試
- 用單片機(jī)制作通用型電視遙控器
- P89C51RD2的Boot ROM與ISP
- 24C04在2051系統(tǒng)中的使用
- 單片機(jī)系統(tǒng)低功耗設(shè)計(jì)策略
- DVB-C信道解調(diào)解碼芯片GX1001的設(shè)計(jì)
- C51絕對(duì)地址訪問(wèn)
- 大家一起來(lái)學(xué)單片機(jī):LED花樣燈
- 用MCS-51單片機(jī)串行口對(duì)MAX7219及
推薦技術(shù)資料
- CV/CC InnoSwitch3-AQ 開(kāi)
- URF1DxxM-60WR3系
- 1-6W URA24xxN-x
- 閉環(huán)磁通門(mén)信號(hào)調(diào)節(jié)芯片NSDRV401
- SK-RiSC-SOM-H27X-V1.1應(yīng)
- RISC技術(shù)8位微控制器參數(shù)設(shè)
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動(dòng)IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究