📄 withpc.c
字号:
// AJ5800通讯程序,请陈峰改造后切入原AJ5808调试
//单片机采用的主频为12MHz,BAUDRATE发生器采用T2的重装方式
//串口中断采用方式1工作,即:一位START,8位数据位DATA,TB8、RB8都不用,一位STOP
//Initial_UART: ;初始化串口
//; Bit: 7 6 5 4 3 2 1 0
//; SCON SM0/FE SM1 SM2 REN TB8 RB8 Tl Rl
//#pragma SRC
//#include <stdio.h>
//#include <REG54.H>
#include <reg52.h>
#define TRUE 1
#define FALSE 0
#define MACHINECOMM_OK 0x11
//以上语句定义主机通讯传送握手信号
#define MACHINECOMM_RET 0x87
//以上语句定义从机回复通讯握手信号
#define MACHINECOMM_DATAHEAD 0xaa
//以上语句定义数据包的头
#define MACHINECOMM_SENDRECORD 0xb1
//定义发送数据的命令
#define MACHINECOMM_DATAEND 0xab
//以上语句定义数据包的尾
#define DELAY_VALUE 3
#define length 3 //数据长度,根据传送的记录修改
bit EvRcv=FALSE; //是否收到串行数据的标志位
bit flag = 0; //
unsigned char rcvdata=0; //从串口存储接收的变量
void send_char(unsigned char word); //发送单字节子程序
void send(char *temp,int j); //发送子程序
void initial(void); //初始化子程序
void delay(short i); //延时子程序
//unsigned char checksum;
unsigned char xdata count=0,datahand;
unsigned char xdata datacomm[3],datarecv[3];
void main(void)
{ //datahand=MACHINECOMM_SENDRECORD;
datacomm[0]=MACHINECOMM_DATAHEAD;
datacomm[1]=MACHINECOMM_SENDRECORD;
datacomm[2]=MACHINECOMM_DATAEND;
initial();
count=0;
flag=0;
while(1)
{
if (flag!=0) //如果取数标志已置位,就将读到的数从串口发出
{
flag= 0; //取数标志清0
if(datarecv[0]==MACHINECOMM_DATAHEAD&&datarecv[length-1]==MACHINECOMM_DATAEND)
{
send_char(datarecv[1]); //如果数据包正确,则返回一个数据包
count=0;
//如果已经收到六个数据,则认为是收到一个数据包
send_char(datarecv[0]); //此处插入实际发送程序即可,循环发送即可
send_char(datarecv[2]);
}
}
if(EvRcv) //如果接收到主机端发送过来的握手信号
{
if(rcvdata==MACHINECOMM_OK)
{ delay(DELAY_VALUE);
EvRcv=FALSE;
// send_char(rcvdata); //返回一个握手信号
}
}
}
}
void initial() //初始化子程序
{
IP=0x10; //定义串口为高优先级中断,依次为T0、T1,这里将PS作为高优先级IP:- - PT2 PS PT1 PX1 PT0 PX0
IE=0x9A; //允许串口、中断T0、T1,作为BAUDRATE发生器应用时,定时器中断应该被禁止IE:EA - ET2 ES ET1 EX1 ET0 EX0
TCON=0x05; //开启T0、T1
// TMOD=0x10; //运用原来的程序设置:GATE C/T M1 M0 GATE C/T M1 M0
// T2MOD=0x; // T2MOD - - - - - - T2OE DCEN
PCON=0; //SMOD(PCON.7)=1时,波特率翻倍.现在不翻
//电源控制寄存器不可位寻址
//SMOD - - - GF1 GF0 PDWN IDLE
SCON=0x50; //串行口工作方式1 : 8位UART, 波特率可变,N0-P
RCAP2H=0xff; //RCAP2H=(65536-CPU_XTAL/32/baudrate) /256;
TH2=0xff;
RCAP2L=0xd9; //RCAP2L=(65536-CPU_XTAL/32/baudrate) %256;
TL2=0xd9;
T2CON=0x34; //使用 T2 作波特率发生器 T2CON:TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2
ES=1; // ;允许串口中断
EA=1; // ;开总中断
}
void send_char(unsigned char word) //送单个字符的程序
{
TI=0;
SBUF=word;
while(TI==0);
TI=0;
}
/*void send(unsigned char *temp, int j) //查询发送
{
int i=0;
EA=0;
for(i=0;i<=j-1;i++) //按发送数据的长度来发送数据
{
ACC=*(temp+i);
// TB8=P;
SBUF=ACC; //发送数据
while(TI==0); //发送数据完毕时,TI会自动置高
TI=0; //发送数据完毕,将TI清零,准备下一次发送
}
EA=1;
}
*/
void Rcv_INT(void) interrupt 4 using 3 //中断接受,串口中断优先级为1
{
if(RI) //如果收到数据则进行下面的操作
{
ACC=SBUF;; //将串行通信的缓存中的数据存入寄存器A
rcvdata=ACC; //将寄存器A中的数据存入变量rcvdata
EvRcv=TRUE; //将已经接收到数据的标志位置高
datarecv[count]=rcvdata;
count++;
if (count ==length)
{
count= 0;
flag= 1; //如果串口接收的数据达到length个,就置位取数标志
}
}
RI=0;
}
//延时子程序
void delay(int i)
{
int j=0;
i=i*DELAY_VALUE;
while (j<i)j++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -