📄 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 + -