//用单片机设置一个日历时钟,包括年月日时分秒,通过protues软件,主机发'F' 'S' 20 20 05 28 21 01 01 xx,
从机返回'F' 'S' mm mm mm mm mm mm mm , mm是单片机的当前时间
//但是最后用串口输入数据之后,从机返回的是输入的数据,各位前辈能帮我解决一下吗
#include <REGX51.H>
typedef unsigned char u8;
unsigned int t0cnt;D:\adioun资料\C51
u8 rcvbuf[9],x[7];
u8 rcvposi=0,senposi=0;
bit rcvflag=0;
int i,j,n;
void uartinit(void)//串口初始化
{
//方式1 波特率9600bps 允许接收
SCON=0X50;//0101 0000
PCON&=0X7F;//0111 1111
//T1 方式2 定时器
TMOD&=0X0F;
TMOD|=0X20;// 0010 //GATE C/T M1 M0
TH1=0XFD;
TL1=0XFD;
ET1=0;//定时器中断允许屏蔽
TR1=1;//定时器启动运行
ES=1;
}
void uartisr(void) interrupt 4//串口中断
{
u8 temp;
if(TI==1)
TI=0;
/*if(temp=='F')
senposi=0;
if(temp=='R')
{
SBUF ='F';
SBUF ='S';
for(i=0;i<=6;i++)
{
SBUF =x;
}
}//读取一个数据包*/
if(RI==1){
RI=0;
temp=SBUF;
if(temp=='F')
rcvposi=0;
switch(rcvposi)
{
case 0:rcvbuf[rcvposi]=temp;break;
case 1:rcvbuf[rcvposi]=temp;break;
case 2:rcvbuf[rcvposi]=temp;break;
case 3:rcvbuf[rcvposi]=temp;break;
case 4:rcvbuf[rcvposi]=temp;break;
case 5:rcvbuf[rcvposi]=temp;break;
case 6:rcvbuf[rcvposi]=temp;break;
case 7:rcvbuf[rcvposi]=temp;break;
default:rcvbuf[rcvposi]=temp;rcvflag=1;break;
}
rcvposi++;
}//读取一个数据包
}
void timer0init(void)//定时器初始化
{
t0cnt=0;
//TMOD T1 GATE C/T M1 M0 T1 0001
TMOD &=0xF0;
TMOD |=0x01;
//N=16
TH0=(65536-(10000/2))/256;
TL0=(65536-(10000/2))%256;
//5ms???
PT0=1;//T0中断优先
ET0=1;//T0中断允许
EA=1;//总中断允许
TR0=1;//T0允许运行
}
void timer0isr(void) interrupt 1//定时器中断
{
TR0=0;
TH0=(65536-(10000/2))/256;
TL0=(65536-(10000/2))%256;
TR0=1;
t0cnt++;
if(t0cnt>=200)
{
//200 5ms 1000ms=1s
x[7]++;
t0cnt=0;
}
}
void main(void)
{
uartinit();
//EA=1;
timer0init();
while(1)
{
if(rcvflag==1)
{
rcvposi=0;
rcvflag=0;
}
if(rcvbuf[0]=='S')
{
for(j=1;j<=7;j++)
{
x=rcvbuf;
}
}
else if(rcvbuf[0]=='R')
{
SBUF='F';
SBUF='R';
for(n=1;n<=7;n++)
{
SBUF=x[n];
}
SBUF=(84+x[1]+x[2]+x[3]+x[4]+x[5]+x[6]+x[7])&255;
}
if(x[7]>=60)
{
x[7]=0;
x[6]++;
}
if(x[6]>=60)
{
x[6]=0;
x[5]++;
}
if(x[5]>=24)
{
x[5]=0;
x[4]++;
}
if(x[3]==1|3|5|7|8|10|12)
{
if(x[4]>=31)
{
x[4]=0;
x[3]++;
}
}
else if(x[3]==4|6|9|11)
{
if(x[4]>=30)
{
x[4]=0;
x[3]++;
}
}
else
{
if(x[4]>=28)
{
x[4]=0;
x[3]++;
}
}
if(x[3]>=12)
{
x[3]=0;
x[2]++;
}
if(x[2]>=100)
{
x[2]=0;
x[1]++;
}
}
} |