打印
[PIC®/AVR®/dsPIC®产品]

求大神帮我看看程序存在的错误

[复制链接]
788|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luotian199168|  楼主 | 2015-8-26 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
COM, mb, TE, rc, AN
1,串口通信数据接收不了
2,主函数中给LED变量赋值为0, 其他地方也改变过,但仿真时这个引脚输出为高电平
3,通信是按照$IIRSA,003.2(","后为数值),A,,V*+两位校验码+换行+回车 , 一共二十个字符
新手,刚接触,恳请大神们不吝赐教啊!

#include "pic.h"  //PIC16F628A

__CONFIG(0x2138);    //0011 1111 0011 1000  选择内部系统时钟、关看门狗、上电延时、RAM及ROM代码保护关

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

//串口通信相关变量定义

uchar comrxdread=0;                                //串口接收读指针
uchar comtxdread=0;                                //串口发送读指针
uchar comrxdwrite=0;                                //串口接收写指针
uchar comtxdwrite=0;                                 //串口发送写指针
uchar comtxdbufempty=1;                        //串口的发送缓冲区空的标志
uchar comrxdtimeout=0;                         //串口接收超时

#define com_rxd_buffer_size 40                         //接收缓冲区长度
#define com_txd_buffer_size 40                        //发送缓冲区长度

uchar comrxdbuf[com_rxd_buffer_size];  //串口的接收缓冲区
uchar comtxdbuf[com_txd_buffer_size];  //串口的发送缓冲区

uchar combuf[com_rxd_buffer_size];

uchar send_timeout_count;                                //发送超时计数器
#define SEND_TIMEOUT                100                        //发送定时:10*5ms
uchar sendtimeout;

#define COM_TIMEOUT                        25                        //串口接收超时

int angle_result=0,angle_result_old;


#define ANGLE_BUF_SIZE 8

uchar qian,bai,shi,ge;


//数码管显示变量定义
#define display_dat RA2
#define display_clk RA3
#define display_cs RA6
#define LED RA7
#define LED1 RA1          //用于发送
#define LED2 RA0

#define send_enable LED1=1;
#define send_disable LED1=0;

uchar display_count;
const uchar TABLE[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳

/*void DELAY()                               //延时程序
{
        int i;                                 //定义整形变量
        for (i=1000;i--;);             //延时
}*/


void init()
{              
    CMCON=0X07;             //00000111B  关闭两个比较器
        VRCON=0X00;
        TRISA=0X20;                //设置RA0-RA8为输出
        TRISB=0X0B;           //设置B口全为输出
        LED1 = 0;
//        LED2 = 1;

}


//*****************************************************************
//函数:timer1_init( )
//功能:定时器1初始化
//*****************************************************************
void  timer1_init()                        //4M的晶体   T=(65536-初值)*(4/f)
{       
        TMR1ON=0;   
        TMR1H=0xFC;                                //定时1ms
    TMR1L=0x18;
        TMR1IF=0;                                //清除TMR0的中断标志
        TMR1IE=1;                                //TMR1中断允许
        TMR1CS=0;                                //TMR1工作于定时器方式
        TMR1ON=1;
}

void uart_init()
{
        SPBRG=0X33;                                //设置波特率为4800BPS
        TXSTA=0X24;                                //使能串口发送,选择高速波特率 8位 异步 使能发送
        RCSTA=0X90;                                //使能串口工作,连续接收 8位
        RCIE=0X1;                                //使能接收中断
        TXIE=0X1;                                //使能发送中断
        GIE=0X1;                                //开放全局中断
        PEIE=0X1;                                //使能外部中断
        comtxdbufempty=1;
}


//****************************************************************
//函数:sendbyte_595()、light()
//功能:数码管显示
//*****************************************************************
void sendbyte_595(uchar data)
{
        uchar i;
        for(i=0; i<8; i++)
        {
                if(data & 0x80) display_dat = 1;
                else display_dat = 0;
                data <<= 1;
                display_clk = 0;
                display_clk = 1;
        }
}
void light(uchar data1, uchar data2)
{
        sendbyte_595(data1);
        sendbyte_595(data2);
        display_cs = 0;
        display_cs = 1;
}


void interrupt usart(void)
{

        if(TMR1IF)        //定时器1中断
        {
                TMR1IF=0;
                TMR1ON=0;
                TMR1H=0xFC;             //定时1ms
                TMR1L=0x18;

                send_timeout_count++;                                                               
                if(send_timeout_count >= SEND_TIMEOUT)        //串口查询定时1*100ms
                {                       
                        sendtimeout = 1;
                        send_timeout_count = 0;
                }

                display_count++;              //数码管显示
                if(display_count >= 4) display_count = 0;
                if(display_count == 0)   //千
                {
                        if(qian)  light(0x01, TABLE[qian]);
                        else light(0x00, 0xFF);
                }
                else if(display_count == 1)  //百
                {
                        if(qian>0 || bai>0)  light(0x02, TABLE[bai]);
                        else light(0x00, 0xFF);
                }
                else if(display_count == 2)  //十
                {
                        light(0x04, TABLE[shi] & 0x7F);
                }
                else if(display_count == 3)        //个
                {
                        light(0x08, TABLE[ge]);
                }

                TMR1ON=1;
        }
    if (RCIE&&RCIF)        //接受中断
    {
        RCIE = 0;
        comrxdbuf[comrxdwrite]=RCREG;
            if(RCREG==0x0A) comrxdtimeout = 1;   //接收到“回车”,即一个数据完成,要进行命令处理操作
        comrxdwrite++;
        if(comrxdwrite==com_rxd_buffer_size) comrxdwrite=0;
            RCIE = 1;
    }

}

//*****************************************************************
//函数:get_char( )
//功能:从串口缓冲区读取字符
//*****************************************************************
uchar get_char()   
{
    uchar temp;
    temp=comrxdbuf[comrxdread++];
    if(comrxdread==com_rxd_buffer_size) {comrxdread=0;}
    return(temp);
}


void send_char(uchar ascii)     
{
    PEIE=0X0;//interrupt_disable;
    comtxdbuf[comtxdwrite++]=ascii;
    if(comtxdwrite==com_txd_buffer_size) comtxdwrite=0;
    if(comtxdbufempty)
        {
                send_enable;
                TXIE=0X1;
        }
    PEIE=0X1;//interrupt_enable;
}

/********************************************************************************
函数:process_command(void)
功能:命令处理程序
********************************************************************************/

void process_command(void)             //命令处理子程序,返回命令处理结果serialmsg
{
    uchar i,bytecrc,k;
    comrxdtimeout = 0;
    if(comrxdread != comrxdwrite)   //串口数据的缓冲区中有数据,进入命令处理
    {
        i = 0;
            bytecrc = 0;
        while(comrxdread != comrxdwrite)
        {
                combuf[i] = get_char();
                send_char(combuf[i]);
                bytecrc ^= combuf[i];
                i++;
                if(combuf[i-1]==0x0A) break;    //接收到“回车”
        }

        if (combuf[0]== '$' && combuf[3]=='R' && combuf[4]=='S')
        {                       
                    angle_result=0;                       
                for(k=7;k<i;k++)
                {
                        if(combuf[k]==',')
                        {
                                break;
                        }
                        else
                        {
                                if(combuf[k]!='.') angle_result=angle_result*10+(combuf[k]-48);
                                else {angle_result=angle_result*10+(combuf[k+1]-48);break;}
                        }
                }
                if(angle_result>3600) angle_result=angle_result_old;
                angle_result_old=angle_result;
                qian=combuf[7]-48;
                bai=combuf[8]-48;
                shi=combuf[9]-48;
                ge=(((combuf[11]-48)+1)*6)/10;
                if(ge>5) ge=5;
        }
        else if (combuf[0]== '$' && combuf[6]=='*')
        {
                angle_result=(combuf[1]-48)*1000+(unsigned int)(combuf[2]-48)*100+(combuf[3]-48)*10+combuf[5]-48;
                if(angle_result>3600) angle_result=angle_result_old;
                angle_result_old=angle_result;
                qian=combuf[1]-48;
                bai=combuf[2]-48;
                shi=combuf[3]-48;
                ge=(((combuf[5]-48)+1)*6)/10;
                if(ge>5) ge=5;
        }
    }
}



void main()
{               
        init();
        timer1_init();
        uart_init();
        send_disable;
        LED=0;

        while(1)
        {
                if(comrxdtimeout)      //接收到0x0A
                {                
                        process_command();
                }
               
        }       
}
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

2

粉丝