📄 sfunc.c
字号:
#include<reg51.h>
//#include <intrins.h>
//------------------------------------------
#define true unsigned char 1
#define false unsigned char 0
#define COUNT 10/*DELAY 10*COUNT ms*/
/*----------------------------------------*/
void delayms(unsigned int x);
/*--------全局变量区----------------------*/
bit flag_t=0;
/*----------------------------------------*/
/*serial communicaton initial8*/
void init_s(void)//串口工作时T1不能再用。
{
TMOD=0X20;//定时器T1工作于自动装载模式
TH1=0XE8;//1200BPS
TL1=0XE8;
PCON=0X00; /*SMOD=0;*/
SCON=0X50;/*方式1且允许接收*/
TR1=1;//定时器开始工作
}
/*函数功能:在内存Address处进行长度为n的数据填充,填充数据为i*/
void init_m(char data *Address,unsigned char n,unsigned char j)
{
unsigned char i=0;
//Address=0x30;
for (i=0;i<n;i++)
{
*Address=j;
Address++;
}
}
/*TIMER0 Initial*/
void init_t0(void)
{
TMOD=TMOD|0X21;/*保持TMOD的定时器1的原始设置,又开启T0。*/
TH0=0xdc;/*10MS interrupt delay*/
TL0=0x00;
EA=1;
ET0=0;/*enable it if want to work*!!!!*/
TR0=0;
}
/*----------------------interrupt program----------------------*/
void int_t0(void) interrupt 1
{
static unsigned char n=0;//可能会有重复置零的问题!
TH0=0xdc;/*10MS interrupt delay*/
TL0=0x00;
n+=1;/*not best*/
if (n==COUNT)
{
TR0=0;
ET0=0;
flag_t=1;
n=0;
}
}
//---------------------------------------------------------
/*ack flame*/
bit Ack(void)
{
unsigned char i,j;
while (RI==0);RI=0;/*等待接收,直到有信号(两者之一即可),等不到一个信号则死机??*/
i=SBUF;//要观察I,不要看SBUF.
ET0=1;//---------------!!
TR0=1;
while (RI==0&&flag_t==0);/*接收到信号或时间到10*COUNT ms退出等待*/
//------------------- restore flag
RI=0;
flag_t=0;
ET0=0;
TR0=0;
j=SBUF;//如果J没接收到数据,则会和i的数据一样
//--------------------
if((i==0x63)||(j==0x63))/*ASCII:c*/
return(1);
else
return(0);
}
/*hand to hand function,send 0x54,recieve0x63,if have wrong,重发3次*/
bit hd2hd(void)
{
unsigned char i;
for(i=0;i<3;i++)
{
SBUF=0X54;//SEND T
while(TI==0);TI=0;/*don't set breakpoint here*/
if (Ack()==1) return(1);
}
delayms(100);//????????????????等待1000MS,使计算机有时间反映
return(0);
}
/*函数功能:从Adrress处发送n个数据*/
void Send_Data( char data *Adrress,unsigned char n)
{
unsigned char pf=0;
unsigned char i;
SBUF=0X55;/*起始位55*/
while(TI==0);TI=0;
SBUF=n;/*data lenth*/
while(TI==0);TI=0;
pf=0;
for (i=0;i<n;i++)
{
unsigned char m;///SBUF的值不定!!
SBUF=*Adrress;///发送完才变为当前数
m=*Adrress;
Adrress++;
pf+=m;
while(TI==0);TI=0;
}
SBUF=pf;
while(TI==0);TI=0;
}
void delayms(unsigned int x)//延时1ms*X
{
unsigned char j;
while(x--)
{
for(j=0;j<125;j++)
{;}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -