打印

C语言编写,用PIC16F690双机异步USART通信(发送程序)

[复制链接]
4719|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fm365sfws|  楼主 | 2008-9-18 15:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
表情[讨论]C语言编写,用PIC16F690双机异步USART通信(发送程序)
我的这个程序是利用PIC16F690单片机编写的。
要实现双机异步通信,用USART进行通信。
目的是,让单片机A发送00~99到单片机B中,然后在单片机B链接一个LED数码管显示出00~99;
与此同时,单片机A也同样链接一个LED数码管,显示发送出去的00~99.
也就是让单片机A和B的数码管显示同样的00和99。
我的程序如下,本程序已经调通,但是不知道用USART发送PORTC=0x10高位和PORTC=0x40低位是否发送成功。请那位老师指点一下。
这个是发送端的程序:
#include<pic.h>

/*该程序实现PIC16F690单片机双机异步通信功能;*/
/*该程序是发送部分(发送00~99),并在LED显示器上显示出发送的数据;*/

#define PRESCALE1S    40            //1s

unsigned char Reg_L = 0;
unsigned char Reg_H = 0;
unsigned char IntFlag = 0;

const char NumTab[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0XD8,0x80,0x90};
                                    //不带小数点,共阳极显示0~9;

unsigned int DispPreScale = PRESCALE1S;
unsigned int DispPreScaleCnt = 0x00;

/***函数名称:InitPort;***/
/***函数功能:I/O端口初始化;***/
void InitPort(void)
{
    TRISA = 0x00;        //PORTA初始化;
    PORTA = 0x00;
    TRISB = 0x00;        //PORTB初始化;
    PORTB = 0x00;
    TRISC = 0x00;        //PORTC初始化;
    PORTC = 0x00;    
}

/***函数名称:InitTMR1;***/
/***函数功能:定时器1初始化;***/
void InitTMR1(void)
{
    T1CON = 0x30;         //TMR1寄存器时钟为Fosc/4再经8分频;
    TMR1H = 0x3C;
    TMR1L = 0xB0;        //50ms定时初始化值;
    TMR1IE = 1;            //允许Timer1 溢出中断;
     TMR1ON = 1;            //TMR1使能;    
}

/***函数名称:InitDevice;***/
/***函数功能:对MCU各个功能初始化;***/
void InitDevices(void)
{
    InitPort();         //端口初始化;
    InitTMR1();            //TMR1定时器初始化;
    
    BRGH = 1;            //选择高速波特率;
    SPBRG = 103;        //晶振8M,异步,高速,19200BPS,误差0.16;
    
    TXSTA = 0x04;        //8bit;
    RCSTA = 0x80;        //使能发送器;
//    TXIE = 0;            //写中断标志位置1使能写中断;
        
    OSCCON = 0x70;        //振荡器选择为内部8M晶振;
                        //内部振荡器用作系统时钟;
    GIE = 1;            //全局终端允许位;使能所有未屏蔽中断;
    PEIE = 1;            //外设终端允许位;使能所有非屏蔽外设中断;
    
    ANSEL = 0x00;        //模拟口转数字口;
    ANSELH = 0x00;
    
}

/***函数名称:delay_1ms***/
/***函数功能:定时器TMR0延时1ms***/
void delay_1ms(void)
{
    OPTION = 0x07;            //设置TMR0寄存器;
     while(1)
     {  
      if(TMR0 == 0x75)        //1us*256*0x75=29952us 大概3ms ;
          {
            TMR0 = 0x00;
           break;
          }
     }
}  

/***中断服务程序入口***/
void interrupt USART(void)
{
     if(TMR1IE && TMR1IF)                //定时器1溢出 中断处理
    {
         TMR1IF = 0;                        //清除TMR1中断标志;
         TMR1H = 0xFC;
         TMR1L = 0x18;                   //延时4ms;
         IntFlag = 1;
    }
}

/******主函数******/
void main(void)
{
    InitDevices();
    PORTB = 0x50;
    PORTC = NumTab[0];    
    TXEN = 1;                    //发送允许;
    CREN = 1;                    //接收数据允许;    
    while(1)                    //循环运行;
    {
      if(IntFlag == 1)
      {
        IntFlag = 0;
        DispPreScaleCnt++;
        if(DispPreScaleCnt == DispPreScale)          //延时1s后
        {
           DispPreScaleCnt = 0x00;
           if(Reg_L<0x09)
           {
              Reg_L += 1;
           }
           else
           {
              Reg_L = 0;
              
                if(Reg_H < 0x09)
                   {
                     Reg_H += 1;
                   }
                   else
                   {
                      Reg_H = 0;
                    }
           }
         }
    }
      delay_1ms();
      PORTA = 0x00;
      PORTB = 0x40;                //低位;
      PORTC = NumTab[Reg_L];
      TXREG = PORTC;
      delay_1ms();                
      PORTA = 0x00;
      PORTB = 0x10;                //高位;
      PORTC = NumTab[Reg_H];
      TXREG = PORTC;
    
          while(1)
        {
            if(TXIF == 1)break;
        }
        while(1)
        {
            if(RCIF == 1)break;        //若收到响应字节,则终止等待;
        }
        RCREG = RCREG;                //读响应字节,清RCIF;
    
    }

    while(1)
    {
        ;
    }

}
沙发
byk2005| | 2008-9-22 20:36 | 只看该作者

学习一下

非常感谢楼主无私奉献!学习一下

使用特权

评论回复
板凳
wuyurenfei| | 2012-2-23 12:03 | 只看该作者
学习学习了,谢谢分享

使用特权

评论回复
地板
treenew| | 2012-2-23 12:10 | 只看该作者
学习了

使用特权

评论回复
5
Jack01| | 2012-2-23 13:24 | 只看该作者
看看,学习

使用特权

评论回复
6
兰天白云| | 2012-2-23 16:38 | 只看该作者
“但是不知道用USART发送PORTC=0x10高位和PORTC=0x40低位是否发送成功”
这句真的没理解

使用特权

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

本版积分规则

1

主题

1

帖子

1

粉丝