📄 通信.c
字号:
//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg51.h>
#define KEY P1
sbit DATA=P3^1; //数据线
sbit CLK=P3^2; //时钟线
unsigned char key_buf[8]; //按键缓冲区
unsigned char key_COUNT; //按键计数器
//--------------------------------------------------------------------------------------------------
// 函数名称: delay
// 入口参数: N
// 函数功能:延时子程序,实现(16*N+24)us的延时
// 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动
//--------------------------------------------------------------------------------------------------
void delay(unsigned int N)
{
int i;
for(i=0;i<N;i++);
}
//--------------------------------------------------------------------------------------------------
// 函数名称: CAL_jiaoyan
// 函数功能: 计算校验位
//--------------------------------------------------------------------------------------------------
bit CAL_jiaoyan(unsigned char byte_data)
{
//
}
//--------------------------------------------------------------------------------------------------
// 函数名称: SEND_byte
// 函数功能: 发送一子节数据
//--------------------------------------------------------------------------------------------------
void SEND_byte(unsigned char byte_data)
{
unsigned char i,temp;
if(CLK==0) //时钟线为低
temp=byte_data;
CLK=1;
DATA=0;
delay(0);
CLK=0; //发送起始位
for(i=0;i<8;i++)
{
delay(0);
CLK=1;
DATA=(temp&0x01); //发送数据
byte_data=byte_data>>1;
delay(0);
CLK=0;
}
delay(0);
CLK=1;
DATA=CAL_jiaoyan(byte_data); //发送校验位
delay(0);
CLK=0;
delay(0);
CLK=1;
DATA=1; //发送结束位
delay(0);
CLK=0;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: RECEIVE_byte
// 函数功能: 接收一子节数据
//--------------------------------------------------------------------------------------------------
unsigned char RECEIVE_byte()
{
unsigned char byte_data,i;
CLK=0;
delay(0);
CLK=1; //接收起始位,丢弃
for(i=0;i<8;i++)
{
delay(0);
CLK=0;
delay(0);
CLK=1;
byte_data=byte_data>>1;
if(DATA=1)
byte_data=byte_data|0x80;
else
byte_data=byte_data&0x7F; //接收8位数据
}
for(i=0;i<2;i++)
{
delay(0); //接收校验位和结束位
CLK=0;
delay(0);
CLK=1;
}
return(byte_data);
}
//--------------------------------------------------------------------------------------------------
// 函数名称: manage
// 函数功能: 主机命令处理函数
//--------------------------------------------------------------------------------------------------
void manage(unsigned char rec_data)
{
}
//--------------------------------------------------------------------------------------------------
// 函数名称: SEND_keydata
// 函数功能: 发送按键值到主机
//--------------------------------------------------------------------------------------------------
void SEND_keydata()
{
unsigned char ASCII_code; //
// ASCII_code=judge_key(key_buf[key_COUNT]); //判断键值,按键编码成ASCII码
SEND_byte(ASCII_code);
key_COUNT--;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: 主程序
// 函数功能: 循环查询主机状态
//--------------------------------------------------------------------------------------------------
void main()
{
unsigned char rec_data;
while(1)
{
if(CLK==0&&DATA==0)
{
rec_data=RECEIVE_byte(); //接收主机键盘
manage(rec_data); //指令处理函数
}
if(key_COUNT!=0&&CLK==1) //有按键等待处理
//线路空闲
SEND_keydata();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -