?? c51程序.txt
字號(hào):
//采用異步方式傳送數(shù)據(jù),偶校驗(yàn),一位結(jié)束位,傳輸?shù)臄?shù)據(jù)傳輸速率為9600bit/s。每個(gè)數(shù)據(jù)幀包含10Byte信息,1Byte作為幀起始標(biāo)志,8Byte數(shù)據(jù),1Byte的校驗(yàn)和。
//-----------------------函數(shù)聲明,變量定義--------------------------------------------------------
#include <reg51.h>
#define COUNT 10 // 定義接收緩沖區(qū)大小
unsigned char buffer[COUNT]; //定義接收緩沖區(qū)
unsigned char point; //定義接收數(shù)據(jù)個(gè)數(shù)指示變量
void UART_init(); //串口初始化函數(shù)
void COM_send(void); //串口接收函數(shù)
unsigned char CLU_checkdata(void); //計(jì)算校驗(yàn)位函數(shù)
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱(chēng): UART_init()串口初始化函數(shù)
// 函數(shù)功能: 在系統(tǒng)時(shí)鐘為11.059MHZ時(shí),設(shè)定串口波特率為9600bit/s
// 串口接收中斷允許,發(fā)送中斷禁止
//初始化串行口和波特率發(fā)生器
//--------------------------------------------------------------------------------------------------
void UART_init()
{
SCON =0x58; //選擇串口工作方式,打開(kāi)接收允許
TMOD =0x21; //定時(shí)器1工作在方式2,定時(shí)器0工作在方式1
TH1 =0xfd; //實(shí)現(xiàn)波特率9600(系統(tǒng)時(shí)鐘11.0592MHZ)
TR1 =1; //啟動(dòng)定時(shí)器T1
ET1 =0;
ES=1; //允許串行口中斷
PS=1; //設(shè)計(jì)串行口中斷優(yōu)先級(jí)
EA =1; //單片機(jī)中斷允許
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱(chēng): com_interrup()串口接收中斷處理函數(shù)
// 函數(shù)功能: 接收包括起始位'S'在內(nèi)的十位數(shù)據(jù)到數(shù)據(jù)緩沖區(qū)
//--------------------------------------------------------------------------------------------------
com_interrupt(void) interrupt 4 using 3
{
unsigned char RECEIVR_buffer;
if(RI) //處理接收中斷
{
RI=0; //清除中斷標(biāo)志位
RECEIVR_buffer=SBUF; //接收串口數(shù)據(jù)
if(point==0) //如果還沒(méi)有接收到起始位
{
if(RECEIVR_buffer=='S') //判斷是否起始標(biāo)志位
point++; //是準(zhǔn)備接收下一位
else
point=0; //不是,繼續(xù)等待起始位
}
else if(point>0&&point<10) //判斷是否接收夠十位數(shù)據(jù)
buffer[point++]=RECEIVR_buffer; //不夠,把接收到的數(shù)據(jù)放入接收緩存區(qū)
else point=0; //緩沖區(qū)已滿(mǎn),清除緩存區(qū)內(nèi)數(shù)據(jù)重新接收
}
If(TI) //處理發(fā)送中斷
{
TI=0;
}
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱(chēng): COM_send()串口發(fā)送函數(shù)
// 函數(shù)功能: 把數(shù)據(jù)緩沖區(qū)的十位數(shù)據(jù)發(fā)送出去
//--------------------------------------------------------------------------------------------------
void COM_send(void)
{
for(point=0;point<=10,TI=1;point++) //連續(xù)發(fā)送十位數(shù)據(jù)
{
SBUF=buffer[point]; //把緩存區(qū)的數(shù)據(jù)都發(fā)送到串口
TI=0;
}
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱(chēng): CLU_checkdata()計(jì)算校驗(yàn)位函數(shù)
// 輸入變量: 無(wú)
// 輸出變量: checkdata,包括起始位在內(nèi)的前九位數(shù)據(jù)的校驗(yàn)和
// 函數(shù)功能: 計(jì)算校驗(yàn)和
//--------------------------------------------------------------------------------------------------
unsigned char CLU_checkdata(void)
{ //計(jì)算校驗(yàn)位
unsigned char checkdata=0;
for(point=0;point<9,TI=1;point++)
{
checkdata=checkdata|buffer[point];
}
return(checkdata);
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱(chēng): 主函數(shù)
// 函數(shù)功能: 調(diào)度各子函數(shù),完成通信過(guò)程
//--------------------------------------------------------------------------------------------------
void main(void)
{
unsigned char checkdata;
do
{
UART_init(); //初始化串口
if(point==10) //判斷數(shù)據(jù)是否接收完成
checkdata=CLU_checkdata; //調(diào)用求校驗(yàn)和函數(shù)
if(checkdata==buffer[9]) //判斷校驗(yàn)和是否正確
COM_send(); //正確則調(diào)用發(fā)送程序
point=0;
}
while(1);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -