?? ccu.c
字號:
//ccu定時中斷和A捕獲中斷
#include <REG932.H>
#include "ccu2.h"
/*
void ccu_int(void) interrupt 11
{ char t2;
t2=TISE2&0x07;
if(t2==7)
{ TIFR2&=0x7f;
time1++;
}
if(t2==6)
{TIFR2=0;}
TIFR2=0;
}
*/
//----------------------------------
//功能:CCU初始化程序
//----------------------------------
void CCU_init()
{
TPCR2H=0x00;//預分頻為0 //CCU定時器5分頻
TPCR2L=0x00;
TOR2H=0x0C;//PDSH;//設置定時器重裝值
TOR2L=0x00;//PDSL;
TH2=12;//PDSH;//0x0c;
TL2=0;//PDSL;//0;
CCCRA=0x08; //設置捕獲模式,上升沿捕獲,捕獲延遲0.
//TIFR2=0;//CCU中斷標志
//TISE2 //當前中斷最高優先號
// TICR2=0x81; //使能輸入捕獲通道A.
// TCR20=0x05; //設置CCU基本定時器功能,遞-計數
// ECCU=1; //CCU中斷使能。
// EA=1;
//TCR21|=0x80;
}
//************************
//功能:啟動發送
//*****************************
void TX1200(char* pp,char n,char m)//發送開始處理
{
Rend=0;
//if(!Rend)//正在接收退出
{ EA=0;
if(m==12)w1200=1;
else w1200=0;
TX_number=n;//發送字節數
TX96out=On; //發送端口置高電平
TX12out=On;
ptr_T=pp; //發送指針地址指向發送字串
hs=*ptr_T; //第一個數據送達數據移位單元
//TR_ing=On;//收發標志置位
Tend =1; //發送結束時標志=0
//rede1= On; //接收指示燈
TOR2H=0x0C;//PDSH;//設置定時器重裝值
TOR2L=0x00;//PDSL;
TH2=12;//PDSH;//0x0c;//1200bps
TL2=0;//PDSL;//0; 改變定時時間
CCU_SET();//啟動發送
EA=1;
}
}
//*********************
//功能:啟動接收
//*********************
void RX1200(char* p,char n,char m)
{ while(Tend);
//if(!Tend)
{ EA=0;
if(m==12)w1200=1;
else w1200=0;
RX_ok=0;
RX_number=n;
ptr_R=p;//定義接收指針
Rend= 1;//允許接收
RX_START = 0;//接收進行中標志=1
rede1=Off; //接收指示燈
TOR2H=0x0C;//PDSH;//設置定時器重裝值
TOR2L=0x00;//PDSL;
TH2=0x0c;//PDSH;//1200bps
TL2=0;// PDSL; 改變定時時間
CCU_SET();
TIFR2=0;
TICR2=0x82;//0x81;//使能定時中斷,和接收電平同步中斷.
EA=1;
Tov=0;//接收超時
}
}
//****************************
//啟動發送中斷,定時
//*************************
void CCU_SET(void)
{
//TICR2=0;
//TCR21=0;
TICR2=0x80; //使能定時中斷,禁止其他中斷.
TCR20=0x05; //設置定時器開,遞減
ECCU=1; //CCU中斷使能。
TCR21|=0x80;//定時器自動更新
}
//----------------------------------
//功能:CCU定時T中斷服務和電平中斷服務程序,完成串行通信
//----------------------------------
void CCU_isr() interrupt 11
{ // bit b1;
//uchar Rdata;
EA=0;
Temp=TISE2&0x07;
TIFR2&=0x7f;//清除定時中斷標志
if(w1200)sf2();
else
if(Temp==7)// T中斷***********************
{
if(Tend) //發送中 111111111111111111111
{
if (--Tb)//位計數器 先減后判斷
{ if(Tb==9)//第一位為啟動位9
{ nop;nop;nop;//采樣時間平衡
if(!GPRS)TX96out=0;else GPRS0ut=0;
}
else//8個數據位 87654321
{ if(!GPRS)TX96out=(bit)(hs&0x01) ;//最低位到發送口
else GPRS0ut=(bit)(hs&0x01) ;
hs=hs>>1;//移出下一位
}
}//位計數器 先減后判斷
else //停止位(Tb==0)
{ nop;nop;
Tb=10;//位數
nop;nop;
if(!GPRS)TX96out=1;//發停止位1
else GPRS0ut=1;
if(--TX_number!=0)//還有字嗎
{ ptr_T++;
hs=*ptr_T ;//取得下一字節
}
else
{ //TX_ok=1;
Tend=0; //發完標志
TICR2=0x0; //使能禁止ccu其他中斷.
TCR20=0x0; //設置定時器關
ECCU=0; //CCU中斷禁止。
}
}//Tb==0
}//發送中 11111111111111111111111111
else
if (Rend)//接收8888888888888888888
{
if(r_start)//收到啟動位
{
if(--Rb1)
{ hs>>=1;hs_7=RX96in;}
else
if(!RX96in)//未收到停止位
{ Rb1=9;
r_start=0;
TH2=PDSH*20;//2*20;//0x2c;//新字節時間拉長,等待啟動位。重新定時器
TL2=PDSL;//0; //臨時改變定時時間
TICR2=0x81;//使能下降沿中斷,和超時中斷,禁止其他中斷.
TCR20=0x05; //設置定時器開,遞減
ECCU=1; //CCU中斷使能
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -