📄 ttx.h
字号:
#include <iom32.h>
//清0和置1
#define set_0 0x01
#define set_1 0x02
#define set_2 0x04
#define set_3 0x08
#define set_4 0x10
#define set_5 0x20
#define set_6 0x40
#define set_7 0x80
#define clr_0 0xfe
#define clr_1 0xfd
#define clr_2 0xfb
#define clr_3 0xf7
#define clr_4 0xef
#define clr_5 0xdf
#define clr_6 0xbf
#define clr_7 0x7f
#define set_8 0X100
#define clr_8 0XFEFF
#define set_9 0X200
#define clr_9 0XFDFF
#define set_10 0X400
#define clr_10 0XFBFF
#define set_11 0X800
#define clr_11 0XF7FF
#define set_12 0X1000
#define clr_12 0XEFFF
#define set_13 0X2000
#define clr_13 0XDFFF
#define set_14 0X4000
#define clr_14 0XBFFF
#define set_15 0X8000
#define clr_15 0X7FFF
//通讯状态
#define ckx 0 //空闲
#define cfsygsj 1 //发送一个数据
#define cjsygsj 2 //接收一个数据
#define cfsyzsj 3 //发送一组数据
#define cjsyzsj 4 //接收一组数据
//数据状态
#define csjkx 0 //数据空闲
#define cdtcjkx 1 //等待从机接收
#define cdtzjkx 2 //等待主机接收
#define cqssj 0xa5 //起始数据
#define cjssj 0xaa //结束数据
#define ctxwxysj 250 //通讯无响应时间
class Ttx
{
public:
Ttx(void); //构造函数
void hstx(void); //公有函数通讯
public:
unsigned char qztxkzt; //公有变量通讯状态
unsigned char qztxfshcq[128]; //公有变量通讯发送缓冲区
unsigned char qztxjshcq[128]; //公有变量通讯接收缓冲区
unsigned char qzfswz; //公有变量发送位置
unsigned char qzjswz; //公有变量接收位置
private:
unsigned char qzfsjscf; //私有重复发送接收一个字节
unsigned char qztxwxysj; //私有通讯无响应时间
unsigned char qzsjzt; //数据状态
unsigned char qzyxy; //已响应
private:
void hsfswsjcl(void); //私有函数发送完数据处理
void hsjswsjcl(void); //私有函数接收完数据处理
void hscjjs(unsigned char *fhsj); //私有函数从机接收
void hszjfs(unsigned char *fhsj); //私有函数主机发送
};
//通讯状态
#define ckx 0 //空闲
#define cfs 1 //发送
#define cjs 2 //接收
#define cqssj 0xa5 //起始数据
#define cjssj 0xaa //结束数据
//数据状态
#define csjkx 0 //数据空闲
#define cdtjsxy 1 //等待接收响应
#define cdtjsyxy 2 //等待接收已响应
#define ctxwxysj 250 //通讯无响应时间
//
#define tx_datai PIND
#define tx_datao PORTD
#define tx_DDRI DDRD = 0X00
#define tx_DDRO DDRD = 0XFF
#define tx_ai DDRC&=clr_6
#define qs_tx_a (PINC&set_6)
#define tx_al PORTC |= set_6
#define tx_bo DDRC|=set_7
#define clr_tx_b PORTC &= clr_7
#define set_tx_b PORTC |= set_7
#define tx_bl PORTC |= set_7
Ttx::Ttx(void) //构造函数
{
tx_DDRI; //数据口输入
tx_al;
tx_bl; //AB口上拉
tx_ai; //AI
tx_bo; //BO
qzfsjscf = 0; //私有重复发送接收一个字节
qzfswz = 0; //发送位置
qzjswz = 0; //接收位置
qztxkzt = 0; //通讯状态
qztxfshcq[0] = 0xa5; //通讯发送缓冲区
qztxfshcq[3] = 0xaa;
qztxjshcq[0] = 0; //通讯接收缓冲区
qzsjzt = csjkx; //数据状态空闲
qztxwxysj = ctxwxysj; //私有通讯无响应时间
qzyxy = 0; //已响应
}
void Ttx::hstx(void) //公有函数通讯
{
unsigned char txfhywsj; //有无数据
if(qztxwxysj == 0) //通讯无响应时间
{
qztxkzt = ckx; //空闲
qzsjzt = csjkx; //数据状态空闲
qzyxy = 0; //已响应
}
else
{
if(uc_t2msyd != 0)
{
//--qztxwxysj; //通讯无响应时间
}
}
switch(qztxkzt) //通讯状态
{
case ckx: //空闲
{
qzfsjscf = 0; //重复发送接收一个字节
qzfswz = 0; //发送位置
qzjswz = 0; //接收位置
qzyxy = 0; //已响应
hscjjs(&txfhywsj); //从机接收
if(qzsjzt == csjkx) //数据状态空闲
{
if(qztxfshcq[qzfswz] == cqssj) //有发送起始数据
{
hszjfs(&qztxfshcq[qzfswz]); //私有函数主机发送
qztxkzt = cfsygsj; //发送一个数据
}
}
else
{
qztxkzt = cjsygsj; //接收一个数据
}
}
break;
case cfsygsj: //发送一个数据
{
if((qzsjzt == csjkx)&&(qzyxy != 0)) //数据状态空闲,已发送一个数据//已响应
{
qzyxy = 0; //已响应
if(qzfsjscf != 0) //重复发送接收一个字节
{
qzfsjscf = 0; //重复发送接收一个字节
qztxkzt = cfsyzsj; //发送一组数据
}
else
{
qzfsjscf = 1; //重复发送接收一个字节
hszjfs(&qztxfshcq[qzfswz]); //私有函数主机发送
}
}
else
{
hszjfs(&qztxfshcq[qzfswz]); //私有函数主机发送
}
}
break;
case cjsygsj: //接收一个数据
{
hscjjs(&txfhywsj); //从机接收
if((qzsjzt == csjkx)&&(qzyxy != 0)) //数据状态空闲,已接收一个数据//已响应
{
qzyxy = 0; //已响应
if(qzfsjscf != 0) //重复发送接收一个字节
{
qzfsjscf = 0; //重复发送接收一个字节
if(qztxjshcq[qzjswz] == txfhywsj) //保存数据
{
qztxkzt = cjsyzsj; //接收一组数据
}
else
{
qztxkzt = ckx; //空闲
}
}
else
{
qzfsjscf = 1; //重复发送接收一个字节
qztxjshcq[qzjswz] = txfhywsj; //保存数据
}
}
}
break;
case cfsyzsj: //发送一组数据
{
qzyxy = 0; //已响应
if(qzfswz <127) //发送位置
{
++qzfswz; //发送位置
if(qztxfshcq[qzfswz] != cjssj) //结束数据
{
hszjfs(&qztxfshcq[qzfswz]); //私有函数主机发送
qztxkzt = cfsygsj; //发送一个数据
}
else
{
hsfswsjcl(); //私有函数发送完数据处理
}
}
else
{
qztxkzt = ckx; //空闲
}
}
break;
case cjsyzsj: //接收一组数据
{
qzyxy = 0; //已响应
if(qzjswz <127) //接收位置
{
if(qztxjshcq[0] == cqssj) //接收起始数据
{
if(qztxjshcq[qzjswz] == cjssj) //结束数据
{
++qzjswz; //接收位置
qztxkzt = cjsygsj; //接收一个数据
hscjjs(&txfhywsj); //从机接收
}
else
{
hsjswsjcl(); //私有函数接收完数据处理
}
}
else
{
qztxkzt = ckx; //空闲
}
}
else
{
qztxkzt = ckx; //空闲
}
}
break;
}
}
void Ttx::hsfswsjcl(void) //私有函数发送完数据处理
{
}
void Ttx::hsjswsjcl(void) //私有函数接收完数据处理
{
}
/*查讯方式时,A,B可以都是普通IO口,中断方式时,主机A和从机B都要是下降延中断口
协议:通讯线,A,B,DATA ,
主机:A,主机发送信号线,B主机接收信号线。
从机:A,从机接收信号线,B从机发送信号线。
空闲:A,B,都为高电平
主机发送数据:送DATA,A,置低等待,B变低,A,置高,等待B变高,重复送DATA。
从机接收数据:检测到A变低,读DATA数据,B,置低,等待A变高,B,置高,
传送值:*fhsj接收数据的返回数据
返回值:ywsj有无数据,0无数据,1有数据,2错误
*/
void Ttx::hscjjs(unsigned char *fhsj) //私有函数从机接收
{
tx_DDRI; //数据口输入
tx_al; //AB口上拉
tx_ai; //AI
tx_bo; //BO
if(qzsjzt == csjkx) //数据状态空闲
{
set_tx_b;
if(qs_tx_a == 0) //有主机信号
{
*fhsj = tx_datai;
clr_tx_b; //置已收到主机数据标志
qztxwxysj = ctxwxysj; //通讯无响应时间
qzsjzt = cdtjsxy; //数据状态等待接收响应
qzyxy = 1; //已响应
}
}
else
{
if(qs_tx_a != 0) //主机已响应
{
set_tx_b; //置已收到主机响应标志
qztxwxysj = ctxwxysj; //通讯无响应时间
qzsjzt = csjkx; //数据状态空闲
}
}
}
/*查讯方式时,A,B可以都是普通IO口,中断方式时,主机A和从机B都要是下降延中断口
协议:通讯线,A,B,DATA ,
主机:A,主机发送信号线,B主机接收信号线。
从机:A,从机接收信号线,B从机发送信号线。
空闲:A,B,都为高电平
主机发送数据:送DATA,A,置低等待,B变低,A,置高,等待B变高,重复送DATA。
从机接收数据:检测到A变低,读DATA数据,B,置低,等待A变高,B,置高,
传送值:*fhsj接收数据的返回数据
返回值:ywsj有无数据,0无数据,1有数据,2错误
*/
void Ttx::hszjfs(unsigned char *fhsj) //私有函数主机发送
{
tx_DDRO; //数据口输出
tx_al; //AB口上拉
tx_ai; //AI
tx_bo; //BO
if(qzsjzt == csjkx) //数据状态空闲
{
if(qs_tx_a != 0) //从机已空闲
{
tx_datao = *fhsj; //输出数据
clr_tx_b; //置从机接收
qzsjzt = cdtjsxy; //数据状态等待接收响应
qzyxy = 1; //已响应
}
}
else
{
if(qzsjzt == cdtjsxy) //数据状态等待接收响应
{
if(qs_tx_a == 0) //从机已接收
{
set_tx_b; //置从机接收
qzsjzt = cdtjsyxy; //等待接收已响应
}
}
else
{
if(qs_tx_a != 0) //从机已接收
{
qzsjzt = csjkx; //数据状态空闲
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -