FX859(C8051F310)收发程序
c8051f340简单串口收发程序
c8051f340简单串口收发程序推荐/******************************************************************本程序是通过F340的uart0与PC进行串口通讯的例程,具体实现为当F340收*从PC传来的数据后将数据原样回发给PC机 ,端口为RX=P0.5,TX=P0.4******************************************************************/#i nclude <c8051f340.h>#define uchar unsigned char#define uint unsigned int/******************************************************************端口初始化函数*****************************************************************/void PORT_Init (void){XBR0 = 0x01;//端口I/O交叉开关寄存器0,UART TX0, RX0 连到端口引脚 P0.4 和 P0.5XBR1 = 0x40;//端口I/O交叉开关寄存器1,交叉开关使能P0MDOUT = 0x10;//P0.4为推挽输出,其他的为漏极开路输出}/*****************************************************************UART0初始化函数*****************************************************************/void UART0_Init (void){SCON0 |= 0x10;CKCON = 0x01;TH1 = 0x64; //波特率为9600TL1 = TH1;TMOD = 0x20;TR1 = 1;//P235,定时器1运行控制,定时器1允许TI0 = 1;//P235,中断1类型选择,INT1为边沿触发}/******************************************************************主函数*****************************************************************/void main(){char g;PCA0MD &= ~0x40;//关闭看门狗OSCICN |= 0x03;//P126PORT_Init();//端口初始化UART0_Init();//UART0初始化 while(1){while(RI0==0); //接收g=SBUF0;RI0=0;if(g!='\0'){ SBUF0=g;while(TI0==0); //发送TI0=0;g='\0';}}}。
C8051F310开发板调试
以31kou27g.c(附)为例,介绍一下有关c8051f310开发板的调试流程,软件配置等相关的一些经验。
(1)硬件电路连接好后,首先建立一个工程,取名31kou27g保存,然后添加该C文件到新建的工程中。
注意事项:当建立工程时,会出现一个选择芯片型号的窗口,这是要选择芯片类型为c8051f310:(2)进行调试前的相关配置:点击Target1右边第一个图标,出现下面的窗口第一项Device因为前面已经选好了,就不用再管了。
点击Output将打勾选中。
下面点击Debug:这里我们因为连接了硬件,所以选择,注意下拉列表中选择C8051Fxxx Driver。
并且在右边的Setting中选择(3)所有这些配置好以后,点OK,进行DEBUG调试,出现下面的界面,点击单步运行,或者按F10(F11),随着不断运行,可以看到两个小灯不断亮灭。
点击全速运行,然后可以看到小灯自己不断闪烁。
另外点解Load可以将Hex文件烧写进芯片,就不用其他烧写工具了,很方便。
如果直接下载,不经过DEBUG,还需要进行一些设置:选择最右边的这个选项,如下载设置附:keil4的安装破解(1)首先,下载keil4安装(2)打开出现如下界面需要填写CID号,打开keil4,选择License Management将CID号复制,粘贴到上面,点击generate,将产生的序列号复制到New License ID Code,点击Add LIC,设置好以后点击Close.这样就设置好了,可以放心使用。
另外还有很重要的一个步骤,就是安装调试器驱动驱动安装位置要选择在keil软件的安装位置下!正确安装软件及驱动后,就可找到的。
基于C8051F单片机的综合实验平台设计
基于 C8051F单片机的综合实验平台设计
杜 海 龙 ,王 琦 ,李 娟
(吉林大学 通信工程学院,吉林 长春片机为核心,配合外围电路,设计了综合实验平台.通 过 A/D 转 换 测 量 RC 电 路 充 放电时间常数,将采 集 的 数 据 通 过 RS232 接 口 发 送 给 计 算 机,利 用 VB6.0 在 计 算 机 上 编 程,将 收 到 的 数 据 显 示并画图,最后进行实验数据的误差分析.该实验平台 上 的 实 验 过 程 结 合 了 自 动 控 制 原 理、单 片 机 原 理 与 接 口技术、通信原理、计算机程序设计以 及 误 差 分 析 等 课 程 相 关 内 容,解 决 了 学 生 综 合 实 验 难 以 结 合 多 门 课 程 的 难 题 . 实 验 结 果 表 明 ,该 实 验 误 差 较 小 ,均 小 于 0.5% ,实 验 重 复 性 较 好 ,适 合 作 为 学 生 综 合 实 验 内 容 . 关 键 词 :综 合 实 验 ;单 片 机 ;RS232 接 口 ;数 据 显 示 中 图 分 类 号 :TN710.9 文 献 标 识 码 :A 文 章 编 号 :1002G4956(2018)06G0050G04
电子信息专业综合实验是电子类和信息类各专业 的专业实践环节一门 必 修 课,是 完 成 本 科 教 学 的 重 要 环节,一般 安 排 在 本 科 四 年 级 的 第 一 学 期 开 学 完 成. 综合实验旨在提高学 生 动 手 能 力,丰 富 学 生 的 创 新 实 践 知 识 的 实 验 教 学 . 因 此 ,综 合 实 验 应 体 现 综 合 性 、阶 段性、创造性 和 开 放 性 . [1] 学 生 通 过 电 子 信 息 专 业 综 合 实 验 ,加 强 本 科 专 业 课 程 之 间 的 联 系 ,提 高 学 生 的 综 合 实 验 能 力 . 通 过 实 验 ,使 学 生 能 够 由 浅 入 深 、更 加 系
8051F330串口接收程序
/********************************************************************
函数功能:将位选和显示码值写入74HC595,刷新数码管的位选和显示值。
入口参数:无。
返 回:无。
备 注:5ms左右刷新一次,若刷新太慢了人眼会感觉出数码管的闪烁。
函数功能:将传进的参数number转换成十六进制数,写入全局变量displayNum,
用于数码管显示,显示一个无符号char型,即:两位十六进制数。
入口参数:number:要在数码管上显示的数值。
返 回:无。
备 注:无。
********************************************************************/
//Delay(1);
NUM_SCK=1; //上升沿数据移位
//Delay(1);
NUM_SCK=0; //下降沿不变
//Delay(1);
}
//////////////////////////Pino Electronics///////////////////////////
}
//////////////////////////Pino Electronics///////////////////////////
/********************************************************************
函数功能:往74HC595芯片的移位寄存器中写入一个bit并移位。
displayNumCode[3]=numCode[displayNum[3]];
pcf859芯片的使用
pcf859芯片的使用PCF8591芯片的使用基于PCF8591的AD—DA的程序设计。
本设计是通过PCF8591芯片选择通道1将滑动变阻器的电压记过A/D转换,有单片机读回,并在数码管显示,比且有这个数据再经过D/A转换成模拟电压驱动发光二极管。
发光二极管的亮度与数码管显示的电压值相对。
1. PCF8591芯片PCF8591是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个输出和一个串行I2C总线接口。
3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至I2C总线而不需要额外硬件。
器件地址、控制和数据通道通过两线双向I2C总线传输。
器件功能包括多路复用模拟量输入、片上跟踪和保持功能、8位模数转换和8位数模转换。
最大转换速率取决于I2C总线的最高速率。
我实现的AD转换是使用通道0将滑动变阻器两端的电压AIN0~AIN3:模拟信号输入端。
A0~A2:引脚地址端。
VDD、VSS:电源端。
(2.5~6V)SDA、SCL:I2C 总线的数据线、时钟线。
OSC:外部时钟输入端,内部时钟输出端。
EXT:内部、外部时钟选择线,使用内部时钟时 EXT 接地。
AGND:模拟信号地。
AOUT:D/A 转换输出端。
VREF:基准电源端。
地址:I2C总线系统中的每一片PCF8591通过发送有效地址到该器件来激活。
该地址包括固定部分和可编程部分。
可编程部分必须根据地址引脚A0、A1和A2来设置。
在I2C 总线协议中地址必须是起始条件后作为第一个字节发送。
地址字节的最后一位是用于设置以后数据传输方向的读/写位。
(见下图)控制字:发送到PCF8591的第二个字节将被存储在控制寄存器,用于控制器件功能。
控制寄存器的高板字节用于允许模拟输出,和将模拟输入编程为单端过查分输入。
低半字节选择一个有高板字节定义的模拟输入通道。
如果自动增量标志置1,每次A/D转换后通道号将自动增加。
如果自动增量模式是使用内部振荡器的应用中所需要的,那么控制字中模拟输出允许标志应置1。
C8051F310_SMBus_已通过调试
用了半个月才调通的,希望大家收藏,下载,交流//SMBus.c文件/*************************************************************//* 例程是新华龙官网的原来用的是AT24C256现在用A T24C08 *//* 地址原来用高位和地位现在把它改成只是一个读写地址*//*************************************************************/#define INT_ISR_C#include <c8051f310.h>#include <intrins.h>#include "smbus.h"#include "uart0.h"#include "delay.h"unsigned char i=0; // Used by the ISR to count theunsigned char temp;/************************************************************//* STA :SMBus 起始标志ARBLOST :SMBus 竞争失败标志/* STO :SMBus 停止标志ACK :SMBus 确认标志/* ACKRQ :SMBus 确认请求SI :SMBus 中断标志/***********************************************************/void I2C_Init(void){TMOD |= 0x02; //自动重装载的8 位计数器/定时器CKCON |= 0x04; //定时器0 使用系统时钟TH0 = 0xEC; //400k/s 400kHZEIE1 = 0x01; //Enable SMBus interrupt 允许SMB0 的中断请求SMB0CF |= 0xD0; //Enable SMBus and 允许SDA 建立和保持时间扩展禁止从方式SMB0CN |= 0x80; //SMBus 工作在主方式TR0 = 1; //Enable timer1}void Timer3_Init(void){TMR3RLL = 0x9F; //Timer3 will overflow at 25msTMR3RLH = 0x38;EIE1 |= 0x80; //Enable timer3 interrupt 允许TF3L 或TF3H 标志的中断请求TMR3CN = 0x04; //使能定时器3}//------------------------------------------------------------------------------------// Timer3 Interrupt Service Routine (ISR)//------------------------------------------------------------------------------------//// A Timer3 interrupt indicates an SMBus SCL low timeout.// The SMBus is disabled and re-enabled here//void Timer3_ISR (void) interrupt 14{SMB0CF &= ~0x80; // 禁止SMBusSMB0CF |= 0x80; // 重新启动SMBusTMR3CN &= ~0x80; // 中断标志清零}//------------------------------------------------------------------------------------// SMBus Interrupt Service Routine (ISR) SMB0DA T存放地址的//------------------------------------------------------------------------------------//// SMBus ISR state machine// - Master only implementation - no slave or arbitration states defined// - All incoming data is written starting at the global pointer <pSMB_DATA_IN>// - All outgoing data is read from the global pointer <pSMB_DATA_OUT>//void SMBus_ISR (void) interrupt 7{bit FAIL = 0; // Used by the ISR to flag failed// transfers// number of data bytes sent or// receivedstatic bit SEND_START = 0; // Send a startswitch (SMB0CN & 0xF0) // Status vector 高四位&上不变低四位都为零{// Master Transmitter/Receiver: START condition transmitted.case SMB_MTSTA://【送器件地址】//开始传送case 是0xE0 SMB0DAT = (TARGET|SMB_RW); // Load address of the target slave//0XA1// SMB0DAT |= SMB_RW // Load R/W bitSTA = 0; // Manually clear START bit STA :SMBus 起始标志i = 0;// reset data byte counterbreak;/*为什么一开始第一步EEPROM_ByteRead()就要返回值?结果到最后temp里有值却不返回*//*按照每个地址存一个一不应该下下移啊找的原因了*/// Master Transmitter: Data byte (or Slave Address) transmittedcase SMB_MTDB://case 是0xC0 // (MT) 数据字节传送SMB0CN :SMBus 控制寄存器if (ACK) /*时序上是低电平这个也可能是原因*/// Slave Address or Data Byte 接收到“确认”{ // Acknowledged?if (SEND_START) //{ /*按照时序应答之后开始根据程序的话会先进入判断之后再开始*/STA = 1; //SMBus开始SEND_START = 0;break;}if(SMB_SENDWORDADDR) // Are we sending the word address? 高八位{SMB_SENDWORDADDR = 0; // Clear flag 高八标志位SMB0DA T = WORD_ADDR; /*因为是AT24C08这只送一位地址*///【送高位地址】end word's high 8bits addressif (SMB_RANDOMREAD){SEND_START = 1; // send a START after the next ACK cycleSMB_RW = READ;}break;}// else if(SMB_SENDWORDADDR1) // Are we sending the word address? 低八位// {// SMB_SENDWORDADDR1 = 0; // Clear flag// SMB0DAT = WORD_ADDR1;//【送低位地址】send word's low 8bits address // /*一下注销部分移到上面因为只传一位地址*///// if (SMB_RANDOMREAD)//// {//// SEND_START = 1; // send a START after the next ACK cycle//// SMB_RW = READ;//// }//// break;// }if (SMB_RW==WRITE) // Is this transfer a WRITE?{if (i < SMB_DA TA_LEN) // Is there data to send? SMB_DATA_LEN = 1;{ //【写数据】SMB0DAT = *pSMB_DATA_OUT; // send data byte *pSMB_DATA_OUT是指针指的是地址pSMB_DATA_OUT++; // increment data out pointer数据++是加地址指向例如从0x00>>0x01i++;}else{STO = 1; // set STO to terminte transfer 传送接收SMBUS_WRITE_FLAG=1; //加标志位i = 0; //i 清零}}else {} // If this transfer is a READ,// then take no action. Slave// address was transmitted. A// separate 'case' is defined// for data byte recieved.}else // If slave NACK,{if(SMB_ACKPOLL){STA = 1; // Restart transfer}else{FAIL = 1; // Indicate failed transfer} // and handle at end of ISR}break;// Master Receiver: byte receivedcase SMB_MRDB: //0x80 //(MR) 数据字节接收P0:端口0 寄存器if(ACK){if(SMB_RW==READ){i++;temp = SMB0DAT;if (i == SMB_DATA_LEN) // This is the last byte{ACK = 0; // Send NACK to indicate last byteSMBUS_RECV_FLAG=1; // of this transferSTO = 1;i = 0; // Send STOP to terminate transfer}}}break;default: //所以的case事件都不成立的执行的事件FAIL = 1; // Indicate failed transfer// and handle at end of ISRbreak;}if (FAIL) // If the transfer failed,{SMB0CN &= ~0x40; // Reset communicationSMB0CN |= 0x40; //先清零再发送模式}SI=0; // clear interrupt flag 清中断}//------------------------------------------------------------------------------------// Functions//------------------------------------------------------------------------------------//------------------------------------------------------------------------------------// EEPROM_ByteWrite ()//------------------------------------------------------------------------------------//// This function writes the value in <dat> to location <addr> in the EEPROM then// polls the EEPROM until the write is complete./*addr原为int型unsigned int addr 现改成unsigned char addr */void EEPROM_ByteWrite( unsigned char addr, unsigned char dat ) //地址数据{// Set SMBus ISR parametersTARGET = EEPROM_ADDR; // Set target slave addressSMB_RW = WRITE; // Mark next transfer as a writeSMB_SENDWORDADDR = 1; // Send high 8bits Word Address after Slave Address// SMB_SENDWORDADDR1 = 1; /*原来为256两位地址现注销掉*/ Send low 8bits Word Address after Slave AddressSMB_RANDOMREAD = 0; // Do not send a START signal after// the word addressSMB_ACKPOLL = 1; // Enable Acknowledge Polling (The ISR// will automatically restart the// transfer if the slave does not// acknoledge its address.// Specify the Outgoing DataWORD_ADDR = addr; /*AT24C08 一位地址修改*/// WORD_ADDR = addr/256; /*原来为256两位地址现注销掉*/Set the target address in the// EEPROM's internal memory space// WORD_ADDR1 = addr%256; /*原来为256两位地址现注销掉*/Set the target address in the// EEPROM's internal memory spaceSMB_SINGLEBYTE_OUT = dat; // store dat (local variable) in a global// variable so the ISR can read it after// this function exitspSMB_DATA_OUT = &SMB_SINGLEBYTE_OUT; // The outgoing data pointer points toSMB_DATA_LEN = 1; // Specify to ISR that the next transfer// will contain one data byte// Initiate SMBus TransferSTA = 1;}//------------------------------------------------------------------------------------// EEPROM_ByteRead ()//------------------------------------------------------------------------------------//// This function returns a single byte from location <addr> in the EEPROM then// polls the <SMB_BUSY> flag until the read is complete.//unsigned char EEPROM_ByteRead( unsigned char addr) //读的时候只能读一个字节,其他的是没有存,存不住的{ //即使放到了temp_char[8]中,但是在上电时就会失去了// Set SMBus ISR parametersTARGET = EEPROM_ADDR; // Set target slave addressSMB_RW = WRITE; // A random read starts as a write// then changes to a read after// the repeated start is sent. The// ISR handles this switchover if// the <SMB_RANDOMREAD> bit is set.SMB_SENDWORDADDR = 1; // Send high 8bits Word Address after Slave Address// SMB_SENDWORDADDR1 = 1;/*原为256两位地址现注销掉*/ // Send low 8bits Word Address after Slave AddressSMB_RANDOMREAD = 1; //SMB_RW = READ; // Send a START after the word addressSMB_ACKPOLL = 1; // Enable Acknowledge Polling// Specify the Incoming DataWORD_ADDR = addr; /*AT24C08 一位地址修改*/// WORD_ADDR = addr/256;/*原来为256两位地址现注销掉*/Set the target address in the// EEPROM's internal memory space// WORD_ADDR1 = addr%256;/*原来为256两位地址现注销掉*/Set the target address in the// EEPROM's internal memory spaceSMB_DATA_LEN = 1; // Specify to ISR that the next transfer// will contain one data byte// Initiate SMBus TransferSTA = 1;while(SMBUS_RECV_FLAG==0); /*原两句注销到了,所以每次STA = 1之后就开始返回*/SMBUS_RECV_FLAG=0; /*加上之后是等STO = 1也就是结束之后再返回这个值*///有return retval 就相当于A=retval return temp;}//SMBus.h文件///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////extern void I2C_Init(void);extern void Timer3_Init(void);extern unsigned char temp_char[12];extern bit SMBUS_RECV_FLAG;extern bit SMBUS_WRITE_FLAG;sfr16 DP = 0x82;sfr16 ADC0 = 0xbd;sfr16 ADC0GT = 0xc3;sfr16 ADC0LT = 0xc5;sfr16 RCAP2 = 0xeb;sfr16 TMR2 = 0xcc;sfr16 TMR3 = 0x94;#ifdef INT_ISR_C#define WRITE 0x00 // SMBus WRITE command#define READ 0x01 // SMBus READ command// Device addresses (7 bits, lsb is a don't care)#define Write_EE_Addr 0xA0 //器件写地址+写命令#define Read_EE_Addr 0xa1 //器件写地址+读命令#define EEPROM_ADDR 0xA0 // 铁电存储器的地址// Note: This address is specified// in the Microchip 24C256// datasheet.// SMBus Buffer Size#define SMB_BUFF_SIZE 0x08//接收和发送的长度可以改吗?// Defines the maximum number of bytes//应该是没用上这个声明// that can be sent or received in a// single transfer// Status vector - top 4 bits only#define SMB_MTSTA 0xE0 // (MT) 开始传送ACC:累加器#define SMB_MTDB 0xC0 // (MT) 数据字节传送SMB0CN :SMBus 控制寄存器#define SMB_MRDB 0x80 // (MR) 数据字节接收P0:端口0 寄存器// End status vector definition//------------------------------------------------------------------------------------// Global V ARIABLES//------------------------------------------------------------------------------------unsigned char* pSMB_DATA_IN; // Global pointer for SMBus data// All receive data is written hereunsigned char SMB_SINGLEBYTE_OUT; // Global holder for single byte writes.unsigned char* pSMB_DATA_OUT; // Global pointer for SMBus data.// All transmit data is read from hereunsigned char SMB_DA TA_LEN; // Global holder for number of bytes// to send or receive in the current// SMBus transfer.unsigned char WORD_ADDR; // Global holder for the EEPROM word// high 8bits address that will be accessed in// the next transferunsigned char WORD_ADDR1; // Global holder for the EEPROM word// low 8bits address that will be accessed in// the next transferunsigned char TARGET; // Target SMBus slave address// EEPROM_ByteRead() or// EEPROM_ByteWrite()// functions have claimed the SMBusbit SMB_RW; // Software flag to indicate the// direction of the current transferbit SMB_SENDWORDADDR; // When set, this flag causes the ISR// to send the high 8-bit <WORD_ADDR>// after sending the slave address.bit SMB_SENDWORDADDR1; // When set, this flag causes the ISR// to send the low 8-bit <WORD_ADDR>// after sending the slave address.bit SMB_RANDOMREAD; // When set, this flag causes the ISR// to send a START signal after sending// the word address.bit SMB_ACKPOLL; // When set, this flag causes the ISR// to send a repeated START until the// slave has acknowledged its address#endifvoid EEPROM_ByteWrite(unsigned char addr, unsigned char dat); /*AT24C08一位地址修改成char原int型*/unsigned char EEPROM_ByteRead(unsigned char addr); /*AT24C08一位地址修改成char原int型*/void Port_IO_Init(void);void Oscillator_Init(void);void UART_Init(void);void UART_Isr(void);void I2C_Init(void);void Timer3_Init(void);void Timer3_ISR (void);void SMBus_ISR (void);over。
基于C8051F310的PCA模块在Modbus通信网络中的应用
基于C8051F310的PCA模块在Modbus通信网络中的应用王德志【摘要】针对现场仪器仪表对Modus通信网络组网的要求,该文分别从硬件设计、PCA0捕捉转换算法设计和RS485收发程序设计等方面介绍Modbus ASCⅡ码传输方式在RS485电气接口中的实现方法.以磁漩涡流量计为实验载体,利用C8051F310中PCA模块的边沿触发捕捉功能,可以实现0~10V,4~20 mA模拟量或脉冲频率信号与Modus标准协议语言间的高精度转换.该方案利用中断方式而非查询方式进行外部脉冲信号的检测,响应时间快、主从通讯容错性高、已经成功应用在磁漩涡流量计Modus并网系统中,转换误差控制在2%以内.该方案通用性和实用性强,能够实现对大部分现场仪表传统信号转换和Modus并网的要求.【期刊名称】《自动化与仪表》【年(卷),期】2015(030)002【总页数】5页(P72-76)【关键词】C8051F310;PCA计数器/定时器;脉冲频率信号;Modbus;RS485【作者】王德志【作者单位】包头职业技术学院电气工程系,包头014030【正文语种】中文【中图分类】TP273Modbus的分布式应用及标准协议使得控制器之间、控制器与网络和其它设备之间通讯成为可能。
因此,不同厂家的控制或测量设备可以连成工业网络,进行集中监控或数据反馈。
为了使终端设备具有更好的系统兼容性和市场竞争力,监测设备应具有多种方便通讯的外部接口。
模拟量信号如0~10 V,4~20 mA,数字量信号如脉冲频率信号输出接口应用广泛,而Modbus通讯协议及RS485接口作为分布式控制系统的通用标准,可以进一步满足现代设备的智能化联网要求。
本文提出了一种脉冲频率信号精确转换为Modbus协议帧数据的方案,以具备脉冲输出功能的磁漩涡流量计为实验载体,利用C8051F310中的PCA捕捉/比较模块的边沿触发捕捉功能,计算出单位时间内脉冲的个数和对应的脉冲频率,以RS485为电气接口,Modbus ASCII码为传输方式构成工业网络中的1个节点完成即时通讯。
C8051F系列单片机串口通讯程序
C8051F系列单片机串口通讯程序C8051F系列单片机串口通讯程序采用C8051F020单片机//串口编程--接收PC发过来的字符串,回发字符串.发送期间中断控制LED灯闪烁//采用外部晶振22.1184MHz 使用定时器1,方式2产生波特率,SMOD = 0或者 1 //定时器初值X=256-SYSCLK*(SMOD+1)/(BAUDRATE*384)/#includesfr16 TMR3RL = 0x92; //定时器3重装载寄存器sfr16 TMR3 = 0x94; //定时器3计数器#define uchar unsigned char#define uint unsigned int//----------------------------------------------------------------------//参数设置区//----------------------------------------------------------------------#define BAUDRATE 4800 //波特率bps#define CLKOUT 22118400 //外部晶振,修改也要修改OSCXCN #define SMODVAL 0 //SMOD的值,修改请也修改PCONVAL#define PCONVAL 0x00 //PCON的值,=0x00时SMOD0=0; =0x80时SMOD0=1 #define TXVAL (256-CLKOUT*(SMODVAL+1)/BAUDRATE/384) //定时器初值#define MAX_LEN 10 //每次接收/发送字符串的长度//---------------------------------------------------------------------//全局变量//---------------------------------------------------------------------sbit LED = P1^6; //LED '1'亮'0'灭bit readFlag = 0; //读标志uchar readCounts = 0; //已经读取的字符个数,与MAX_LEN比较uchar idata trdata[MAX_LEN]; //要接收/发送的字符串//----------------------------------------------------------------------//子函数声明//---------------------------------------------------------------------- void SYSCLK_Init(void); //系统时钟初始化void PORT_Init(void); //端口初始化void UART0_Init(void); //串口UART0初始化void Send_Char(uchar ch); //发送单个字符void Send_String(uchar * str, uint len); //发送一个字符串void UART0_ISR(); //串口中断服务程序,接收字符void Timer3_Init(uint counts); //定时器3初始化void Timer3_ISR(void); //定时器3中断服务程序//---------------------------------------------------------------------- //主函数//---------------------------------------------------------------------- void main(void){WDTCN = 0xde; //禁止看门狗WDTCN = 0xad;SYSCLK_Init(); //时钟初始化PORT_Init(); //端口初始化UART0_Init(); //串口初始化Timer3_Init(CLKOUT/12/10); //定时器初始化EA = 1; //开全局中断while(1){if(readFlag) //已经读取{readFlag = 0; //清零Send_String(trdata,MAX_LEN); //发送字符串}}}//----------------------------------------------------------------------//子函数具体实现//----------------------------------------------------------------------//系统时钟初始化void SYSCLK_Init(void){uint i;OSCXCN = 0x67; //采用外部晶振22.1184MHz,不分频. 选型OSCXCN=0110,0111 for(i=0;i<256;i++); //等待>1mswhile(!(OSCXCN&0x80)); //查询直到XTLVLD=1,晶振稳定OSCICN = 0x88; //切换到外部振荡器,允许时钟失效监测器. OSCICN=1000,1000 }//端口初始化void PORT_Init(void){XBR0 = 0x04; //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100XBR1 = 0x00;XBR2 = 0x40; //交*开关使能P0MDOUT |= 0x03; //P0.0为推拉方式输出,即TX0,RX0所在的端口0000,0011P1MDOUT |=0x40; //P1.6为推拉方式输出,即LED所在的端口0100,0000}//串口初始化void UART0_Init(void){SCON0 = 0x50; //选择串口方式1,波特率可变SCON0=0101,0000TMOD = 0x20; //选择T1,方式2,自动再装入8位计数器TH1 = (int)TXVAL; //T1初值,根据波特率,时钟等计算. 0xF4, bps=4800bpsTL1 = (int)TXVAL;ES0 = 1; //UART0中断开启TR1 = 1; //启动定时器T1PCON |= PCONVAL; //PCON=0x00,SMOD = 0 ; PCON=0x80,SMOD=1 TI0 = 1; //声明TX0就绪,可以发送TR0 = 1;}//定时器初始化void Timer3_Init(uint counts){TMR3CN = 0x00; //禁止定时器T3,清TF3,采用SYSCLK/12为时基TMR3RL = -counts; //初始化重装载值TMR3 = 0xffff; //设置为立即重装载EIE2 |= 0x01; //T3中断开启TMR3CN |= 0x04; //启动T3}//发送单个字符void Send_Char(uchar ch){SBUF0 = ch; //送入缓冲区while(TI0 == 0); //等待发送完毕TI0 = 0; //软件清零}//发送字符串,调用Send_Char() len字符串长度void Send_String(uchar * str,uint len){uint k = 0;do{Send_Char(*(str + k));k++;} while(k < len);}//定时器3中断服务程序void Timer3_ISR(void) interrupt 14 using 0 {TMR3CN &= ~(0x80); //清TF3LED = ~LED;}//UART0中断服务程序. 接收字符void UART0_ISR(void) interrupt 4 using 1 {uchar rxch;if(RI0) //中断标志RI0=1 数据完整接收{RI0 = 0; //软件清零rxch = SBUF0; //读缓冲if(readCounts>=MAX_LEN){readCounts = 0;readFlag = 1;}trdata[readCounts] = rxch; //存入数组,供发送readCounts++;}}//------------------------------------------------------------- //程序结束。
C8051F340单片机双串口同时工作 中断接收数据 查询发送数据源程序
OSCICN |= 0x83; // Configure internal oscillator for
// its maximum frequency and enable
//
//-----------------------------------------------------------------------------
void UART1_Init (void)
{
SMOD1 = 0x0C; // UART1 8位数据
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure UART1 for baudrate1 and 8-N-1.
SCON1 = 0x70; // 接收允许,清发送和接收中断
if (SYSCLK/BAUDRATE1/2/0xFFFF < 1)
{
SBRL1 = -(SYSCLK/BAUDRATE1/2);
SBCON1 |= 0x03; // set prescaler to 1
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSTEMCLOCK_Init (void);
void PORT_Init (void);
C8051F020-FM24C16收发测试程序
//FM24C16收发测试程序(通过)//收发有错误是因为收发数组定义长度问题//ur0第一次收不到30而第二次收的数据又覆盖了部分第一的数据//SMB的收发也有上述问题造成收发有错误/**********************************************文件描述:三相电测量上报功能说明:测量ATT7022B完成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 crystal for(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 flagTMOD |= 0x01; // configure Timer0 to 16-bit modeCKCON |= 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 1us TL0 = -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(ATT_JB[])//功能:写校表寄存器//说明:UART口接收校表时间并存于FM24C256中//*****************************************void jiaob (void){}main(){disable_wdog(); //关看门狗init_sysclk (); //时钟初始化init_ioport(); //交叉开关配置my_add(); //读设备子地址设置UART0_Init(); //UART0初始化SPI0_Init ();init_smbus();EX1= 1; //开INT1EA = 1; //开中断// SPIEN=1;uart0_flag=0;while(1){if(uart0_flag){uart0_flag=0; // ATT_Read (ur0_rxd[0]);// 写fm24c256字节数// 写fm24c256字节记数fm_ram_add=0; // 写fm24c256起始地址smbus_send (fm_send_len);fm_ram_add=0;smbus_receive(fm_receive_len);m=&fm_read_buf[0];txd_string(m,30);}}}//*******************************************void init_smbus(void){SMB0CN=0x44; //IIC总线控制寄存器01000100SMB0CR=0xA4; //-(SYSCLK/2*SCL);IIC总线速率寄存器SCL=100K//允许IIC总线中断,标志位是SI(SMB0CN.3)EIE1 |=0x02; //SMBUS中断使能EA = 1; //中断使能sm_busy=0; //总线空闲中断接收发完成标志开始置1ENSMB=1; //SMBUS0使能}//-----向给定寄存器地址写一个字节-------//void smbus_send (uchar fm_send_len){//fm_send_len=30; // 写fm24c256字节数fm_send_count=0; // 写fm24c256字节记数while(sm_busy); // Wait for SMBus to be free.sm_busy=1; // Occupy SMBus (set to busy)sm_r_s_flag=1;fm_send_len=30; // 写fm24c256字节数STO=0;STA=1; // Start transferwhile (sm_busy); // Wait for transfer to finish}//-----从给定寄存器地址读一个字节-------//void smbus_receive (uchar fm_receive_len){//fm_receive_len=30; // 读fm24c256字节数fm_receive_count=0; // 读fm24c256字节记数while (sm_busy); // Wait for bus to be free.sm_busy=1; // Occupy SMBus (set to busy)sm_r_s_flag=0;fm_receive_len=30;STO=0;STA=1; // Start transferwhile(sm_busy); // Wait for transfer to finish}//-----SMBUS中断服务程序---//void smbus(void) interrupt 7{ES0=0;switch (SMB0STA)//SMBUS状态寄存器SMB0STA{//fm_err_flag=1说明SMBus有问题case 0x08:if(sm_r_s_flag) //判断收发{chip_select=0xA0;}else chip_select=0xA1;//主发送/接收:起始条件已发出.STA=0;fm_err_flag=0;AA=1; //清除起始位STA,应答SMB0DA T=chip_select; //从地址+读/写标志送SMB0DA T,break;case 0x10://主发送/接收:重复起始条件已发出。
FX系列PLC的功能指令及应用
除法指令
DIV指令用于将两个输入信号进行除 法运算,输出结果为第一个输入除以 第二个输入。
程序控制指令
跳转指令
JMP指令用于跳过一段程序,直接跳转到指定的地址执行程序。
子程序调用指令
CALL指令用于调用子程序,并在子程序执行完毕后返回到原程 序继续执行。
循环指令
LOOP指令用于重复执行一段程序,直到满足某个条件为止。
特点
高可靠性、强抗干扰能力、设计简单 、使用方便、维护简单、体积小、能 耗低等。
plc的历史与发展
起源
20世纪60年代初期,美国率先研制出第一台可编程逻辑控制 器。
发展
随着微处理器技术的不断发展,PLC的功能日益强大,应用 范围越来越广。
fx系列plc简介
定义
FX系列PLC是指三菱电机公司推出的 一系列可编程逻辑控制器。
运行。
算术运算指令在温度控制系统中的应用
总结词
算术运算指令在温度控制系统中具有重要应 用,主要用于温度的实时计算和控制。
详细描述
通过使用算术运算指令,如加法、减法、乘 法、除法等,PLC可以对温度传感器采集的 温度数据进行实时计算和控制。例如,在加 热炉的温度控制系统中,PLC会根据采集到 的温度数据和设定的目标温度,通过算术运 算指令计算出控制电平的大小,从而控制加
TMR指令用于计时操作,根据设 定的时间间隔或时间点触发相应 的动作。
计数器指令
CTR指令用于计数操作,根据外 部设备的脉冲信号或计数值的变 化来计数。
03 功能指令的应用
逻辑运算指令的应用
逻辑与指令
逻辑非指令
用于将两个输入信号进行逻辑与运算, 输出一个信号,当两个输入信号都为 高电平时,输出信号为高电平。
捷星广达 UTREK-310 实时软件接收机和中频数据采集系统用户使用手册说明书
一 简介........................................................................................................... 7
包装列表............................................................................................ 8
使 用
警告:表示可能造成设备损坏。
手 册
斜体条目:表示该项或其缩写列在术语表中。
5
捷星广达:致力于全球视野的卫星导航技术!
目录
注意................................................................................................................... 3 目录................................................................................................................... 6
6
捷星广达:致力于全球视野的卫星导航技术!
一
简介
UTREK-310 是一款针对 GPS 的 L1 频段 CA 码信号和 GLONASS 卫星导航系统 L1
频段信号特点设计的双模卫星中频信号采集系统和实时软件接收机,包括了射频前
端和 PC 机接口硬件系统和数据处理软件包。其射频前端对来自天线的 GPS 和
包装列表
本产品包装共包含如下明细条目:
用
UTREK-310 主机
C8051F310EVM使用指南
C8051F310EVM使用指南2011.7一、系统资源1.CPU:C8051F310主频 24.5MHz(片内振荡器),11.0592MHz(外接石英晶体)SRAM 256B+1KBFlash ROM 16KB2.主要外设资源:数码管:4位LED指示灯:8+1 位蜂鸣器:1键盘:4X4阵列键盘复位键:1外部触发键:1电源指示灯:1A/D输入通道:1异步通信接口:1JTAG调试口:1(10pin)3. 电源:5V/2A 2.5mmJACK二、可开设的实验三、接口电路使用指南1.7段LED数码管①数码管型号:LG3641AH,四位,共阴高亮注:数码管段控输出高电平对应段亮2.矩阵键盘①I/O口使用情况②键盘连接图3.LED指示灯阵列LED指示灯阵列由8个LED指示灯组成,单片机通过74HCT164控制指示灯的开关。
②I/O口使用情况②74HCT164和指示灯的对应关系注:Q 为0,对应的LED发光。
4.蜂鸣器及独立指示灯蜂鸣器及独立指示灯D9(黄光)由单片机的I/O口单独控制,具体如下:5.A/D输入接口本平台可对外部输入的模拟电压信号进行A/D采集,电压输入引脚为P3.2,电压输入范围为0 – 3.3V,通过跳线开关JP1可以选择不同的输入电压源,具体如下:注:2) 3V3为实验平台的3.3电源电压值3) JP1上只能插入一只跳线片6.UART接口通过连接器J3,实验平台之间可以通过UART接口实现双机通信,接口电平为3.3V,J3的连线具体如下:7.触发按键输入触发按键KINT为独立按键,连接到单片机的P0.1口,按键压下时为低电平。
8.手动复位按键手动复位按键KMR为单片机外部复位按键,按下该键并松开单片机开始复位。
9.JTAG接口JTAG接口(J4)为10芯扁平电缆插座,通过它连接U-EC5仿真器,可以在电脑上仿真调试试验平台上的全部硬件和系统软件。
10.电源接口J3本实验平台使用专用的5V电源适配器,不得将其它类型的电源适配器与之相连,否则会引起实验平台损坏。
PCF8591应用程序实例
1、引言I2C总线是Philips公司推出的串行总线,整个系统仅靠数据线(SDA)和时钟线(SCL)实现完善的全双工数据传输,即CPU与各个外围器件仅靠这两条线实现信息交换。
I2C总线系统与传统的并行总线系统相比具有结构简单、可维护性好、易实现系统扩展、易实现模块化标准化设计、可靠性高等优点。
在一个完整的单片机系统中,A/D转换芯片往往是必不可少的。
PCF8591是一种具有I2C总线接口的A/D转换芯片。
在与CPU的信息传输过程中仅靠时钟线SCL和数据线SDA就可以实现。
2、芯片介绍PCF8591是具有I2C总线接口的8位A/D及D/A转换器。
有4路A/D转换输入,1路D/A模拟输出。
这就是说,它既可以作A/D转换也可以作D/A转换。
A/D转换为逐次比较型。
引脚图如图1所示。
结构图如图2所示。
电源电压典型值为5V。
AIN0~AIN3:模拟信号输入端。
A0~A3:引脚地址端。
VDD、VSS:电源端。
(2.5~6V)SDA、SCL:I2C总线的数据线、时钟线。
OSC:外部时钟输入端,部时钟输出端。
EXT:部、外部时钟选择线,使用部时钟时EXT接地。
AGND:模拟信号地。
AOUT:D/A转换输出端。
VREF:基准电源端。
3 应用3.1 器件总地址PCF8591采用典型的I2C总线接口器件寻址方法,即总线地址由器件地址、引脚地址和方向位组成。
飞利蒲公司规定A/D器件地址为1001。
引脚地址为A2A1A0,其值由用户选择,因此I2C系统中最多可接23=8个具有I2C总线接口的A/D器件。
地址的最后一位为方向位R/ ,当主控器对A/D器件进行读操作时为1,进行写操作时为0。
总线操作时,由器件地址、引脚地址和方向位组成的从地址为主控器发送的第一字节。
3.2 控制字节控制字节用于实现器件的各种功能,如模拟信号由哪几个通道输入等。
控制字节存放在控制寄存器中。
总线操作时为主控器发送的第二字节。
其格式如下所示:其中:D1、D0两位是A/D通道编号:00通道0,01通道1,10通道2,11通道3D2 自动增益选择(有效位为1)D5、D4模拟量输入选择:00为四路单数入、01为三路差分输入、10为单端与差分配合输入、11为模拟输出允许有效。
使用C8051F的串口对MAX485进行自发自收
使用C8051F的串口对MAX485进行自发自收一、系统功能使用C8051F的串口对MAX485进行自发自收二、硬件设计三、软件设计下面部分从TXT拷出,拷到网页,代码部分缺省了很多空格,比较凌乱,请谅解!USART详细程序请查看C8051F USART程序。
//目标系统: 基于C8051F单片机//应用软件: Silicon IDE / Keil/*01010101010101010101010101010101010101010101010101010101010101010101 ----------------------------------------------------------------------实验内容:在8位LED灯上查看MAX485芯片自发自收的数据。
----------------------------------------------------------------------硬件连接:P2口连接8位LED指示灯DVK501(MAX485PrlPort) F320 EXVCC --------- VCCGND --------- GNDRO --------- P0.5DI --------- P0.4----------------------------------------------------------------------注意事项:(1)若有加载库程序,请将光盘根目录下的“library”下的“C8051F”文件夹拷到D盘(2)请详细阅读:光盘根目录下的“说明书首页.htm”里的相应产品说明---------------------------------------------------------------------- 10101010101010101010101010101010101010101010101010101010101010101010*/#define _DVK501_F320_EX_#include <c8051f320.h>#include <../../../../library/C8051F/ws_clock.h>#include <../../../../library/C8051F/ws_delay.h>#include <../../../../library/C8051F/ws_usart_port.h>void main(void){uchar tmp = 0,a = 0;PCA0MD &= ~0x40;XBR1 = 0x40;clock_external();usartInit();while(1){putUsart0(tmp);delay_ms(100);a = getUsart0();P2 = a;tmp++;delay_ms(1000);}}系统调试连接P2与8位LED指示灯,把RO与DI用跳线短接,查看现象。
C8051F310实验
设置调试器 点击Silicom Labs C8051Fxxx Drivers 右边的Settings 进入调 试器设置窗口,见图。 本调试器是USB 型的,故做相应选择,如图所示。
检查设置 点击Start/Stop Debug Session 按钮,即可使得uVision 连接目 标板,
连接成功后,可在Regs 寄存器窗口看到相应寄存器值,并在外 围设备Peripherals菜单中有各个外围设备的寄存器,如图所示。
交叉开关配置
1)交叉开关负责SMBus、SPI、UART、定时器捕捉模块、 外部PCA、输入比较器、输出定时器、外部输入/SYSCLK 以及A/D转换启动输入的引脚分配 2)必须在访问这些外设的I/O之前配置和允许交叉开关 3)未指定的端口引脚作为通用I/O 交叉开关引脚分配给IO 口分配数据外设的方法有两种: 1)按照“优先权交叉开关译码表”并参考相关特殊功能寄 存器的值来定义. 2)用配置向导,在Cygnal IDE 中,选择Tools->Cygnal Configuration Wizard,进入配置向导界面进行IO 口配置。
MCU资源初始化配制软件的使用
禁止看门狗
MCU资源初始化配制软件的使用
中断的设置
MCU资源初始化配制软件的使用
MCU资源初始化配制软件的使用
初始化完后可以保存为代码文件
MCU资源初始化配制软件的使用
初始化完后也可以保存为配制工程文件
初始化完后自动生成的部分
用户编写的程序
去掉重复的SFR定义
在系统编程和调试环境如图 1-扁平电缆与适配器(EC2)连接; 将 JTAG 扁平电缆的另一端与目标系统连接; 将 USB电缆的一端与EC2 连接; 连接 USB 串行电缆的另一端到PC; 给目标系统上电
C8051FXXX单片机FLASH程序的自动升级
C8051FXXX单片机FLASH程序的自动升级C8051FXXX单片机FLASH程序的自动升级作者Email:********************引言:C8051FXXX系列高速SOC单片机是由美国Cygnal公司开发的完全集成的混合信号系统级芯片,具有与8051兼容的微处理器内核,内部集成FLASH程序存储器,具有在系统重新编程能力,以C8051F020为例,内部集成64K的FLASH程序存储器。
在系统控制软件的开发调试阶段,可用集成开发环境来下载及测试系统,但当将C8051F020目标系统集成到产品后,则由于操作系统及软硬件接口不一样等等原因,不能在最终产品中用集成开发环境来下载FLASH程序,故产品到了用户处之后,如要再进行FLASH程序的更新,则必须更换相应的集成电路印刷板,造成很多麻烦及不可靠因素。
笔者通过实验,在用户操作界面的PC机及C8051F020的单片机控制系统之间,通过串行口进行C8051F020单片机控制程序的自动升级及程序加密,从而使用户只要从互联网上下载控制程序,即可实现单片机程序的自动升级。
以下以64KBFLASH RAM为例简要介绍单片机目标程序的准备及自动升级的制作过程。
1)系统简介及自动升级的实现方法PC机(80486/DX2以上) 具有1.44吋软驱及串行口。
单片机控制系统(具有串行口及内置的FLASH程序区)。
PC与C8051FXXX之间通过九针串行接口线相连。
设置传送速率为115200BIT/S。
C8051F020单片机的FLASH RAM分为用户程序区(0000H~0FDFDH),厂家保留及加密区(0FDFEH~0FFFFH)两部分。
现将用户程序区(0000H~0FDFDH)的0000H~0DFFFH部分用于装载用户程序,而0E000H~0FDFDH部分作为引导程序区,引导程序区在升级时不能改变,它用于与用户操作界面的PC机部分进行程序接收及装载等工作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//波特率为115200#include <c8051f310.h>//----------------------------------------------------------------------------//硬件地址//----------------------------------------------------------------------------sbit LED=P1^1; //系统工作指示灯sbit TxEN=P1^2; //FX589发送使能sbit TxDATA=P1^3; //FX589发送数据位sbit RxDA TA=P1^4; //FX589接收数据位sbit SN=P2^0; //FX589信噪比指示位sbit BT=P2^1; //FX589 BT配置位sbit CLK_DIV A=P3^3; //FX589速率配置位Asbit CLK_DIVB=P3^4; //FX589速率配置位Bsbit PLL=P2^7; //FX589接收载波检测与锁相环使能//-----------------------------------------------------------------------------//变量定义//-----------------------------------------------------------------------------unsigned char flag_Tx=0; //发送中断任务标志unsigned char flag_Rx=0; //接收中断任务标志unsigned char temp_Tx=0; //发送数据绶存unsigned char temp_Rx=0; //接收数据绶存unsigned char num_Tx=0; //发送中断发数计数器unsigned char num_Rx=0; //接收中断发数计数器//-----------------------------------------------------------------------------// 端口初始化// P0.4 - UART TX// P0.5 - UART RX//-----------------------------------------------------------------------------void PORT_Init (void){P1MDOUT |= 0x02; // 使能LED 为推挽输出XBR0 = 0x01; // 交叉开关使能UART P0.4(TX) and P0.5(RX) XBR1 = 0x40; //使能交叉开关}//-----------------------------------------------------------------------------// 系统时钟初始化//-----------------------------------------------------------------------------void SYSCLK_Init (void){OSCICN |= 0x83; // 配置内部振荡器的的最大频率RSTSRC = 0x04; // 使能始终丢失检测寄存器}//-----------------------------------------------------------------------------// 串口初始化//-----------------------------------------------------------------------------void UART0_Init (void){SCON0 = 0x10; //波特率可编程8位UART,UART接收允许CKCON = 0x08; //定器1使用系统时钟(=0x08可将波特率设为115200,=00可将波特率设为9600)TMOD = 0x20; //定时器1设为自动重装8位计数定时器TH1=0X96; //为波特率装定时器初值TR1 = 1; //起动定时器1}//-------------------------------------------------------------------------//串口发送一个字节//-------------------------------------------------------------------------void Putchar(char c){SBUF0=c; //发送一个字节while(TI0==0); //等待发完一个字节TI0=0; //清除发送中断标志}//-------------------------------------------------------------------------//串口发送一个字符串//-------------------------------------------------------------------------void Putsting(char *ptr){while(*ptr!='\0') //判断是否发完一个字符串{Putchar(*ptr);ptr++;}}//----------------------------------------------------------//系统初始化//---------------------------------------------------------void sys_init(void){PCA0MD &= ~0x40; // 禁止看门狗TCON = 0x05; //外部中断0与外部中断1为下降沿触发EX0 = 1; // 关中断0使能EX1 = 1; // 外中断1使能IP |=0x04;IT01CF = 0x98; // 外中断0高有效; /外中断配置在P0.0口//外中断1高有效; /外中断配置在P0.1口PORT_Init(); // 初始化端口I/OSYSCLK_Init (); //初始化系统时钟UART0_Init(); //串口初始化EA=0; //关总中断ES0=1; //开串行中断}//-----------------------------------------------------------------------------// 串行中断服务程序//-----------------------------------------------------------------------------void UART0_ISR (void) interrupt 4{if(RI0==1){RI0=0; //复位接收中断标志位temp_Tx=SBUF0; //接收数据到缓存flag_Tx=1; //打开中断发数标志位}TI0=0; //复位发送中断标志位}//-----------------------------------------------------------------------------//外中断0服务程序//-----------------------------------------------------------------------------void INT0_ISR (void) interrupt 0{if(flag_Tx==1){TxDATA=(0xcc>>num_Tx)&0x0001;// 每到一个中断发送一个位数据if (num_Tx>=7){num_Tx=0; //清除发数位数计数器flag_Tx=2; //改变中断任务标志}else num_Tx++;}else if(flag_Tx==2){TxDATA=temp_Tx&0x01;// 每到一个中断发送一个位数据(先出低位)temp_Tx=temp_Tx>>1; //右移一位数据为下次中断发数准备if (num_Tx>=7) //判断是否发完一个字节{num_Tx=0; //清除发数位数计数器flag_Tx=0; //改变中断任务标志}else num_Tx++;}else{TxDATA=~TxDATA; //空闲时数据位翻转使收发时钟同步}}//-----------------------------------------------------------------------------//外中断1服务程序//-----------------------------------------------------------------------------void INT1_ISR (void) interrupt 2{if(flag_Rx==2){if(RxDATA){PLL=1; //时钟锁相使收发时钟同步num_Rx++;if(num_Rx>=32){PLL=0;flag_Rx=0;}}}else if(flag_Rx==0){if(RxDATA)temp_Rx|=0x80;elsetemp_Rx&=0x7f; //判断是否收到帧头if(temp_Rx==0xcc){flag_Rx=1;temp_Rx=0;}temp_Rx=temp_Rx>>1;}else if(flag_Rx==1){if(RxDATA) temp_Rx|=0x80; //接收数据else temp_Rx&=0x7f;if(num_Rx>=7){Putchar(temp_Rx); //串口发出接收到的数据temp_Rx=0;num_Rx=0;flag_Rx=0;}else{num_Rx++;temp_Rx=temp_Rx>>1;}}}//----------------------------------------------------------------------------- // 主程序//----------------------------------------------------------------------------- void main (void){unsigned int tam=0; //指示灯计数器sys_init();//初始化系统//FX589初始化CLK_DIV A=0; //同步时钟CLK_DIVB=0;BT=1; //BT=0.5TxEN=1; //发送使能TxDATA=1; //置位发送数据位RxDATA=1; //置位接收数据位flag_Rx=2; //初始化FX589同步时钟标志//工作指示灯测试LED=1;LED=0;Putsting("串口初始化OK,波特率为:115200 \n\n");EA=1; //开总中断while(1){tam++;if(tam>=65000){tam=0;LED=~LED;}}}。