|
單片機(jī)C語言實例-183-串口接收(1602)
/********************************************************************
* 文件名 : 串口接收試驗.c
* 描述 : 該程序從串口接收數(shù)據(jù),通過LCD顯示數(shù)據(jù)。在LCD的第一行顯示出來,
當(dāng)數(shù)據(jù)過多時(超過16個字符),LCD第一行將會被覆蓋。
該試驗使用的晶振是11.0592,如果使用12M晶振,會出現(xiàn)串口接收
不正常的情況。原因是用12M晶振,波特率9600時的誤差率達(dá) 8%。
* 創(chuàng)建人 : 東流,2009年4月8日
* 版本號 : 2.0
* 技術(shù)支持論壇:www.zidh.com/bbs(請進(jìn)入“贊助商板塊”中的“東流電子工作室”)
* 感謝“中國自動化資訊網(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) //當(dāng)硬件接收到一個數(shù)據(jù)時,RI會置位
{
LED_Buffer[com_dat] = SBUF; //把從串口讀出的數(shù)存到數(shù)組
RI = 0;
com_dat++;
if(com_dat == 16) com_dat = 0; //當(dāng)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; //設(shè)置波特率 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);
}
}
更多詳情參考附件文檔
+08:00C185聯(lián)盟網(wǎng)2429.png (43.73 KB, 下載次數(shù): 25)
下載附件
保存到相冊
2022-2-14 11:26 上傳
|
|