STC12C5A60S2串口中断接收程序

合集下载

(word完整版)STC12C5A60S2串口通信

(word完整版)STC12C5A60S2串口通信

#include 〈intrins。

h〉#include <STC_NEW_8051.H>#include ”UART。

h”#include ”AD。

h"#define uchar unsigned char#define uint unsigned intsbit xxxx = P3^5;uint i = 0;void AD_delay(uchar d);void main(){P1ASF = 0xff; //1111,1111,将P1置成AD工作模式InitADC();InitUART();SendOneByte(0x65);//SendOneByte(’B’);// ADRJ = AUXR1^2:// 0: 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器,低2 位放在ADC_RESL 寄存器// 1: 10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位,低8 位放在ADC_RESL 寄存器AUXR1 &= ~0x04;//0000,0100取反,将ADJ=0;ADC_CONTR |= 0x80; //1000,0000打开A/D转换电源while(1){i++;if(i==10){i=0;EADC = 1; //允许A/D转换中断转到A/D函数AD_delay(10);} xxxx = 0;AD_delay(3);xxxx=1;}}void AD_delay(uchar d){uint n;while(d——){n=6000;while(n——);}}UART串口通信函数#include <intrins。

h〉#include 〈STC_NEW_8051.H>#include "UART.h"#include "AD。

h”void InitUART(void){ES = 0;//禁止串口中断TMOD = 0x20; //设置T1为波特率发生器SCON = 0x50; //0101,0000 8位数据位,无奇偶校验TH1 = -(11059200/12/32/9600); //11.0592MHz晶振,波特率= 9600 TH1=0xff—11059200/12/32/9600TL1 = TH1;PCON = 0x00;EA = 1;ES = 1;TR1 = 1;}void SendOneByte(unsigned char c){TI = 0;SBUF = c;while(!TI);TI = 0;}void SendString(unsigned char *aaaa) //data是关键字不能使用{while((*aaaa) != '\0'){SendOneByte(*aaaa);aaaa++;}}ADC转换函数#include <intrins。

STC12C5A60S2单片机的串口扩展

STC12C5A60S2单片机的串口扩展
void UART2_Init(uchar RELOAD, bit doubleBaud, bit timeMod);
void UART1_SendOneChar(uchar val);
void UART2_SendOneChar(uchar val);
void UART1_SendStr(uchar *str);
UART.H
#ifndef _UART_H_
#define _UART_H_
#define uchar unsigned char
#define uint unsigned int
//定义串口1口开关,关闭则不能接收数据
#define OpenUART1() ES=1
#define CloseUART1() ES=0
}
EA = 1;
//- - - - - - ESPI ES2
IE2 |= 0x01; //充许串口2中断
}
void UART1_SendOneChar(uchar val)
{
//ES = 0; //关闭串口1中断
SBUF = val;
while(TI == 0);
TI = 0;
//ES = 1; //恢复串口1中断
{
while((*str)!=‘/0’)
{
UART1_SendOneChar(*str);
str++;
}
}
void UART2_SendStr(uchar *str)
{
while((*str)!=‘/0’)
{
UART2_SendOneChar(*str);
str++;
}
}
void UART1_Int(void) interrupt 4

stc12c5a60s2硬件spi驱动NRF24l01程序

stc12c5a60s2硬件spi驱动NRF24l01程序

stc12c5a60s2硬件spi驱动NRF24l01程序#include#include#define MODE 0 //MODE=1时为发送代码 MODE=0时为接收代码typedef unsigned char uchar;#define uint unsigned int//****************************************IO端口定义***************************************sfr SPCTL = 0xCE; //SPI Control Register SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 0000,0100sfr SPSTAT = 0xCD; //SPI Status Register SPIF WCOL - - - - - - 00xx,xxxxsfr SPDAT = 0xCF;sbit CE =P1^0;sbit CSN =P1^1;sbit IRQ =P1^2;sbit led = P2^0;//************************************************************* *****************************uchar bdata sta; //状态标志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;//*********************************************NRF24L01***** ********************************#define TX_ADR_WIDTH 5 // 5 uints TX address width#define RX_ADR_WIDTH 5 // 5 uints RX address width#define TX_PLOAD_WIDTH 32 // 32 uints TX payload#define RX_PLOAD_WIDTH 32 // 32 uints TX payloaduchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址uchar code Tx_Buf[TX_PLOAD_WIDTH]={0xff,0xee,0x11,0x22,0x33,0xaa,0xbb, 0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0x aa,0xbb,0x11,0x22,0x33,0xee,0xff};//发送数据uchar Rx_Buf[RX_PLOAD_WIDTH];//接收数据//***************************************NRF24L01寄存器指令******************************************************* #define READ_REG 0x00 // 读寄存器指令#define WRITE_REG 0x20 // 写寄存器指令#define RD_RX_PLOAD 0x61 // 读取接收数据指令#define WR_TX_PLOAD 0xA0 // 写待发数据指令#define FLUSH_TX 0xE1 // 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令#define NOP 0xFF // 保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 // 自动应答功能设置#define EN_RXADDR 0x02 // 可用信道设置#define SETUP_AW 0x03 // 收发地址宽度设置#define SETUP_RETR 0x04 // 自动重发功能设置#define RF_CH 0x05 // 工作频率设置#define RF_SETUP 0x06 // 发射速率、功耗功能设置#define STATUS 0x07 // 状态寄存器#define OBSERVE_TX 0x08 // 发送监测功能#define CD 0x09 // 地址检测#define RX_ADDR_P0 0x0A // 频道0接收数据地址#define RX_ADDR_P1 0x0B // 频道1接收数据地址#define RX_ADDR_P2 0x0C // 频道2接收数据地址#define RX_ADDR_P3 0x0D // 频道3接收数据地址#define RX_ADDR_P4 0x0E // 频道4接收数据地址#define RX_ADDR_P5 0x0F // 频道5接收数据地址#define TX_ADDR 0x10 // 发送地址寄存器#define RX_PW_P0 0x11 // 接收频道0接收数据长度#define RX_PW_P1 0x12 // 接收频道1接收数据长度#define RX_PW_P2 0x13 // 接收频道2接收数据长度#define RX_PW_P3 0x14 // 接收频道3接收数据长度#define RX_PW_P4 0x15 // 接收频道4接收数据长度#define RX_PW_P5 0x16 // 接收频道5接收数据长度#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置/******************************************延时函数********************************************************///长延时void Delay(unsigned int s){unsigned int i,j;for(i=0;i<1000;i++)for(j=0;j<s;j++);}//短延时void delay_ms(unsigned int x){unsigned int i,j;i=0;for(i=0;i<x;i++){j=108;while(j--);}}/************初始化5A spi***************/void Init_SPI(uchar speed){SPDAT=0; //初始化数据寄存器SPSTAT=0XC0; //清除状态寄存器SPCTL=0XD0|speed;//设置为主机模式主频不能超过2M//忽略SS 使能spi MSB SCLK空闲为0 第一个时钟边沿开始采集spi通信的频率为CUP_CLK/16}//SPDAT 读写一个字节//TxData:要写入的字节//返回值:读取到的字节uchar SPI_ReadWriteByte(uchar TxData){SPDAT=TxData; //发送一个bytewhile((SPSTAT&0x80)==0);SPSTAT=0XC0; //清除状态寄存器return SPDAT; //返回收到的数据}//读取SPI寄存器值//reg:要读的寄存器uchar SPI_Read_Reg(uchar reg){uchar reg_val;CSN = 0; //使能SPI传输SPI_ReadWriteByte(reg); //发送寄存器号reg_val=SPI_ReadWriteByte(0xFF);//读取寄存器内容CSN = 1; //禁止SPI传输return(reg_val); //返回状态值}// 向寄存器REG写一个字节,同时返回状态字节 reg寄存器地址value写入的数据uchar SPI_RW_Reg (uchar reg,uchar value){uchar status;CSN=0;status=SPI_ReadWriteByte(reg);//发送寄存器号SPI_ReadWriteByte(value); //写入寄存器的值CSN=1;return(status);}//写一个数据包uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes) {uchar status,byte_ctr;CSN = 0;status=SPI_ReadWriteByte(reg);for(byte_ctr=0; byte_ctrSPI_ReadWriteByte(*pBuf++);CSN = 1;return(status);}//读一个数据包uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) {uchar status,uchar_ctr;CSN = 0;status = SPI_ReadWriteByte(reg);for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)pBuf[uchar_</uchars;uchar_ctr++)</x;i++)</s;j++);ctr]=SPI_ReadWriteByte(0xFF);CSN = 1;return(status);}#if MODE/*******************************发*****送*****模*****式*****代*****码*************************************/void TX_Mode(void){CE=0;SPI_RW_Reg(FLUSH_TX,0x00);SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写发送的地址 Writes TX_Address to nRF24L01 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 写接受的地址 RX_Addr0 same as TX_Adr for Auto.AckSPI_RW_Reg(WRITE_REG + EN_AA, 0x01); //使能自动应答Enable Auto.Ack:Pipe0SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); //使能通道0 Enable Pipe0SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 自动重发功能设置 500us + 86us, 10 retrans...1aSPI_RW_Reg(WRITE_REG + RF_CH, 40); //收发频率SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 发射速率、功耗功能设置 TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR SPI_RW_Reg(WRITE_REG + RX_PW_P0, (unsigned char)RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为2字节SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);CE=1;delay_ms(100);}void Transmit(unsigned char * tx_buf){CE=0; //StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); //装载接收端地址SPI_RW_Reg(FLUSH_TX,0x00); //清除FIFOSPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送CE=1; //置高CE,激发数据发送delay_ms(150);}#else/*******************************接*****收*****模*****式*****代*****码*************************************//************************************************************** ****************************************//*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放如rx_buf接收缓冲区中/************************************************************** ****************************************/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) {// unsigned char revale=0;sta=SPI_Read_Reg(STATUS); // 读取状态寄存其来判断数据接收状况SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志if(RX_DR) // 判断是否接收到数据{SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO bufferSPI_RW_Reg(FLUSH_RX,0xFF);//清除接受FIFOreturn 1; //读取数据完成标志}return 0;}/************************************************************** **************************************//*函数:void RX_Mode(void)/*功能:数据接收配置/************************************************************** **************************************/void RX_Mode(void){CE=0;// SPI_RW_Reg(FLUSH_RX,0x00);//清除接受FIFO//SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // Writes TX_Address to nRF24L01SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, (uchar*)RX_ADDRESS, RX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.AckSPI_RW_Reg(WRITE_REG + EN_AA, 0x01);//使能自动应答Enable Auto.Ack:Pipe0SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); //连接通道0和地址 Enable Pipe0//SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...1aSPI_RW_Reg(WRITE_REG + RF_CH, 125);//通信频率0~125 设置通信的频率 Select RF channel 40SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为2字节SPI_RW_Reg(WRITE_REG + RF_SETUP,0X0F); //0x07 TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR// 设置TX发射参数,0db增益,2Mbps,低噪声增益开启SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F);//配置基本工作模式的参数CE=1;delay_ms(130);}//************************************串口初始化********************************************************* void StartUART( void ){ //波特率9600SCON = 0x50; //串口模式1 8bit 使能接收TMOD = 0x20;//定时器1模式2 8位自动重装// PCON=0x80; //19200TH1 = 0xFD;TL1 = 0xFD;// IE=0x90; //开总中断开串口中断EA=1;ES=1;TR1=1;//启动定时器1// TI=1;}//************************************通过串口将接收到数据发送给PC端**************************************void R_S_Byte(uint R_Byte){SBUF=R_Byte;while(TI==0);TI=0;}#endif/************************************主函数************************************************************/ uchar NRF24L01_Check(void){uchar buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};uchar i;SPI_Write_Buf(WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.SPI_Read_Buf(TX_ADDR,buf,5); //读出写入的地址for(i=0;i<5;i++) if(buf[i]!=0XA5) break;if(i!=5) return 1;//检测24L01错误return 0; //检测到24L01}void main()uint i=0;CE=0;CSN=1;led=0;Init_SPI(1);while(NRF24L01_Check())//检测不到24L01{delay_ms(500);delay_ms(500);led=!led;//DS0闪烁}#if MODE //发送模式代码TX_Mode();while(1){Transmit(Tx_Buf); //清除FIFODelay(10);sta=SPI_Read(READ_REG + STATUS);if(TX_DS){P1=sta; //8位LED显示当前STATUS状态发送中断应使bit5 = 1 灯灭Delay(100);SPI_RW_Reg(WRITE_REG + STATUS,sta);}if(MAX_RT) //如果是发送超时P1=0x0f; //发送超时时 8位LED灯 bit4 = 1 灯灭Delay(150);SPI_RW_Reg(WRITE_REG + STATUS,sta);}}#else //接收模式代码StartUART(); //串口初始RX_Mode(); //接受模式Delay(0);//防止编译警告while(1){if(nRF24L01_RxPacket(Rx_Buf)){for(i=0;i<tx_pload_width;i++){R_S_Byte(Rx_Buf[i]);led=0;}}led=1;}#endif}</tx_pload_width;i++)。

串口中断接收的流程

串口中断接收的流程

串口中断接收的流程英文回答:Serial port interrupt reception is a process that allows the microcontroller to receive data from the serial port without continuously polling for new data. This is especially useful when the microcontroller needs to perform other tasks while waiting for incoming data.The flow of serial port interrupt reception typically involves the following steps:1. Enable the serial port interrupt: This step involves configuring the microcontroller to enable the interrupt for the specific serial port being used. This is usually done by setting appropriate bits in the interrupt enable register.2. Configure the serial port: Before enabling the interrupt, the serial port needs to be properly configuredfor the desired transmission parameters such as baud rate, data bits, parity, and stop bits. This is typically done by setting the appropriate control registers of the serial port.3. Set up the interrupt service routine (ISR): An ISRis a function that is executed when the interrupt occurs. In this case, the ISR for the serial port interrupt should be set up to handle the received data. The ISR should read the received data from the serial port's receive buffer and process it accordingly.4. Enable global interrupts: Before the microcontroller can respond to any interrupts, the global interrupt flag must be enabled. This is usually done by setting the appropriate bit in the microcontroller's control register.5. Wait for the interrupt: Once the serial port interrupt is enabled and the global interrupts are enabled, the microcontroller can wait for the interrupt to occur. This allows the microcontroller to perform other tasks while waiting for incoming data.6. Process the received data: When the interrupt occurs, the microcontroller jumps to the ISR and starts executing the code within the ISR. The ISR should read the received data from the serial port's receive buffer and process it accordingly. This may involve storing the data in a buffer, performing calculations, or triggering other actions based on the received data.7. Clear the interrupt flag: After processing the received data, it is important to clear the interrupt flagto acknowledge that the interrupt has been handled. This is usually done by clearing the appropriate bit in theinterrupt flag register.8. Return from the ISR: Once the interrupt flag is cleared, the microcontroller can return from the ISR and continue executing the main program.Overall, the flow of serial port interrupt reception involves enabling the interrupt, configuring the serial port, setting up the ISR, enabling global interrupts,waiting for the interrupt, processing the received data, clearing the interrupt flag, and returning from the ISR.中文回答:串口中断接收是一种允许微控制器从串口接收数据而无需持续轮询新数据的过程。

STC12C5A60S2教程

STC12C5A60S2教程

特殊单元
0003H 外部中断0中断服务程序的入口地址 000BH 定时/计数器0中断服务程序的入口地址 0013H 外部中断1中断服务程序的入口地址 001BH 定时/计数器1中断服务程序的入口地址 0023H 串行通信口1中断服务程序的入口地址 002BH ADC中断服务程序的入口地址 0033H 低电压检测中断服务程序的入口地址 003BH PCA中断服务程序的入口地址 0043H 串行通信口2中断服务程序的入口地址 004BH SPI中断服务程序的入口地址 读取程序存储器中保存的表格常数等内容时,使用MOVC指令。
0592mhz电容c1c2的典型值是47pfxtal1gnd22stc12c5a60s222stc12c5a60s2单片机的结构单片机的结构221stc12c5a60s2221stc12c5a60s2单片机的内部结构单片机的内部结构ram地址寄存器ram电源监控上电复位上电复位掉电复位可配置io口p0p4可配置io口p5程序flash程序地址寄存器缓冲器堆栈指针pc增量器pcpcb寄存器acctmp2tmp11k字节eepomrstale定时和控制逻辑片内rc振荡器dptr硬件看门狗wdt8通道高速adspi2路pwmpcaccu捕获比较单元指令寄存器可配置振荡器alupsw中断uart定时器逻辑xtal1xtal2cpu时钟222cpu以8位算术逻辑运算部件alu为核心加上通过内部总线而挂在其周围的暂存器tmp1tmp2累加器acc寄存器b程序状态标志寄存器psw以及布尔处理机就组成了整个运算器的逻辑电路
FFH 特殊功能寄存器区(80H~FFH) ~ [只能直接寻址访问] 80H 7FH 通用用户RAM和堆栈区(30H~7FH) ~ 30H [可直接或间接字节寻址] 2FH 位寻址区(16字节,共128位) ~ 也可以字节寻址 20H 1FH~ 18H 3区(R7~R0) 2区(R7~R0) 17H~ 10H 4个工作寄存器区 也可做RAM单元使用 0FH~ 08H 1区(R7~R0) 07H~ 00H 0区(R7~R0) 80H~ FFH [只能间接寻址访问 ]

STC12c5a60s2官方手册AD程序(中文注释)

STC12c5a60s2官方手册AD程序(中文注释)
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC的高8位结果寄存器
sfr ADC_LOW2 = 0xBE; //ADC的低2位结果寄存器
sfr P1ASF = 0x9D; //P1辅助功能控制寄存器
/*ADC操作定义常量*/
#define ADC_SPEEDL 0x20 //360 clocks
#define ADC_SPEEDH 0x40 //180 clocks
#define ADC_SPEEDHH 0x60 //90 clocks
void InitUart();
void SendData(BYTE dat); void Delay(WORD n);
}
/*----------------------------
Uart初始化
----------------------------*/
void InitUart()
{
SCON = 0x5a; //8位数据,无校验位
TMOD = 0x20; //T1为8位自动重载
void InitADC( )
{
P1ASF = 0xff; //设置所有P1为模拟输入端口
ADC_RES = 0; //清除先前的结果
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay(2); //ADC 延迟启动和启动/转换的电源
while (1);
}
/*----------------------------
ADC函数中断服务例程

STC12C5A60S2单片机双串口通信

STC12C5A60S2 单片机双串口通信STC12C5A60S2 单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1 的功能及操作与传统51 单片机串行口相同;特殊的是STC12C5A60S2 单片机内部有一个独立波特率发生器,串口1 可以使用定时器1 作为波特率发生器,也可以使用独立波特率发生器作为波特率发生器;而串口2 只能使用独立波特率发生器作为波特率发生器。

下面是一段双串口通信的程序:/***********************************************************************时间:2012.11.24芯片:STC12C5A60S2晶振:22.1184MHz 波特率:9600bps引脚定义:串行口1:发送TxD/P3.1;接收RxD/P3.0串行口2:发送TxD2/P1.3;接收RxD2/P1.2功能描述:STC12 双串口通信(中断方式)当串行口1 接收数据后,将此数据由串行口2 发送出去当串行口2 接收数据后,将此数据由串行口1 发送出去******************************************************************* ****/#include#define S2RI 0x01//串口2 接收中断请求标志位#define S2TI 0x02//串口2 发送中断请求标志位unsigned char flag1,flag2,temp1,temp2;/****************串行口初始化函数****************/void InitUART(void){TMOD = 0x20; //定时器1 工作在方式2 8 位自动重装SCON = 0x50; //串口1 工作在方式1 10 位异步收发REN=1 允许接收TH1 = 0xFA; //定时器1 初值TL1 = TH1;TR1 = 1; //定时器1 开始计数EA =1;//开总中断ES =1;//开串口1 中断S2CON = 0x50; //串口2 工作在方式1 10 位异步收发S2REN=1 允许接收BRT = 0xFA; //独立波特率发生器初值AUXR = 0x10; //BRTR=1 独立波特率发生器开始计数IE2 =0x01;//开串口2 中断ES2=1}/****************串行口1 发送****************/void UART_1SendOneByte(unsigned char c){SBUF = c;while(!TI); //若TI=0,在此等待TI = 0;}/****************串行口2 发送****************/void UART_2SendOneByte(unsigned char c){S2BUF = c;while(!(S2CON&amp;S2TI)); //若S2TI=0,在此等待S2CON&amp;=~S2TI; //S2TI=0}/*****************主函数******************/void main(void){InitUART();//串行口初始化while(1){//如果串口1 接收到数据,将此数据由串口2 发送if(flag1==1){flag1=0;UART_2SendOneByte(temp1);}//如果串口2 接收到数据,将此数据由串口1 发送if(flag2==1){flag2=0;UART_1SendOneByte(temp2);}}}/************串行口1 中断处理函数*************/ void UART_1Interrupt(void) interrupt 4{if(RI==1){RI=0;flag1=1;temp1=SBUF;}}/************串行口2 中断处理函数*************/ void UART_2Interrupt(void) interrupt 8{if(S2CON&amp;S2RI){S2CON&amp;=~S2RI;flag2=1;temp2=S2BUF;}}12C5A60S2.h 的头文件如下://--------------------------------------------------------------------------------//新一代1T 8051 系列单片机内核特殊功能寄存器C51 Core SFRs// 7 6 5 4 3 2 1 0 Reset Valuesfr ACC = 0xE0; //Accumulator 0000,0000sfr B = 0xF0; //B Register 0000,0000sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000//-----------------------------------sbit CY = PSW;sbit AC = PSW;sbit F0 = PSW ;sbit RS1 = PSW;sbit RS0 = PSW;sbit OV = PSW ;sbit P = PSW;//-----------------------------------sfr SP = 0x81; //Stack Pointer 0000,0111sfr DPL = 0x82; //Data Pointer Low Byte 0000,0000sfr DPH = 0x83; //Data Pointer High Byte 0000,0000//-------------------------------------------------------------------------------- //新一代1T 8051 系列单片机系统管理特殊功能寄存器// 7 6 5 4 3 2 1 0 Reset Valuesfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000// 7 6 5 4 3 2 1 0 Reset Valuesfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000//-----------------------------------sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000/*PCA_P4:0, 缺省PCA 在P1 口1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口,PCA0/PWM0 从P1.3 切换到P4.2 口PCA1/PWM1 从P1.4 切换到P4.3 口SPI_P4:0, 缺省SPI 在P1 口1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口MISO 从P1.6 切换到P4.2 口MOSI 从P1.5 切换到P4.1 口SS 从P1.4 切换到P4.0 口S2_P4:0, 缺省UART2 在P1 口1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口RxD2 从P1.2 切换到P4.2 口GF2: 通用标志位ADRJ:0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器DPS: 0, 使用缺省数据指针DPTR01,使用另一个数据指针DPTR1*///-----------------------------------sfr WAKE_CLKO = 0x8F; //附加的SFR WAK1_CLKO/*7 6 5 4 3 2 1 0 Reset ValuePCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE _ T1CLKO T0CLKO 0000,0000Bb7 - PCAWAKEUP : PCA 中断可唤醒powerdown。

STC12C5A60S2定时器,STC12C5A60S2定时器程序

确的。现在我们修改一下代码,关闭定时器T0的12分频,粉色字段为新增
加代码。
STC12C5A60S2单片机集成了两个16位定时/计数器。
1)寄存器
1.1)TMOD定时器工作方式控制寄存器,包括13位寄存器、16位
寄存器、8位寄存器等;
1.2)TCON定时器控制寄存器,主要包括定时器启动控制位等;
1.3)AUXR辅助寄存器,用以设置分频;默认12分频
1.4)TH0/1:定时器高8位寄存器
1.5)TL0/1:定时器低8位寄存器
定时器计算
STC12C5A60S2系列是1T的8051单片机,为了兼容传统的8051,
定时器0和定时器1复位后是传统8051的速度,既12分频,这是为了兼容
传统8051。但也可以不进行12分频,实现真正的1T。
编译、下载目标代码,LED灯以1s间隔闪烁,说明我们的代码是正
STC12C5A60S2定时器,STC12C集成了共4个16位定时器,两个与传统8051
兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特
率发生器做串行通讯的波特率发生器,再加上2路PCA模块可再实现2个
16位定时器;
1.基本特性

STC12C5A60S2单片机双串口通信

0000,0000
//-----------------------------------
sbit CY = PSW;
sbit AC = PSW;
sbit F0 = PSW ;
sbit RS1 = PSW;
sbit RS0 = PSW;
sbit OV = PSW ;
sbit P = PSW;
//-----------------------------------
void InitUART(void)
{
TMOD = 0x20; //定时器1工作在方式2 8位自动重装
SCON = 0x50; //串口1工作在方式1 10位异步收发REN=1允许接收
TH1 = 0xFA; //定时器1初值
TL1 =TH1;
TR1 = 1; //定时器1开始计数
EA =1;//开总中断
STC12C5A60S2单片机双串口通信
STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双
工串行通信接口,串口1的功能及操作与传统51单片机串行口相同;特殊的
是STC12C5A60S2单片机内部有一个独立波特率发生器,串口1可以使用定
时器1作为波特率发生器,也可以使用独立波特率发生器作为波特率发生
{
if(S2CON&amp;S2RI)
{
S2CON&amp;=~S2RI;
flag2=1;
temp2=S2BUF;
}
}
12C5A60S2.h的头文件如下:
//--------------------------------------------------------------------------------

STC12C5A60S2单片机c语言程序代码调试例程


//12T指的是每12个时钟加1与普通C51一样
//允许将P3.5/T1脚配置为定时器1的时钟输出CLKOUT1,只
能工作在定时器模式2下
//T1工作在1T模式时的输出频率 = SYSclk/(256-TH0)/2
//T1工作在12T模式时的输出频率 = SYSclk/12/(256-TH0)/2
//工作模式为1T
BRT = 0xff;
#if( Bus_clk == 12 )
CLK_DIV = 0x00;
#elif( Bus_clk == 6 )
CLK_DIV = 0x01;
#elif( Bus_clk == 3 )
CLK_DIV = 0x02;
#elif( Bus_clk == 1500 )
void Delay_ms( uint time )
{
uint t; //延时时间 = (time*1003+16)us while(time--)
{
for( t = 0; t < 82; t++ );
}
}
//***********************************//
//1T指的是每1个时钟加1,是普通C51的12倍
//12T指的是每12个时钟加1与普通C51一样
AUXR = 0xc0; //T0定时器速度是普通8051的12倍,即工作在1T模式下
//T1定时器速度是普通8051的12倍,即工作在1T模式下
TMOD = 0x22; //定时器0工作模式为方式2,自动装载时间常数
#define uchar unsigned char
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
}
LED2=~LED2;
}
}
intmain()
{
chari;
TMOD=0x00;
AUXR=0x00;
LED1=0;
LED2=1;
Init_Uart();
EA=1;//开总中断
printf(Systemisstart...rn);
while(1)
{
if(UART1_Overflow_Flag==1)//串口中断数据接收完毕,开始处理
UART1_Recv_count={实际接收到的数据个数}
以上2种情况触发后UART1_Overflow_Flag标志位置为1,等待MAIN
函数(主程序处理)
*/
voidUART1_Int(void)interrupt4
{
if(RI==1)
{
RI=0;
if(UART1_Overflow_Flag==0)
STC12C5A60S2串口中断接收程序
#defineUART0_BUF_LEN32
intUART1_Recv_count;//接收计数
bitUART1_Overflow_Flag;//缓冲区满标志
idataucharUART1_Recv_BUF[UART0_BUF_LEN];//串口接收缓冲区
//串口初始化
AUXR|=0x01;//串口1选择独立波特率发生器为波特率发生器
AUXR|=0x10;//启动独立波特率发生器
ES=1;//充许串口1中断
}
//串口中断接收程序
/*
说明:
(1)如果缓冲区接收满了,则中断接收程序不在接收数据。
UART1_Recv_count=32
(2)如果接收到回车符、换行符,则中断不在接收数据。
voidInit_Uart()
{
UART1_Overflow_Flag=0;
UART1_Recv_count=0;
//22.1184M晶振115200波特率
PCON&amp;=0x7f;//波特率不倍速
SCON=0x50;//8位数据,可变波特率
BRT=0xFA;//设定独立波特率发生器重装值
AUXR|=0x04;//独立波特率发生器时钟为For(i=0;i
printf(%c,UART1_Recv_BUF[i]);
Appcall(UART1_Recv_BUF,UART1_Recv_count);
printf(rn);
UART1_Recv_count=0;//缓存清零
UART1_Overflow_Flag=0;//允许串口继续接收数据
{
if(UART1_Recv_count
{
UART1_Recv_BUF[UART1_Recv_count++]=SBUF;
if(SBUF==‘r’||SBUF==‘n’)
{
UART1_Overflow_Flag=1;
}
}
else
{
UART1_Overflow_Flag=1;//关闭串口中断,停止接收
相关文档
最新文档