電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 2045|回復: 1
收起左側(cè)

單片機C語言實例-183-串口接收(1602)

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-2-14 11:27:13 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機C語言實例-183-串口接收(1602)

/********************************************************************
* 文件名  : 串口接收試驗.c
* 描述    :  該程序從串口接收數(shù)據(jù),通過LCD顯示數(shù)據(jù)。在LCD的第一行顯示出來,
                         當數(shù)據(jù)過多時(超過16個字符),LCD第一行將會被覆蓋。
                         該試驗使用的晶振是11.0592,如果使用12M晶振,會出現(xiàn)串口接收
                         不正常的情況。原因是用12M晶振,波特率9600時的誤差率達 8%。                         
* 創(chuàng)建人  : 東流,2009年4月8日
* 版本號  : 2.0
* 技術(shù)支持論壇:www.zidh.com/bbs(請進入“贊助商板塊”中的“東流電子工作室”)
* 感謝“中國自動化資訊網(wǎng)”對本工作室的大力支持。
***********************************************************************/
#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int

/*LED_Buffer[16]用來存儲串口發(fā)送的數(shù)據(jù),com_dat用來記錄串口發(fā)送的個數(shù)*/
uchar LED_Buffer[16], *q, com_dat;      //從串口接收的數(shù)據(jù)

//這三個引腳參考資料
sbit E=P2^7;                //1602使能引腳
sbit RW=P2^6;                //1602讀寫引腳       
sbit RS=P2^5;                //1602數(shù)據(jù)/命令選擇引腳

/********************************************************************
* 名稱 : Delay(uint del)
* 功能 : 延時10ms * del
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Delay(uint del)
{
        uint i,j;
        for(i=0; i<del; i++)
        for(j=0; j<1827; j++)   
        ;
}

/********************************************************************
* 名稱 : delay()
* 功能 : 延時,延時時間大概為140US。
* 輸入 : 無
* 輸出 : 無
***********************************************************************/

void delay()
{
        int i,j;
        for(i=0; i<=10; i++)
        for(j=0; j<=2; j++)
;
}

/********************************************************************
* 名稱 : enable(uchar del)
* 功能 : 1602命令函數(shù)
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/

void enable(uchar del)
{
        P0 = del;
        RS = 0;
        RW = 0;
        E = 0;
        delay();
        E = 1;
        delay();
}

/********************************************************************
* 名稱 : write(uchar del)
* 功能 : 1602寫數(shù)據(jù)函數(shù)
* 輸入 : 需要寫入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/

void write(uchar del)
{
        P0 = del;
        RS = 1;
        RW = 0;
        E = 0;
        delay();
        E = 1;
        delay();
}

/********************************************************************
* 名稱 : L1602_init()
* 功能 : 1602初始化,請參考1602的資料
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void L1602_init(void)
{
        enable(0x01);
        enable(0x38);
        enable(0x0c);
        enable(0x06);
        enable(0xd0);
}

/********************************************************************
* 名稱 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符顯示"b" ,調(diào)用該函數(shù)如下
                 L1602_char(1,5,'b')
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
        uchar a;
        if(hang == 1) a = 0x80;
        if(hang == 2) a = 0xc0;
        a = a + lie - 1;
        enable(a);
        write(sign);
}

/********************************************************************
* 名稱 : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
                  L1602_string(1,5,"ab cd ef;")
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
        uchar a;
        if(hang == 1) a = 0x80;
        if(hang == 2) a = 0xc0;
        a = a + lie - 1;
        enable(a);
        while(1)
        {
                if(*p == '\0') break;
                write(*p);
                p++;
        }
}

/********************************************************************
* 名稱 : Com_Int()
* 功能 : 串口中斷子函數(shù)
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Com_Int(void) interrupt 4
{
        EA = 0;
        if(RI == 1)   //當硬件接收到一個數(shù)據(jù)時,RI會置位
        {
                LED_Buffer[com_dat] = SBUF;                 //把從串口讀出的數(shù)存到數(shù)組
                RI = 0;
                com_dat++;
                if(com_dat == 16) com_dat = 0;                //當com_dat = 16時,清0,防止數(shù)組溢出
        }
        EA = 1;
}

/********************************************************************
* 名稱 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中斷
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Com_Init(void)
{
     TMOD = 0x20;   //定時器工作在定時器1的方式2
     PCON = 0x00;   //不倍頻
     SCON = 0x50;        //串口工作在方式1,并且啟動串行接收       
     TH1 = 0xFd;    //設置波特率 9600
     TL1 = 0xFd;
     TR1 = 1;                //啟動定時器1
         ES = 1;                //開串口中斷
         EA = 1;                //開總中斷               
}

/********************************************************************
* 名稱 : Main()
* 功能 : 主函數(shù)
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Main()
{
        uchar i = 0, com_dat = 0;       
        L1602_init();
        Delay(100);
        Com_Init();
        P2 = 0x00;
        while(1)
        {
                q = LED_Buffer;       
                L1602_string(1,1,q);
                com_dat = 0;       
                Delay(100);
        }
}


更多詳情參考附件文檔

游客,如果您要查看本帖隱藏內(nèi)容請回復


回復

使用道具 舉報

0

主題

2

帖子

8

積分

一級會員

Rank: 1

積分
8
沙發(fā)
發(fā)表于 2022-2-20 18:04:07 | 只看該作者
1000 0100 0010
回復 支持 反對

使用道具 舉報

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關注微信 下載APP 返回頂部 返回列表