16c550通讯程序

阅读: 评论:0

16c550通讯程序
这是什么问题???
为什么我在程序16c550的头上加#pragma src就出现这个问题?去掉就没有问题。
-----------------------------------main.c----------------------------
#include<reg52.h>

#include<16c550.h>

#define Mainapp_GLOBALS
#include "main.h"

#define uchar unsigned char
#define uint  unsigned int

extern uchar unit;
void main(void)
{
   UartInit();
   unit=0;
   while(unit==0)Lunxun();                //地址轮寻
}
-------------------------------main.h---------------------------------
#ifdef Mainapp_GLOBALS
#define Mainapp_ext
#else
#define Mainapp_ext extern
#endif
-------------------------------16c550.c-------------------------------
#pragma src                                  //问题就在这里
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#include <absacc.h>

#define c550_GLOBALS
#include "16c550.h"

#include <main.h>

#define uchar unsigned char玛莎 努斯鲍姆
#define uint  unsigned int

//-----------------通讯数据------------------------------//
uchar pdata xcomdata = 0,xcom[66];     //下位通讯数据
uchar length;                          //接受数据的长度
uchar Scrcdata;
uchar xdata xadd[128];                 //采集器地址数据区
bit   read_flag=0;                     //下位通讯结束
//-------------------crc数据-----------------------------//
sbit  dog=P1^1;                        //
sbit  DEA=P1^7;                           //485控制位,0为读

uchar unit;                            //地址个数
//----------------------程序-----------------------------//

void UartInit(void)
{cimatrone8.5
    XBYTE[FCR]=0x06;    //FIFO控制寄存器,使FIFO ENABLE=0,清除FIFO

    XBYTE[IER]=0x01;    //中断允许寄存器,使ERBI=1,允许接收数据中断,其他中断无效

    XBYTE[LCR]=0x80;    //通讯控制寄存器,使DLAB=1,允许访问波特率因子寄存器

    XBYTE[DLL]=0x0C;    //除数低位寄存器,波特率设为96000x0C送低字节寄存器
                        //0x00送高字节寄存器,见16C550手册33页波特率表
    XBYTE[DLM]=0x00;    //除数高位寄存器,波特率因子=晶振频率/(16*波特率)
                        //                            =1843200/(16*9600)=12=0x0C

    XBYTE[LCR]=0x03;    //戏剧文学使DLAB=0,不允许访问波特率因子寄存器,数据格式为8数据位,1停止位,无奇偶验校
                        //LCR0=1LCR1=1:数据为8
                        //LCR2=0:一个停止位
                        //LCR3=0:无奇偶较验
                        //LCR6=0:不能中断SOUT
                        //LCR7=0:将DLAB清零,这样就可以对接收数据缓冲寄存器RBR和发送数据保持寄存器THR进行操作
    XBYTE[MCR]=0x00;    //MODEM控制寄存器,串口芯片的DTRRTS送低电平
    XBYTE[LCR]=0x00;    //擦写寄存器,未知

//    XBYTE[MSR];            //MODEM状态寄存器,只读
//    XBYTE[LSR];            //通讯状态寄存器,只读
//    XBYTE[IIR];            //中断区分寄存器,只读

//    XBYTE[IER]=0;        //16C550关中断

    EX1   = 1;            //系统开中断
    EA    = 1;
}
/* 中断接收服务程序 */
void OnRes() interrupt 0 using 2                //外部中断0
{

    XBYTE[LCR] = 0x03;
    if((XBYTE[ISR]&0x02)!=0x02)
      {
       xcom[xcomdata]=XBYTE[RHR];
一汽马自达车主俱乐部       xcomdata++;
        if(xcomdata>length)
          {read_flag=1;
           if(xcomdata>65)xcomdata=0;
          }
      }
}


void SendC(uchar c)
{
    data uchar t;

    XBYTE[LCR]=0x03;
    Scrcdata^=c;                                //发送的crc
    XBYTE[RHR]=c;                               //向串口发送字符

    do{t=XBYTE[LSR];
    }while((t&0x40)==0x00);                     //判断TEMT
}

void Sendcrc(void)
{
    data uchar t;

    XBYTE[LCR]=0x03;
    XBYTE[RHR]=Scrcdata;                        //向串口发送字符

    do{t=XBYTE[LSR];
    }while((t&0x40)==0x00);                     //判断TEMT
}
uchar crc(void)
{
    uchar i,Acrcdata;
    Acrcdata=0;
    for(i=0;i<(xcomdata-1);i++)
       Acrcdata^=xcom[i];                       //接收数据异或
    return(Acrcdata);
}
void Lunxun(void)                                //地址轮询
{
    uchar  i;

    unit=0;
    dog=!dog;
    length=2;
    DEA=1;
    for(i=1;i<255;i++)
     {
       read_flag=0;
       SendC(i);                                //发送地址
寻中国最美七仙女       SendC(0x15);                             //功能码
       Sendcrc();                                //CRC
       xcomdata=0;
       DEA=0;                                   //485允许接收
       DEA=1;
       if(read_flag==1)
          {
           read_flag=0;
           if(crc==xcom[2])
            {
             if((xcom[1]==0x95)&&(xcom[0]==i))
              {
               xadd[unit]=i;  unit++;
              }
             }
          }
     }
}
---------------------------------16c550.h-----------------------------
#ifdef c550_GLOBALS
#define c550_ext
#else
#define c550_ext extern
#endif

c550_ext void UartInit(void);
c550_ext void SendC(unsigned char c);
c550_ext void Sendcrc(void);
c550_ext void Lunxun(void);
c550_ext unsigned char crc(void);

//-----------------16c550--------------------------------//
#define RHR 0X0000                     //接收数据缓冲区
耿殿君#define THR 0x0000                     //发送数据缓冲区
#define IER 0x0001                     //中断控制寄存器
#define FCR 0x0002                     //FIFO控制寄存器
#define ISR 0x0002                     //
#define LCR 0x0003                     //串行口控制寄存器
#define MCR 0x0004                     //MODEM控制寄存器
#define LSR 0x0005                     //串行口状态寄存器
#define DLL 0x0000                     //波特率除数锁存器低位
#define DLM 0x0001                         //波特率除数锁存器高位

本文发布于:2023-07-11 08:01:53,感谢您对本站的认可!

本文链接:https://patent.en369.cn/xueshu/200331.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:寄存器   中断   因子   数据
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图