打印
[51单片机]

各位前辈能不能帮我看看这个时钟程序为啥运行不成功

[复制链接]
808|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
//用单片机设置一个日历时钟,包括年月日时分秒,通过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]++;
                }
        }
}

使用特权

评论回复

相关帖子

沙发
xiao小鱼|  楼主 | 2020-6-2 21:59 | 只看该作者
结果是这样的

20e126f4642fba6c978db749e08f874.png (345.11 KB )

20e126f4642fba6c978db749e08f874.png

使用特权

评论回复
板凳
ayb_ice| | 2020-6-3 09:27 | 只看该作者
感觉好乱,只管往SBUF丢数据,而不管是否发送完成,又往里面丢数据,这样肯定会乱的
协议也乱,或没有处理好,中间数据如果等于'F'的话,协议是乱的

根据代码来分析的话rcvbuf【0】只能等于'F',
下面的代码判断不正确
        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')

使用特权

评论回复
地板
ayb_ice| | 2020-6-3 09:28 | 只看该作者
原来发送的都是ASCIi码这样缓冲区不够长,与你的RTC格式也不一样

使用特权

评论回复
5
xiao小鱼|  楼主 | 2020-6-3 10:28 | 只看该作者
ayb_ice 发表于 2020-6-3 09:28
原来发送的都是ASCIi码这样缓冲区不够长,与你的RTC格式也不一样

前辈,那该如何解决呀,新入手,太晕了

使用特权

评论回复
6
ayb_ice| | 2020-6-3 17:04 | 只看该作者
xiao小鱼 发表于 2020-6-3 10:28
前辈,那该如何解决呀,新入手,太晕了

先把变量名整规范吧

使用特权

评论回复
7
ayb_ice| | 2020-6-3 17:08 | 只看该作者
xiao小鱼 发表于 2020-6-3 10:28
前辈,那该如何解决呀,新入手,太晕了

协议一定要定义清晰,不能有混淆的地方
程序上要做容错处理,用状态机去做,给看个例子吧,只是部分代码

QQ图片20200603170708.png (129.2 KB )

QQ图片20200603170708.png

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝