c8051f020SPI-ATT7022通信
- 格式:doc
- 大小:63.00 KB
- 文档页数:8
单片机C8051F020及其在仪器和仪表中的应用1引言当前,随着科学技术及工农业生产水平的不断提高,对相应的仪器仪表也提出越来越高的要求,因此,仪器仪表需扩展大量的外围功能部件来满足仪器仪表复杂性、高性能及智能化的要求。
这种方法虽然满足了仪器的复杂性要求,但随之而来的问题是由于系统扩展的过于复杂而造成系统可靠性降低,故障率增加,查找故障困难,从而失去了智能化仪器仪表的优势,如果能够将功能复杂的众多外围功能部件全部或大部分集成到系统所使用的单片机内部,则可大大提高仪器仪表系统的可靠性,同时又使系统的成本得以降低,还可利用单片机片内资源在不增加硬件成本的情况下增强仪器的性能,因而该方案是提高仪器仪表可靠性及性能的行之有效的方法,而美国Cygnal公司的C8051F020单片机便是1款可满足复杂高性能仪器仪表要求的单片机。
C8051F020单片机是集成在1块芯片上的混合信号系统级单片机,具有与MCS 51内核及指令完全兼容的微控制器。
除了具有标准8051机的数字外设部件外,片内还集成了数据采集与控制系统中常用的模拟部件和其它数字外设及功能部件,主要包括模拟多路选择器、可编程增益放大器、ADC、DAC、电压比较器、电压基准、温度传感器、SMBus/I2C、UART、SPI、可编程计数器/定时器阵列、定时器、I/O端口、电源监视器、看门狗定时器和时钟振荡器等,且该单片机内部具有JTAG和调试电路,通过JATG接口可以使用安装在最终应用系统产品上的单片机进行非侵入、全速及在系统调试。
2功能与特点(1)25MIPS高速流水线式与8051机完全兼容的CIP-51内核。
(2)真正12位100KBps、8通道带可编程增益放大器的ADC。
(3)真正8位500KBps,带可编程增益放大器的ADC。
(4)5个16位通用定时器。
(5)具有5个捕捉/比较模块的可编程计数/定时器阵列。
(6)内部电压基准。
(7)内置温度传感器(±3℃)。
本文提出了基于C8051F 单片机的电力系统智能测控装置的设计,该智能装置集电力系统测量、控制、保护、通讯功能于一体,将监控和保护有机的结合起来,充分的利用了硬件资源又保证了继电保护的完整性和独立性。
这种集成度高、功能强大的智能测控装置对于推动电力系统自动化有着重大的意义。
1系统结构设计电力自动化系统对测控装置的实时性和精确度要求很高,所以测控装置一般采用“MCU+DSP ”或“DSP+DSP ”的双CPU 结构。
考虑到测控装置在实际工作中的运算量不是特别的大,而且需要用到高集成的单片机外围接口资源,本系统采用高性能单片机C8051F020(MCU )+电能计量芯片ATT7022(DSP )相结合的方案。
电能计量芯片主要完成电力系统的电压、电流、功率、频率、电能等参数的精确测量。
C8051F020单片机主要实现设备的保护、人机接口和通信的功能。
系统的结构框图如图1所示。
图1系统结构框图现场的三相电压电流信号,由两级电压电流互感器进行降幅,再经电量处理模块的处理以满足A /D 环节所允许的输入范围。
由于系统的测量精度与保护精度的要求不同,测量精度需要达到0.2%,而保护精度只要求3%。
因此在设计时测量和保护分别采用不同的模数转换器进行转换。
电能计量芯片ATT7022内部集成的六路16位的A /D 转换器和24位DSP ,A /D 转化精度高,数据处理。
单片机C8051F020实时读取电能计量芯片ATT7022测量的结果以及开关量输入模块的状态信息,由CAN 总线或RS485总线通信模块发送给控制中心或其它智能设备,并将精确测量的各参数由液晶显示模块显示出来。
C8051F020内部含有八路12位A /D 转换器,对其输入的采样信号进行转化,并将转换后的数据进行处理,与设定的参考值比较计算和分析,如发现被保护的设备发生故障或出现异常,应及时发出保护命令,通过开关量输出模块输出,完成相应设备的保护动作。
C8051F020单片机C8051F020单片机简介单片机(Microcontroller Unit,缩写为MCU)是一种集成了中央处理器(CPU)、片内存储器(RAM和ROM)、输入/输出接口(I/O)、定时器/计数器和其他功能模块的微型计算机系统。
单片机被广泛应用于家电、汽车电子、医疗设备、电力系统等领域。
C8051F020单片机作为Silicon Labs开发的一款8位低功耗单片机,具有较高的性价比和广泛的应用领域。
本文将对C8051F020进行详细介绍。
一、C8051F020单片机的特点与功能C8051F020单片机具有以下特点和功能:1. 架构优势:C8051F020基于Silicon Labs的成熟8位CPU架构,具有高效的指令执行能力和较低的功耗。
2. 丰富的存储器:C8051F020拥有8KB的闪存(Flash)用于程序存储,可以在电源关闭后保持程序不丢失。
此外,它还配备了256字节的数据闪存(Data Flash)和256字节的电子可擦除可编程只读存储器(EPROM)。
3. 综合的外设:C8051F020单片机具有多个通用输入输出引脚(GPIO),可用于各种外设和传感器的连接。
此外,它还提供了模拟与数字转换器(ADC)、串行通信接口(UART、SPI、I2C)以及定时器/计数器等功能。
4. 低功耗设计:C8051F020采用了优化的低功耗设计,具有多种休眠模式和快速唤醒功能,可在长时间运行的场景下降低功耗。
5. 开发工具支持:Silicon Labs提供完善的开发工具套件,包括集成开发环境(IDE)、调试器和仿真器等,方便开发者进行软件开发和调试。
二、C8051F020单片机的应用领域C8051F020单片机广泛应用于以下领域:1. 家电控制:C8051F020可用于控制家电产品,如空调、洗衣机、冰箱等,通过外围电路与其他传感器和执行器进行交互。
2. 工业自动化:C8051F020提供了丰富的通用输入输出引脚和通信接口,可用于工业自动化控制系统,如PLC、工业机器人等。
C8051F020与80C51单片机的异同点C8051F系列单片机是完全集成的混合信号系统级芯片,,具有与8051兼容的CIP-51微控制器内核,采用流水线结构,单周期指令运行速度是8051的12倍,全指令集运行速度是原来的9.5倍。
熟悉NCS-51系列单片机的工程技术人员可以很容易地掌握C8051F的应用技术并能进行软件的移植。
但是不能将8051的程序完全照搬的应用于C8051F单片机中,这是因为两者的内部资源存在较大的差异,必须经过加工才能予以使用。
C8051F020的内部电路包括CIP-51微控制器内核及RAM、ROM、I/O口、定时/计数器、ADC、DAC、PCA(印制电路组装)、SPI(串行外设接口)和SMBus等部件,即把计算机的基本组成单元以及模拟和数字外设集成在一个芯片上,构成一个完整的片上系统(SoC)。
2 相同点C8051F020单片机与80C51系列单片机的指令系统完全一样。
掌握80C51单片机的人员可以很容易地接受C8051F020的应用技术并能完成相应软件的移植。
3 主要硬件不同点3.1 运行速度C8051F020的指令运行速度是一般80C51系列单片机的10倍以上。
因为其CIP-51中采用了流水线处理结构,已经没有了机器周期时序,指令执行的最小时序单位为系统时钟,大部分指令只要1~2个系统周期即可完成。
又由于其时钟系统比80C51的更加完善,有多个时钟源,且时钟源可编程,时钟频率范围为0~25 MHz,当CIP-5l工作在最大系统时钟频率25 MHz时,它的峰值速度可以达到25 MI/s,C8051F020已进入了8位高速单片机行列。
3.2 I/O端口的配置方式C8051F020拥有8个8位的I/O端口,大量减少了外部连线和器件扩展,有利于提高可靠性和抗干扰能力。
其中低4个I/O端口除可作为一般的通用I/O端口外,还可作为其他功能模块的输入或输出引脚,它是通过交叉开关配置寄存器XBR0、XBR1、XBR选择并控制的,它们控制优先权译码选择开关电路如图1所示,可将片内的计数器/定时器、串行总线、硬件中断、比较器输出及其它的数字信号配置为在端口I/O引脚出现,这样用户可以根据自己的特定需要选择所需的数字资源和通用I/O口。
第二章C8051F020单片微控制器2.1 C8051系列单片机简介C8051F020是美国Silicon Laboratories公司生产的ISP Flash微控制器。
C8051F020系列器件使用Silicon Labs的专利CIP-51微控制器内核。
CIP-51与MCS-51TM指令集完全兼容,可以使用标准803x/805x的汇编器和编译器进行软件开发。
CIP-51内核具有标准8052的所有外设部件,包括5个16位的计数器/定时器、两个全双工UART、256字节内部RAM、128字节特殊功能寄存器(SFR)地址空间及8/4个字节宽的I/O端口。
然而与传统的8051系列单片机相比,C8051F020具有许多其它的优点,如:1.速度提高CIP-51采用流水线结构,与标准的8051结构相比指令执行速度有很大的提高。
在一个标准的8051中,除MUL和DIV以外所有指令都需要12或24个系统时钟周期,最大系统时钟频率为12-24MHz。
而对于CIP-51内核,70%的指令的执行时间为1或2个系统时钟周期,只有4条指令的执行时间大于4个系统时钟周期。
因此,CIP-51工作在最大系统时钟频率25MHz时,它的峰值性能达到25MIPS。
2.JTAG技术C8051单片机内部预设了JTAG模块,它使得每一个单片机芯片都具有完整的在线调试功能,而不必使用复杂的仿真调试工具。
3.FLASH在线编程技术C8051系列的FLASH型单片机不但可以采用外部编程器进行烧写,用户还可以利用自己的程序修改FLASH的内容,而且不需要外加编程电压,可以方便地实现软件升级。
4.扩展的中断系统扩展的中断系统向CIP-51提供22个中断源(标准8051只有7个中断源),允许大量的模拟和数字外设中断微控制器。
一个中断驱动的系统需要较少的MCU干预,因而有更高的执行效率。
在设计一个多任务实时系统时,这些增加的中断源是非常有用的[12]。
此程序实验板已调试通过/*此程序接收UR0寄存器地址读取此寄存器内容并从UR0口发出,以数组方式进行(按寄存器读发)*//*主意事项:1、作为输入脚一定要设置成推挽方式2、SPI只有发时才有时钟,所以读数据时一定要先发0以激发时钟信号。
/**********************************************文件描述:三相电测量上报功能说明:测量A TT7022B完成PCF8563上报定时(需校时)FM24C256转换数据存储UART0口用于RS232读数据UART1控制无线模块上报数据创建:2006年12月5日/**********************************函数:main.*入口:无*出口:无*功能说明:接收UART端口命令执行读A TT7022B的数据进行处理、存储和回发数据********************************///*****************************//包含的文件//******************************#include <c8051f020.h>#include <main.h>#include <intrins.h>//*************************************************//函数:init_sysclk(void)//功能:时钟初始化//入口:无//出口:无//说明:使用外部时钟12M//*************************************************void init_sysclk (void){uint i=0;OSCXCN=0x67; //external oscillator with 12MHz crystalfor(i=0;i<256;i++); // XTLVLD blankingwhile(!(OSCXCN & 0x80)); // Wait for crystal osc. to settleOSCICN=0x88; //时钟丢失检测,选择外部时钟CKCON = 0x00; //时钟分频}/*********************************函数:void enable_wdog(void)void disable_wdog(void)功能:使能、禁止wdog入口:无出口:无说明:********************************/void enable_wdog(void){WDTCN=0xA5;//允许看门狗定时器工作}void disable_wdog(void) //禁止看门狗定时器工作{WDTCN=0xDE;WDTCN=0xAD;}/***********************************函数:void init_ioport()功能:端口配置及端口位定义入口:无出口:无说明:*************************************/void init_ioport(){XBR0=0x07; //TXD0-P0.0 RXD0-P0.1,SPI_SCK-P0.2,SPI_MISO-P0.3//SPI_MOSI-P0.4,SPI_NSS-P0.5,SDA-P0.6,SCL-P0.7, XBR1=0X10; //INT1使能INT1--P1.2XBR2=0x44; //端口I/O弱上拉允许,TX1-P1.0,RXD-P1.1交叉开关允许P0MDOUT=0x08; //端口0输出方式寄存器:0--漏极开路P1MDIN=0XFF; //端口1输入方式寄存器:0--配置为数字输入P1MDOUT=0x00; //端口1输出方式寄存器,0--漏极开路P1=0xff;P2MDOUT=0x00; //端口2输出方式寄存器:0--漏极开路P2=0xff;P3MDOUT=0X00; //端口3输出方式寄存器:0--漏极开路P3=0xff;P74OUT=0x00; //端口7-4输出方式寄存器:0--漏极开路P4=0xff;P5=0xff;P6=0xff;P7=0xff;}//--------------------------------------------------------------//函数:void Delay_ms (unsigned ms)//功能:实现延时功能Timer0_ms//---------------------------------------------------------------///* Configure Timer0 to delay <ms> */void Delay_ms (unsigned ms){uchar i; // millisecond counterTCON &= ~0x30; // STOP Timer0 and clear overflow flag TMOD |= 0x01; // configure Timer0 to 16-bit mode CKCON |= 0x08; // Timer0 counts SYSCLKsfor (i = 0; i < ms; i++) // count milliseconds{TR0 = 0; // STOP Timer0TH0 = (-SYSCLK/1000) >> 8; // set Timer0 to overflow in 1msTL0 = -SYSCLK/1000;TR0 = 1; // START Timer0while (TF0 == 0); // wait for overflowTF0 = 0; // clear overflow indicator }}//-------------------------------------------------------//函数:void Delay_us (unsigned us)//功能:实现延时功能Timer0_us//-------------------------------------------------------///* Configure Timer0 to delay <us>*/void Delay_us (unsigned us){uchar i; // microseconds counterTCON &= ~0x30; // STOP Timer0 and clear overflow flagTMOD |= 0x01; // configure Timer0 to 16-bit modeCKCON |= 0x08; // Timer0 counts SYSCLKs for (i = 0; i < us; i++) // count microseconds{TR0 = 0; // STOP Timer0TH0 = (-SYSCLK/1000000) >> 8; // set Timer0 to overflow in 1usTL0 = -SYSCLK/1000000;TR0 = 1; // START Timer0while (TF0 == 0); // wait for overflowTF0 = 0; // clear overflow indicator}}//***************************************//函数:unsigned char my_add(uchar my_add)//功能:读开关状态确定子地址//入口:无//出口:子地址//说明:子地址存于myadd中(即设备号)//****************************************void my_add(void){P74OUT |=0XD0;myadd =P5;}//******************************************//函数:void jiaob(A TT_JB[])//功能:写校表寄存器//说明:UART口接收校表时间并存于FM24C256中//*****************************************void jiaob (void){}main()disable_wdog(); //关看门狗init_sysclk (); //时钟初始化init_ioport(); //交叉开关配置my_add(); //读设备子地址设置UART0_Init(); //UART0初始化SPI0_Init ();EX1= 1; //开INT1EA = 1; //开中断SPIEN=1;uart0_flag=0;while(1){if(uart0_flag){uart0_flag=0;A TT_Read (ur0_rxd[0]);m=&ur0_rxd[0];txd_string(m,3);}}}//---------判断本设备命令及命令内容执行命令-------//-----------------------------------------------------------------------------// SPI0_Init//-----------------------------------------------------------------------------//// Configure SPI0 for 8-bit, 200K SCK, Master mode, data// sampled on SCK 2st edge.//void SPI0_Init (void){SPI0CFG = 0x87; // data sampled on SCK 2st edge// 8-bit data words,MSB 1st SPI0CN = 0x02; // Master mode; SPI enabled; flags// clearedSPI0CKR = 0x2F; // SPI clock <= 200kHz (limited by// EEPROM spec.)EIE1 &= 0XFE; // spi关//开漏}//-----------------------------------------------------------------------------// A TT_Read//-----------------------------------------------------------------------------//// This routine reads and returns a single A TT7022 byte whose address is// given in <Addr>.//void A TT_Read (uchar x){uchar n=0;A TT_CS = 0; // select att7022SPIF = 0;Delay_us (1); // wait at least 250ns (CS setup time) SPI0DA T = x;while (SPIF==0);Delay_us (3);SPIF = 0;for(n=0;n<=3;n++){SPI0DA T = 0;while (SPIF==0);SPIF = 0;ur0_rxd[n]= SPI0DA T; // read data from SPI} // read data from SPIDelay_us (1); // wait at least 250ns (CS hold time)A TT_CS = 1; // de-select EEPROMDelay_us (1); // wait at least 500ns (CS disable time) }//-----------------------------------------------------------------------------// A TT_Write//-----------------------------------------------------------------------------//void A TT_Write (uchar A TT_W ADD, uchar att_wd[]){uchar n;A TT_WADD = A TT_W|A TT_W_ADD;A TT_CS = 0; // select att7022Delay_us (1); // wait at least 250ns (CS setup time)// transmit Write opcodeSPIF = 0;SPI0DA T = A TT_W|A TT_W_ADD;while (SPIF == 0);SPIF = 0;SPI0DA T = att_wd[n];while (SPIF == 0);n = ++n;SPIF = 0;SPI0DA T = att_wd[n];while (SPIF == 0);n = ++n;SPIF = 0;SPI0DA T = att_wd[n];while (SPIF == 0);Delay_us (1); // wait at least 250ns (CS hold time)A TT_CS = 1;}//-----------------------------------------------------//串口初始化//--------------------------------------------------------void UART0_Init(void){SCON0 = 0x50; //串口方式1,波特率可变PCON |= 0x00; //SMOD = 0TMOD = 0x20; //选择T1方式2,TH1 = 0xe8; //T1初值,TL1 = 0xe8;ES0 = 1; //UART0中断开启TR1 = 1; //启动定时器T1}//----------------------------------------------------------//发送单个字符//---------------------------------------------------------void txd_char(unsigned char ch){SBUF0 = ch; //送入缓冲区while(TI0 == 0); //等待发送完毕TI0 = 0; //软件清零}//-----------------------------------------------------//发送字符串,调用Send_Char() len字符串长度//----------------------------------------------------void txd_string(unsigned char * str,unsigned char len){unsigned char k = 0;do{txd_char(*(str+k) );k++;} while(k < len);}//--------------------------------------------------------//UART0中断服务程序. 接收字符//--------------------------------------------------------void uart0_isr(void) interrupt 4 using 1{unsigned char rxch;rxd_str=0;if(RI0) //中断标志RI0=1 数据完整接收{RI0 = 0;uart0_flag=1;//软件清零rxch = SBUF0; //读缓冲ur0_rxd[rxd_str] = rxch; //存入数组,供发送}}。
C8051F020在SD卡主控制器设计中的应用1 引言飞机飞行状况监测及数据采集仪。
用于采集飞机试飞时的各种飞行数据,要求大量的存储容量。
它具有功能强、性价比高、安装和使用方便的特点。
采集仪可以根据用户的要求进行配置,对八路传感器输入信号进行调理、采样及数据处理,将测量结果实时动态显示,并通过其报警功能,实现设备故障预警。
采集仪既可以单机独立工作,也可以通过RS-485总线将多达16台采集仪与计算机联机组成在线监测系统。
应用范围包括各种不同类型的电机、风机、泵、齿轮箱、轧机、风力发电机、电站和离心机,以及各种机械设备常见故障的状态监测等。
2 硬件功能原理与设计SD卡的外形和接口。
根据SD卡与主控制器的通信协议不同,SD卡对外提供两种访问模式:SD模式和SPI模式。
所用通信模式不同,SD卡引脚的功能也不同,具体引脚功能如表1所示。
在具体通信过程中,主机只能选择其中一种通信模式。
通信模式的选择对于主控制器来说是透明的,卡会自动检测复位命令的通信协议模式,而且通信模式一旦选定,系统在通电情况下不能改变。
SD模式下,主控制器使用SD总线访问SD卡。
可通常的单片机没有硬件SD总线,尽管可以借助通用口线用软件仿真,但访问速度较低,还要大量占用CPU时间,而单片机多具有SPI总线。
注:S--电源;I--输入;O--推挽输出;PP--推挽I/O。
在SPI总线模式下。
CS为主控制器向卡发送的片选信号,SCLK为主控制器向卡发送的时钟信号。
DI(DataIn)为主控制器向卡发送的单向数据信号,DO(DataOut)为卡向主控制器发送的单向数据信号。
SD卡的内部结构,还具有卡接口控制器、寄存器以及SD和SPI两种模式的对外接口等。
外部主控制器访问卡的外部信号线并不与存储器单元直接相连,而是通过卡的接口控制器与存储器单元接口相连。
卡内存储单元的读,擦,写由卡接口控制器根据主控制器的命令自动处理完成,而主控制器无须知道卡内是如何操作、管理存储单元的。
此程序实验板已调试通过/*此程序接收UR0寄存器地址读取此寄存器内容并从UR0口发出,以数组方式进行(按寄存器读发)*//*主意事项:1、作为输入脚一定要设置成推挽方式2、SPI只有发时才有时钟,所以读数据时一定要先发0以激发时钟信号。
/**********************************************文件描述:三相电测量上报功能说明:测量A TT7022B完成PCF8563上报定时(需校时)FM24C256转换数据存储UART0口用于RS232读数据UART1控制无线模块上报数据创建:2006年12月5日/**********************************函数:main.*入口:无*出口:无*功能说明:接收UART端口命令执行读A TT7022B的数据进行处理、存储和回发数据********************************///*****************************//包含的文件//******************************#include <c8051f020.h>#include <main.h>#include <intrins.h>//*************************************************//函数:init_sysclk(void)//功能:时钟初始化//入口:无//出口:无//说明:使用外部时钟12M//*************************************************void init_sysclk (void){uint i=0;OSCXCN=0x67; //external oscillator with 12MHz crystalfor(i=0;i<256;i++); // XTLVLD blankingwhile(!(OSCXCN & 0x80)); // Wait for crystal osc. to settleOSCICN=0x88; //时钟丢失检测,选择外部时钟CKCON = 0x00; //时钟分频}/*********************************函数:void enable_wdog(void)void disable_wdog(void)功能:使能、禁止wdog入口:无出口:无说明:********************************/void enable_wdog(void){WDTCN=0xA5;//允许看门狗定时器工作}void disable_wdog(void) //禁止看门狗定时器工作{WDTCN=0xDE;WDTCN=0xAD;}/***********************************函数:void init_ioport()功能:端口配置及端口位定义入口:无出口:无说明:*************************************/void init_ioport(){XBR0=0x07; //TXD0-P0.0 RXD0-P0.1,SPI_SCK-P0.2,SPI_MISO-P0.3//SPI_MOSI-P0.4,SPI_NSS-P0.5,SDA-P0.6,SCL-P0.7, XBR1=0X10; //INT1使能INT1--P1.2XBR2=0x44; //端口I/O弱上拉允许,TX1-P1.0,RXD-P1.1交叉开关允许P0MDOUT=0x08; //端口0输出方式寄存器:0--漏极开路P1MDIN=0XFF; //端口1输入方式寄存器:0--配置为数字输入P1MDOUT=0x00; //端口1输出方式寄存器,0--漏极开路P1=0xff;P2MDOUT=0x00; //端口2输出方式寄存器:0--漏极开路P2=0xff;P3MDOUT=0X00; //端口3输出方式寄存器:0--漏极开路P3=0xff;P74OUT=0x00; //端口7-4输出方式寄存器:0--漏极开路P4=0xff;P5=0xff;P6=0xff;P7=0xff;}//--------------------------------------------------------------//函数:void Delay_ms (unsigned ms)//功能:实现延时功能Timer0_ms//---------------------------------------------------------------///* Configure Timer0 to delay <ms> */void Delay_ms (unsigned ms){uchar i; // millisecond counterTCON &= ~0x30; // STOP Timer0 and clear overflow flag TMOD |= 0x01; // configure Timer0 to 16-bit mode CKCON |= 0x08; // Timer0 counts SYSCLKsfor (i = 0; i < ms; i++) // count milliseconds{TR0 = 0; // STOP Timer0TH0 = (-SYSCLK/1000) >> 8; // set Timer0 to overflow in 1msTL0 = -SYSCLK/1000;TR0 = 1; // START Timer0while (TF0 == 0); // wait for overflowTF0 = 0; // clear overflow indicator }}//-------------------------------------------------------//函数:void Delay_us (unsigned us)//功能:实现延时功能Timer0_us//-------------------------------------------------------///* Configure Timer0 to delay <us>*/void Delay_us (unsigned us){uchar i; // microseconds counterTCON &= ~0x30; // STOP Timer0 and clear overflow flagTMOD |= 0x01; // configure Timer0 to 16-bit modeCKCON |= 0x08; // Timer0 counts SYSCLKs for (i = 0; i < us; i++) // count microseconds{TR0 = 0; // STOP Timer0TH0 = (-SYSCLK/1000000) >> 8; // set Timer0 to overflow in 1usTL0 = -SYSCLK/1000000;TR0 = 1; // START Timer0while (TF0 == 0); // wait for overflowTF0 = 0; // clear overflow indicator}}//***************************************//函数:unsigned char my_add(uchar my_add)//功能:读开关状态确定子地址//入口:无//出口:子地址//说明:子地址存于myadd中(即设备号)//****************************************void my_add(void){P74OUT |=0XD0;myadd =P5;}//******************************************//函数:void jiaob(A TT_JB[])//功能:写校表寄存器//说明:UART口接收校表时间并存于FM24C256中//*****************************************void jiaob (void){}main()disable_wdog(); //关看门狗init_sysclk (); //时钟初始化init_ioport(); //交叉开关配置my_add(); //读设备子地址设置UART0_Init(); //UART0初始化SPI0_Init ();EX1= 1; //开INT1EA = 1; //开中断SPIEN=1;uart0_flag=0;while(1){if(uart0_flag){uart0_flag=0;A TT_Read (ur0_rxd[0]);m=&ur0_rxd[0];txd_string(m,3);}}}//---------判断本设备命令及命令内容执行命令-------//-----------------------------------------------------------------------------// SPI0_Init//-----------------------------------------------------------------------------//// Configure SPI0 for 8-bit, 200K SCK, Master mode, data// sampled on SCK 2st edge.//void SPI0_Init (void){SPI0CFG = 0x87; // data sampled on SCK 2st edge// 8-bit data words,MSB 1st SPI0CN = 0x02; // Master mode; SPI enabled; flags// clearedSPI0CKR = 0x2F; // SPI clock <= 200kHz (limited by// EEPROM spec.)EIE1 &= 0XFE; // spi关//开漏}//-----------------------------------------------------------------------------// A TT_Read//-----------------------------------------------------------------------------//// This routine reads and returns a single A TT7022 byte whose address is// given in <Addr>.//void A TT_Read (uchar x){uchar n=0;A TT_CS = 0; // select att7022SPIF = 0;Delay_us (1); // wait at least 250ns (CS setup time) SPI0DA T = x;while (SPIF==0);Delay_us (3);SPIF = 0;for(n=0;n<=3;n++){SPI0DA T = 0;while (SPIF==0);SPIF = 0;ur0_rxd[n]= SPI0DA T; // read data from SPI} // read data from SPIDelay_us (1); // wait at least 250ns (CS hold time)A TT_CS = 1; // de-select EEPROMDelay_us (1); // wait at least 500ns (CS disable time) }//-----------------------------------------------------------------------------// A TT_Write//-----------------------------------------------------------------------------//void A TT_Write (uchar A TT_W ADD, uchar att_wd[]){uchar n;A TT_WADD = A TT_W|A TT_W_ADD;A TT_CS = 0; // select att7022Delay_us (1); // wait at least 250ns (CS setup time)// transmit Write opcodeSPIF = 0;SPI0DA T = A TT_W|A TT_W_ADD;while (SPIF == 0);SPIF = 0;SPI0DA T = att_wd[n];while (SPIF == 0);n = ++n;SPIF = 0;SPI0DA T = att_wd[n];while (SPIF == 0);n = ++n;SPIF = 0;SPI0DA T = att_wd[n];while (SPIF == 0);Delay_us (1); // wait at least 250ns (CS hold time)A TT_CS = 1;}//-----------------------------------------------------//串口初始化//--------------------------------------------------------void UART0_Init(void){SCON0 = 0x50; //串口方式1,波特率可变PCON |= 0x00; //SMOD = 0TMOD = 0x20; //选择T1方式2,TH1 = 0xe8; //T1初值,TL1 = 0xe8;ES0 = 1; //UART0中断开启TR1 = 1; //启动定时器T1}//----------------------------------------------------------//发送单个字符//---------------------------------------------------------void txd_char(unsigned char ch){SBUF0 = ch; //送入缓冲区while(TI0 == 0); //等待发送完毕TI0 = 0; //软件清零}//-----------------------------------------------------//发送字符串,调用Send_Char() len字符串长度//----------------------------------------------------void txd_string(unsigned char * str,unsigned char len){unsigned char k = 0;do{txd_char(*(str+k) );k++;} while(k < len);}//--------------------------------------------------------//UART0中断服务程序. 接收字符//--------------------------------------------------------void uart0_isr(void) interrupt 4 using 1{unsigned char rxch;rxd_str=0;if(RI0) //中断标志RI0=1 数据完整接收{RI0 = 0;uart0_flag=1;//软件清零rxch = SBUF0; //读缓冲ur0_rxd[rxd_str] = rxch; //存入数组,供发送}}。