这是什么问题??? 为什么我在程序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; //除数低位寄存器,波特率设为9600,0x0C送低字节寄存器 //0x00送高字节寄存器,见16C550手册33页波特率表 XBYTE[DLM]=0x00; //除数高位寄存器,波特率因子=晶振频率/(16*波特率) // =1843200/(16*9600)=12=0x0C XBYTE[LCR]=0x03; //戏剧文学使DLAB=0,不允许访问波特率因子寄存器,数据格式为8数据位,1停止位,无奇偶验校 //LCR0=1,LCR1=1:数据为8位 //LCR2=0:一个停止位 //LCR3=0:无奇偶较验 //LCR6=0:不能中断SOUT //LCR7=0:将DLAB清零,这样就可以对接收数据缓冲寄存器RBR和发送数据保持寄存器THR进行操作 XBYTE[MCR]=0x00; //MODEM控制寄存器,串口芯片的DTR、RTS送低电平 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 条评论) |