|
單片機(jī)C語(yǔ)言實(shí)例-183-串口接收(1602)
/********************************************************************
* 文件名 : 串口接收試驗(yàn).c
* 描述 : 該程序從串口接收數(shù)據(jù),通過(guò)LCD顯示數(shù)據(jù)。在LCD的第一行顯示出來(lái),
當(dāng)數(shù)據(jù)過(guò)多時(shí)(超過(guò)16個(gè)字符),LCD第一行將會(huì)被覆蓋。
該試驗(yàn)使用的晶振是11.0592,如果使用12M晶振,會(huì)出現(xiàn)串口接收
不正常的情況。原因是用12M晶振,波特率9600時(shí)的誤差率達(dá) 8%。
* 創(chuàng)建人 : 東流,2009年4月8日
* 版本號(hào) : 2.0
* 技術(shù)支持論壇:www.zidh.com/bbs(請(qǐng)進(jìn)入“贊助商板塊”中的“東流電子工作室”)
* 感謝“中國(guó)自動(dòng)化資訊網(wǎng)”對(duì)本工作室的大力支持。
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*LED_Buffer[16]用來(lái)存儲(chǔ)串口發(fā)送的數(shù)據(jù),com_dat用來(lái)記錄串口發(fā)送的個(gè)數(shù)*/
uchar LED_Buffer[16], *q, com_dat; //從串口接收的數(shù)據(jù)
//這三個(gè)引腳參考資料
sbit E=P2^7; //1602使能引腳
sbit RW=P2^6; //1602讀寫引腳
sbit RS=P2^5; //1602數(shù)據(jù)/命令選擇引腳
/********************************************************************
* 名稱 : Delay(uint del)
* 功能 : 延時(shí)10ms * del
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void Delay(uint del)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++)
;
}
/********************************************************************
* 名稱 : delay()
* 功能 : 延時(shí),延時(shí)時(shí)間大概為140US。
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void delay()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++)
;
}
/********************************************************************
* 名稱 : enable(uchar del)
* 功能 : 1602命令函數(shù)
* 輸入 : 輸入的命令值
* 輸出 : 無(wú)
***********************************************************************/
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ù)
* 輸出 : 無(wú)
***********************************************************************/
void write(uchar del)
{
P0 = del;
RS = 1;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
/********************************************************************
* 名稱 : L1602_init()
* 功能 : 1602初始化,請(qǐng)參考1602的資料
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void L1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}
/********************************************************************
* 名稱 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符顯示"b" ,調(diào)用該函數(shù)如下
L1602_char(1,5,'b')
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無(wú)
***********************************************************************/
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)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開(kāi)始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
L1602_string(1,5,"ab cd ef;")
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無(wú)
***********************************************************************/
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ù)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void Com_Int(void) interrupt 4
{
EA = 0;
if(RI == 1) //當(dāng)硬件接收到一個(gè)數(shù)據(jù)時(shí),RI會(huì)置位
{
LED_Buffer[com_dat] = SBUF; //把從串口讀出的數(shù)存到數(shù)組
RI = 0;
com_dat++;
if(com_dat == 16) com_dat = 0; //當(dāng)com_dat = 16時(shí),清0,防止數(shù)組溢出
}
EA = 1;
}
/********************************************************************
* 名稱 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中斷
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void Com_Init(void)
{
TMOD = 0x20; //定時(shí)器工作在定時(shí)器1的方式2
PCON = 0x00; //不倍頻
SCON = 0x50; //串口工作在方式1,并且啟動(dòng)串行接收
TH1 = 0xFd; //設(shè)置波特率 9600
TL1 = 0xFd;
TR1 = 1; //啟動(dòng)定時(shí)器1
ES = 1; //開(kāi)串口中斷
EA = 1; //開(kāi)總中斷
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數(shù)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
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);
}
}
更多詳情參考附件文檔
+08:00C185聯(lián)盟網(wǎng)2429.png (43.73 KB, 下載次數(shù): 27)
下載附件
保存到相冊(cè)
2022-2-14 11:26 上傳
游客,如果您要查看本帖隱藏內(nèi)容請(qǐng) 回復(fù)
|
|