?? serial.c
字號(hào):
#include "Serial.h"
#include "STC89C51RC_RD_PLUS.H"
//串口中斷服務(wù)程序,僅需做簡單調(diào)用即可完成串口輸入輸出的處理
//出入均設(shè)有緩沖區(qū),大小可任意設(shè)置。
//可供使用的函數(shù)名:
//char getbyte(void);從接收緩沖區(qū)取一個(gè)byte,如不想等待則在調(diào)用前檢測inbufsign是否為1。
//*************************************************************************
bit m_bSendEnd = 0;
#define ILEN 30 /* size of serial receiving buffer */
xdata unsigned char inbuf[ILEN];
xdata uchar xdata *inlast=inbuf; //最后由中斷進(jìn)入接收緩沖區(qū)的字節(jié)位置
xdata uchar xdata *getlast=inbuf; //最后取走的字節(jié)位置
bit inbufsign; //接收緩沖區(qū)非空標(biāo)志 有=1
bit inbufful; //輸入緩沖區(qū)滿標(biāo)志 滿=1
//#define StateIO StateIO_3
//#define bSerialRSLed bSerialRSLed_3
//char bdata StateIO _at_ 0x20;
//sbit bSerialRSLed = StateIO^5;
//串口初始化 晶振為11.0592M 方式1 波特率300-57600
void InitCom(uchar BaudRate)
{
uchar THTL;
switch (BaudRate)
{
case 1: THTL = 64; break; //波特率300
case 2: THTL = 160; break; //600
case 3: THTL = 208; break; //1200
case 4: THTL = 232; break; //2400
case 5: THTL = 244; break; //4800
case 6: THTL = 250; break; //9600
case 7: THTL = 253; break; //19200
case 8: THTL = 255; break; //57600
default: THTL = 208;
}
SCON = 0x50; //串口方式1,允許接收
TMOD |= 0x20; //定時(shí)器1定時(shí)方式2
TCON |= 0x40; //設(shè)定時(shí)器1開始計(jì)數(shù)
TH1 = THTL;
TL1 = THTL;
PCON = 0x80; //波特率加倍控制,SMOD位
RI = 0; //清收發(fā)標(biāo)志
TI = 0;
TR1 = 1; //啟動(dòng)定時(shí)器
ES = 1;
}
//串口發(fā)送
void Send(uchar sdata)
{
//bSerialRSLed = 1;
SBUF = sdata;
m_bSendEnd = 1;
while(m_bSendEnd){};
}
bit SerialCheck()
{
return inbufsign;
}
//從接收緩沖區(qū)取一個(gè)byte,如不想等待則在調(diào)用前檢測inbufsign是否為1。
uchar Getbyte (void)
{
char idata c ;
while (!inbufsign); //緩沖區(qū)空等待
ES=0;
c= *getlast; //取數(shù)據(jù)
getlast++; //最后取走的數(shù)據(jù)位置加一
inbufful=0; //輸入緩沖區(qū)的滿標(biāo)志清零
if (getlast==inbuf+ILEN) getlast=inbuf; //地址到頂部回到底部
if (getlast==inlast) inbufsign=0; //地址相等置接收緩沖區(qū)空空標(biāo)志,再取數(shù)前要檢該標(biāo)志
ES=1;
return (c); //取回?cái)?shù)據(jù)
}
//****************************
void putinbuf(uchar c)
{
ES=0;
if(!inbufful)
{
*inlast= c; //放入數(shù)據(jù)
inlast++; //最后放入的位置加一
if (inlast==inbuf+ILEN) inlast=inbuf;//地址到頂部回到底部
if (inlast==getlast) inbufful=1; //接收緩沖區(qū)滿置滿標(biāo)志
inbufsign=1;
}
ES=1;
}
xdata unsigned long IspReset = 0;
//串行中斷程序
void int_s(void) interrupt 4 {
if (TI )
{
TI = m_bSendEnd = 0;
}
if (RI)
{
//bSerialRSLed = 1;
RI = 0;
//---ISP重啟
if(SBUF == 0x12)
{
IspReset = 0;
}
IspReset += SBUF;
if(SBUF == 0x78&&IspReset == 0x114)
{
unsigned long j;
for(j=0;j<60000;j++);for(j=0;j<60000;j++);
ISP_CONTR = 0x60;
}
//-----------------------------------------------
if(!inbufful)
{
*inlast= SBUF; //放入數(shù)據(jù)
inlast++; //最后放入的位置加一
inbufsign=1;
if (inlast==inbuf+ILEN) inlast=inbuf;//地址到頂部回到底部
if (inlast==getlast) inbufful=1; //接收緩沖區(qū)滿置滿標(biāo)志
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -