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 单片机双串口通信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定时器程序

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单片机双串口通信

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语言程序代码调试例程

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

STC12C5A60S2教程

STC12C5A60S2教程

程序状态标志寄存器PSW:
D7 CY
D6 AC
D5 D4 D3 D2 F0 RS1 RS0 OV
D1 F1
D0 P
CY:进位标志位 当执行加/减法指令时,如果操作结果的最高位D7出现进/借位,则CY置 “1”,否则清零。此外,CPU在进行移位操作时也会影响这个标志位。 AC:辅助进位标志位 当执行加/减法指令时,如果低四位数向高四位数产生进/借位,则AC置 “1”,否则清零。 F0:用户标志0 该位是由用户定义的一个状态标志。 RS1,RS0:工作寄存器组选择控制位 OV:溢出标志位 指示运算过程中是否发生了溢出。 F1:用户标志1 该位是由用户定义的一个状态标志。 P:奇偶标志位 如果累加器ACC中1的个数为偶数,P=0;否则P=1。
2)位寻址区
20H~2FH之间的单元既可以像普通RAM单元一样按字节存取,也可以 对单元中的任何一位单独存取,共128位,所对应的位地址范围是00H~ 7FH。特殊功能寄存器中,直接地址可被8整除的寄存器(除了IP.7、IP.6 和IE.6以外)也可以进行位寻址。 可进行位寻址的单元,请见教材图2-8和图2-9.
常见的晶振连接方法
C2
STC12C5A60S2
XTAL2
C1
M XTAL1 GND
晶体振荡器M的典型值是11.0592MHz,电 容C1、C2的典型值是47Pf。
2.2 STC12C5A60S2单片机的结构
2.2.1 STC12C5A60S2单片机的内部结构
RAM 可配置 I/O口 可配置 I/O口 地址 RAM 1K字节 EEPOM P0~P4 P5 寄存器 程序 FLASH 程序地址 寄存器 缓冲器 B 寄存器 电源监控 (上电复位、 掉电复位 ) RST ALE ACC T MP1 T MP2 ALU PSW 定时和 指令 控制逻辑 寄存器 硬件看门狗 (W DT ) 片内 RC 振荡器 SPI 中断、 UART 、 定时器逻辑 堆栈指针 PC 增量器 PC DPT R 8 通道 高速 A/D 2 路 PW M/PCA/CCU 捕获 / 比较单元

stc12c5a60s2串口通讯 代码

stc12c5a60s2串口通讯 代码

#include <stc12c5a60s2.h>#include<string.h>unsigned char yb;unsigned char n[14];char nn;unsigned char sn;unsigned char num,mm; //定时器计数unsigned char sn;unsigned char adcnum[8]; //ad转换结果unsigned char adcyb; //ad转换游标unsigned char ssbuf[12]; //串口缓存unsigned char syb;sbit dat=P3^2;sbit clk=P3^3;sbit load=P3^6;sbit dat1=P3^4;sbit clk1=P3^5;sbit load1=P3^7;sbit sys=P4^4;sbit sc1=P4^6;sbit sc2=P4^5;sbit led1 = P0^6;void ssend(){SBUF=ssbuf[0];syb=1;}void adc(void) interrupt 5{adcnum[adcyb]=ADC_RES; //存储结果//adcnuml[adcyb]=ADC_RESL; //低两位adcyb++;if (adcyb>7){adcyb=0;ADC_CONTR=(0XE0|adcyb);ssbuf[0]=253;ssbuf[1]=adcnum[0];ssbuf[2]=adcnu m[1];ssbuf[3]=adcnum[2];ssbuf[4]=adcnum[3];ssbuf[5]=adcnum[4];ssbuf[6]=adcnum[5];ssbuf[7]=adcnum[6];ssbuf[8]=adcnum[7];ssbuf[9] =254;ssbuf[10]=0x0d;ssbuf[11]='\n';ssend();}else{ADC_CONTR=(0xe8|adcyb);} //继续下一位}void out(unsigned char a1,unsigned char a2,unsigned char sin) {load=1;clk=1; dat=a1; clk=0;clk=1; dat=a2; clk=0;clk=1; dat=1; clk=0;clk=1;dat=(sin>>7); clk=0;clk=1;dat=((sin & 0x40)>>6);clk=0;clk=1;dat=((sin & 0x20)>>5);clk=0;clk=1;dat=((sin & 0x10)>>4);clk=0;clk=1;dat=((sin & 0x08)>>3);clk=0;clk=1;dat=((sin & 0x04)>>2);clk=0;clk=1;dat=((sin & 0x02)>>1);clk=0;clk=1;dat=(sin & 0x01);clk=0;clk=1;load=0;load=1;}void out1(unsigned char a1,unsigned char a2,unsigned char sin) {load1=1;clk1=1; dat1=a1; clk1=0;clk1=1; dat1=a2; clk1=0;clk1=1; dat1=1; clk1=0;clk1=1;dat1=(sin>>7); clk1=0;clk1=1;dat1=((sin & 0x40)>>6);clk1=0;clk1=1;dat1=((sin & 0x20)>>5);clk1=0;clk1=1;dat1=((sin & 0x10)>>4);clk1=0;clk1=1;dat1=((sin & 0x08)>>3);clk1=0;clk1=1;dat1=((sin & 0x04)>>2);clk1=0;clk1=1;dat1=((sin & 0x02)>>1);clk1=0;clk1=1;dat1=(sin & 0x01);clk1=0;clk1=1;load1=0;load1=1;}void delay(int nu){unsigned int m,n;for(m=1;m<=nu;m++)for(n=1;n<2000;n++);}void cl(void){if(yb>13)if((n[0]==0xfd)&&(n[13]==0xfe)){yb=0;out(0,0,n[1]);out(0,1,n[2]);out(1,0,n[3]);out(1,1,n[4]);out1(0,0,n[5]);out1(0,1,n[6]);out1(1,0,n[7]);out1(1,1,n[8]);P0=n[9];P1=n[10];// P2=n[11];sc1=1;sc1=0;// P2=n[12];sc2=1;sc2=0;sn=1;}else{yb=0;}else{yb=0;}}void initex(){IT0=1;IT1=1; //设置外部中断触发方式0为负电平触发1为负跳变触发EX0=1;EX1=1; //开外部中断}void main (void){ //锁存器锁存P1M1=0xe7;P1M0=0x00; //PmMn m=4,3,2,1 n=0,1 (m:0 0 准双向0 1 推挽1 0 仅输入1 1 开漏)P1ASF=0xe7; //打开P1口的ad转换功能1110 0111 (bit7-bit0)ADC_CONTR=0xe0; //设置adc_power speed1 speed0 adc_flag adc_start chs2 chs1 chs0 1110 0000EADC=1;initex();P4SW=0x70; //启动p4口x000 xxxxSCON = 0x50; /* SCON: 模式1, 8-bit UART, 使能接收*/ TMOD |= 0x21; /* TMOD: timer 1, mode 2, 8-bit reload */AUXR|=0x40; //开12倍速9600变115200TH1 = 0xfd; /* TH1: reload value for 9600 baud @ 11.0592MHz */TH0=65534/256;TL0=65534%256;TR1 = 1; /* TR1: timer 1 run */ TR0=1;ET0=1;EA = 1; /*打开总中断*/ES = 1;TI=0; /*打开串口中断*/yb=0;sn=0;sn=1;mm=0; //灯慢速显示ADC_CONTR |=0x08; //开始转换while (1) /*主循环不做任何动作*/{}}void tmr0(void) interrupt 1{TH0=65534/256;TL0=65534%256;num++;mm++;if(mm>1000){led1=!led1;ADC_CONTR|=0x08; //adc转换开始xxxx 1xxx(adc_start)mm=0;}if (((num==25)|(num==50)|(num==75)) & sn){sys=!sys;}if (num>=100){num=0;sys=!sys;sn=0;}}void UART_SER (void) interrupt 4 //串行中断服务程序{unsigned char Temp; //定义临时变量if(RI) //判断是接收中断产生{RI=0; //标志位清零Temp=SBUF; //读入缓冲区的值n[yb]=Temp;yb++;if (yb>13){cl();}if (Temp==0xfe){cl();}}if(TI) //如果是发送标志位,清零{TI=0;if (syb<12){SBUF=ssbuf[syb];syb++;}else{syb=0;}}}。

STC12C5A60S2双串口使用程序

STC12C5A60S2双串口使用程序

STC12C5A60S2双串口使用程序(已经验证成功)#include <stc12c5a60s2.h>#include "intrins.h" #define uchar unsigned char#define S2RI 0x01 // 串口 2 接收中断请求标志位#define S2TI 0x02 // 串口 2 发送中断请求标志位//================================================// 对于将 P4.4 、 P4.5 当做 I/O 口使用必须添加的定义 ||//================================================/*sbit butto n 仁P4^3; sbit butt on 2=P4A 4; sbit butto n3=P4A5; sbitbutton4=P4A6;*/ uchar code temp1[]={" 白云: “我可是个名人” "};uchar code temp2[]={" 黑土: 八、“啥名人啊,你就是个人名” "};uchar code temp3[]={" 小崔: “诶,大叔大妈,你俩都冷静冷静” "uchar code temp4[]={" 观众: “哈哈哈哈” "};/*void delay_1ms(uchar ii) // 误差 {unsigned char a,b; for(; ii>0; ii--)for( b = 18; b>0; b--)for( a = 152; a>0; a--);_nop_(); //if Keil,require use intrins.h }void delay1s(void) // 误差 -0.5us {unsigned char a,b,c;for( c = 212; c>0; c--)for( b = 160; b>0; b--)for( a = 80; a>0; a--);_nop_(); //if Keil,require use intrins.h_nop_(); //if Keil,require use intrins.h}*/用于存放串口 1 接收的字符 // 用于存放串口 2 接收的字符//* ***********************串口通信部分 ******************************sfr p4sw=0xbb; 用)// 需在主函数文件中做相应设置 4、5、6 为1(作为 I/O 口使 uchar wj_uun = '!'; // uchar wj_uun2 = '?';void s1_send_char(uchar dat) {SBUF = dat;// while(!TI);//TI TI = 0;// }void s1_send_string(uchar *pt)// 发送端 ( 发送的是字符 ) // 通过调用发送字符函数来发送字符数组{ while(*pt != '\0') { s1_send_char(*pt++);发送端 ( 发送的是字符 )将字符送入串口 2 的发送缓冲寄存器 判断发送是否结束: S2CON.bit2 = 0:发送中 1 : 手动清零标志位,令 S2CON.bit2 = 0通过调用发送字符函数来发送字符数组 while(*pt2!='\0')void bt_uart_init() // {//SCON=0X50; SM0 = 0; 允许串口接收 SM1 = 1; REN = 1; 单片机双串口初始化// SM0=0 SM1=1 SM2=0 REN=1// 串口工作方式 1:1 位起始位, 8 位数据位, 1 位停止位 // 允许串口接收 //RI=1; // 接收标志位, 0:正在接收 1 :接收完毕 ( 如果 RI=1 就一直执行串口中断 ) TMOD = 0X20; // TH1 = 0XFD; // 9600bit/s TL1 = 0XFD; TR1 = 1; // EA = 1; // ES = 1; // 定时器 T1 工作方式 2 下的定时器初值 启动定时器 T1 开总中断 开串行口中断 S2CON = 0x50;S2REN=1允许接收 BRT = 0XFD; AUXR =0x10; // 串口 2 工作在方式 1 10 位异步收发 S2SM0=0 S2SM1=1 // 9600bit/s 下的独立波特率发生器初值 // 辅助寄存器 :0001 0000 ->BRTR=1: 独立波特率发生器开 始计数,S2SMOD=0波特率不加倍, IE2 = 0x01; // BRTx12=0:独立波特率每12个时钟计数一次开串口 2 中断 0000 0001->ES2=1 // AUXR1 = 0x10; // 0001 0000->S2_P4=1:UART2 从 P1 口(RxD2:P1.2 TxD2:P1.3)切换到 P4 口(RxD2:P4.2 TxD2:P4.3) 否则默认都为 P1 口}************ 串口 1 发送函数 *************** } ************ 串口 2 发送函数 *****************/ 将字符送入发送缓冲寄存器 为发送状态标志位, 0:发送中 1 :发送结束 手动清零标志位 void s2_send_char(uchar dat2) // { S2BUF = dat2;// while(!(S2CON&S2TI));// 发送结束S2CON &= ~S2TI;// } void s2_send_string(uchar *pt2) //中断编号 4 为串行口 1 中断接收标志位, 0:正在接收 1 :接收完毕 ( 同样需要手动清零 将接收缓冲器接收的字符送入变量中void bt_serial_2() interrupt 8 // { if(S2CON&S2RI) // 收完毕 ( 如果 RI=1 就一直执行中断 ){S2CON &= ~S2RI; // wj_uun2 = S2BUF; // } 中断编号 8 为串行口 2 中断 接收标志位 : S2CON.bit1 = 0:正在接收 同样需要手动清零,令 S2CON.bit1 = 0 将串口 2 接收到的字符送入变量中************ 串口 2 中断程序 *************** s2_send_char(*pt2++); /************** 串口 1 中断程序 void bt_serial_1() interrupt 4 // {if(RI) // RI=1 就一直执行中断 ){RI = 0; // wj_uun = SBUF; //}*************** 如果 :接 }}// 串口初始化 // 0111 0000 对应的 4、5、 6 脚设置成功通用while(1){/*if(wj_uun != '!') // 串口 1 接收{s1_send_char(wj_uun); // 串口 1 发送 wj_uun = '!'; }*/if(wj_uun2 != '?')// 串口 2 接收{ s2_send_char(wj_uun2); //串口 2 发送 wj_uun2 = '?'; void main(void){ bt_uart_init(); p4sw = 0x70; 口 I/O。

STC12C5A60S2双串口通信例程

STC12C5A60S2双串口通信例程

#include <STC12C5A60S2.h>#include <Uart.h>#define uchar unsigned char#define uint unsigned int//=====================void delay(void){uint j,g;for(j=0;j<500;j++)for(g=0;g<500;g++);}//============================void main(){Uart_Two_Init();Uart_One_Init();while(1){Uart_One_Send('z');delay();Uart_Two_Send('z');UART_One_Printf("sb123456789\n");delay();UART_Two_Printf("sb123456789\n");delay();}}//======================================#ifndef __UART_H__#define __UART_H__#define uchar unsigned char#define uint unsigned int//=====================================//#define RELOAD 0xFA//#define RELOAD_TWO 0xfa//#define BRTx12_enable() AUXR |= 0x04 //BRT 独立波特率发生器的溢出率快12 倍//#define BRT_start() AUXR |= 0x10 //启动独立波特率发生器BRT 计数。

//=========================================uchar c = 0 ;uint d = 0 ;//=========================================//=======baud 9600=======================void Uart_One_Init() //串口1初始化函数,波特率9600TMOD=0x20;//设置定时器1为工作方式2TH1=0xfd; //设置波特率为9600TL1=0xfd;TR1=1;REN=1;SM0=0;SM1=1;EA=1;ES=1;// AUXR|=0X40; //T1*12;}//========================================void Uart_One_Send(char k) //串口1发送一个字符{ES = 0 ;SBUF=k;while(TI!=1);TI = 0 ;ES = 1 ;}//=========baud 9600=======================void Uart_Two_Init() //串口2初始化函数,波特率9600{S2CON= 0x50 ; //方式2,允许接收// BRT = RELOAD_TWO ;BRT = 0xfd; //设置波特率9600 AUXR = AUXR |0X10 ; //允许独立波特率发生器运行// BRTx12_enable();AUXR1 = AUXR1&0xef ; //S2_P4=0,将uart2切换到P1口IE2 = IE2|0X01; //允许串口2中断}//=========================================void Uart_Two_Send(uchar k) //串口2发送一个字符{ES = 0 ;S2BUF = k ;while((S2CON&0x02)!=0x02);S2CON &= ~0x02;ES = 1 ;}//=============================================void UART_One_Printf(uchar *p)while(* p!='\0') Uart_One_Send(*p++);}//============================================ void UART_Two_Printf(uchar *p){while(* p!='\0') Uart_Two_Send(*p++);}//=========================================== void Uart_One_Receive() interrupt 4{uint k = 0 ;if(RI==1){RI = 0 ;k = SBUF;}}//========================================void Uart_Two_Receive() interrupt 8{uchar a ;uint k = 0 ;// a = S2CON ;a = S2CON & 0x01;if(a==1){k = S2BUF ;S2CON = S2CON & 0xfe; //清0 S2RI }}//=====================================#endifLTC1605 - 16-Bit, 100ksps, Sampling ADC特点•Sample Rate: 100ksps 采样100K次/S•Single 5V Supply 单5V供电•Bipolar Input Range: ±10V 双极输入-10V----+10V•Power Dissipation: 55mW Typ 电源55MW•Integral Nonlinearity: ±2.0LSB Max •Guaranteed No Missing Codes•Signal-to-Noise Ratio: 86dB Typ •Operates with Internal or External Reference •Internal Synchronized Clock•Improved 2nd Source to ADS7805 and AD976 •28-Pin 0.3” PDIP, SSOP and SW Packages。

STC12C5A60S2头文件函数程序

STC12C5A60S2头文件函数程序

//--------------------------------------------------------------------------------//新一代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^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0;//-----------------------------------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。

STC12C5A系列单片机串口编程

STC12C5A系列单片机串口编程

STC12C5A系列单片机串口编程串口头文件uart.h如下:=================================================================== /** File : uart.h* Description : This file is UART driver header of STC12C5A serial signal chip.* Author : Chao* Copyright : Chao** History* ----------------------* Rev : 0.0* Date : 20/08/2011** create.* ----------------------*/#ifndef UART_H_#define UART_H_//---------------Config-------------------------//#define UART1_EN //使能串口1#define UART1_RECEIVE_EN //允许串口1中断接收函数#define UART2_EN //使能串口2#define UART2_RECEIVE_EN //允许串口2中断接收函数//#define ECHO //使能回显//---------------Defines-------------------------//#define SystemFosc 22118400 //系统时钟:22.1184MHz#define UartBaud 9600 //串口波特率#define UART_BUFFER_SIZE 16 //串口数据缓冲区大小#define UartEndChar '>' //串口数据结束字符//---------------Type define-------------------------//typedef struct {unsigned int receive_flag; //数据接收标志unsigned char data_length; //数据缓冲区中有效数据个数unsigned char receive_buffer[UART_BUFFER_SIZE]; //数据接收缓冲区void (* init)(void); //串口初始化函数void (* send_byte)(unsigned char ddata); //发送单个字符void (* send_string)(unsigned char *ddata, unsigned char length); //发送字符串}UART_T;//---------------Extern-------------------------//#ifdef UART1_ENextern UART_T uart1;#endif#ifdef UART2_ENextern UART_T uart2;#endif#endif /*UART_H_*/======================================================================== 串口编程C程序文件uart.c如下:======================================================================== /** File : uart.c* Description : This file is UART driver of STC12C5A serial signal chip.* Author : Chao* Copyright : Chao** History* ----------------------* Rev : 0.0* Date : 20/08/2011** create.* ----------------------*///---------------Include files-------------------------//#include<stc12c5a.h>#include"uart.h"//---------------Function Prototype-------------------------//#ifdef UART1_ENstatic void uart1_init(void); //串口1初始化函数static void uart1_send_byte(unsigned char ddata); //串口1发送单个字符static void uart1_send_string(unsigned char *ddata, unsigned char length); //串口1发送字符串#endif#ifdef UART2_ENstatic void uart2_init(void); //串口2初始化函数static void uart2_send_byte(unsigned char ddata); //串口2发送单个字符static void uart2_send_string(unsigned char *ddata, unsigned char length); //串口2发送字符串#endif//---------------Variable-------------------------//unsigned long Fosc; //波特率设定时中间变量#ifdef UART1_ENUART_T uart1 = {0, // receive_flag0, // data_length"Hello\n", // receive_bufferuart1_init, // inituart1_send_byte, // send_byteuart1_send_string // send_string};unsigned char uart1_receive_temp;unsigned char *uart1_receive_point=uart1.receive_buffer;#endif#ifdef UART2_ENunsigned char uart1_receive_temp;UART_T uart2 = {0, // receive_flag0, // data_length"Hello\n", // receive_bufferuart2_init, // inituart2_send_byte, // send_byteuart2_send_string, // send_string};unsigned char uart2_receive_temp;unsigned char *uart2_receive_point=uart2.receive_buffer;#endif#ifdef UART1_EN/** ---- FUNCTION ----------------------------------------------------------------------- * Name : uart1_init* Description : 串口1初始化程序* -------------------------------------------------------------------------------------------- */static void uart1_init(void){unsigned long baud;//选择波特率产生方式:采用独立波特率发生器AUXR |= S1BRS;//设定波特率发生器重新计数初值Fosc = SystemFosc/32;baud = UartBaud;if(baud > 9600)AUXR |= BRTx12; //时钟频率不分频elseFosc /= 12;BRT = 256-Fosc/baud;//启动波特率发生器AUXR |= BRTR;SCON = 0x50; //设定串口1工作方式:方式1(8n1),允许接收ES = 1; //开串口1中断}/** === FUNCTION ---------------------------------------------------------------------* Name : uart1_send_byte* Description : 串口1发送单个字节数据* --------------------------------------------------------------------------------------------*/static void uart1_send_byte(unsigned char ddata){SBUF = ddata; //写入要发送的字符while(!TI); //等待发送完毕TI = 0; //清发送标志}/** === FUNCTION ---------------------------------------------------------------------* Name : uart1_send_string* Description : 串口1发送以'\0'结尾的字符串* --------------------------------------------------------------------------------------------*/static void uart1_send_string(unsigned char *ddata, unsigned char length){while(length--)uart1_send_byte(*ddata++);}#ifdef UART1_RECEIVE_EN/** === FUNCTION ---------------------------------------------------------------------* Name : ISR_uart1* Description : 串口1中断数据接收程序* --------------------------------------------------------------------------------------------*/void ISR_uart1(void) interrupt 4{if(RI) //确认接收到字符{uart1_receive_temp = SBUF;#ifdef ECHOuart1.send_byte(uart1_receive_temp);#endifif(uart1_receive_temp != UartEndChar) //如果没有接收到(假设接收缓冲区足够大){*uart1_receive_point++ = uart1_receive_temp;uart1.data_length++;}else{uart1_receive_point = uart1.receive_buffer; //重新将接收字符指针指向接收缓冲区头uart1.receive_flag = 1; //置位接收命令完成标志}RI = 0; //清接收标志}}#endif#endif#ifdef UART2_EN/** === FUNCTION ---------------------------------------------------------------------* Name : uart2_init* Description : 串口1初始化程序* --------------------------------------------------------------------------------------------*/static void uart2_init(void){#ifndef UART1_ENunsigned long baud;//选择波特率产生方式:采用独立波特率发生器AUXR |= S1BRS;//设定波特率发生器重新计数初值Fosc = SystemFosc/32;baud = UartBaud;if(baud > 9600)AUXR |= BRTx12; //时钟频率不分频elseFosc /= 12;BRT = 256-Fosc/UartBaud;//启动波特率发生器AUXR |= BRTR;#endifS2CON=0x50; //设定串口工作方式:方式1(8n1),允许接收IE2=0x01; //允许串口2中断}/** --- FUNCTION ---------------------------------------------------------------------* Name : uart2_send_byte* Description : 串口2发送单个字节数据* --------------------------------------------------------------------------------------------*/static void uart2_send_byte(unsigned char ddata){S2CON &= 0xFD; //清发送标志S2BUF = ddata; //发送数据while(!(S2CON&0x02)); //等待发送完成}/** === FUNCTION ---------------------------------------------------------------------* Name : uart2_send_string* Description : 串口2发送以'\0'结尾的字符串* --------------------------------------------------------------------------------------------*/static void uart2_send_string(unsigned char *ddata, unsigned char length){while(length--)uart2_send_byte(*ddata++);}#ifdef UART2_RECEIVE_EN/** ----- FUNCTION ---------------------------------------------------------------------* Name : ISR_uart2* Description : 串口2中断数据接收程序* --------------------------------------------------------------------------------------------*/void ISR_uart2(void) interrupt 8 //单片机接收从机发来的数据{if(S2CON&0x01) //如果接收到数据{uart2_receive_temp = S2BUF; //读取数据#ifdef ECHOuart2.send_byte(uart2_receive_temp);#endifif(uart2_receive_temp != UartEndChar) //如果没有接收到(假设接收缓冲区足够大){*uart2_receive_point++ = uart2_receive_temp;uart2.data_length++;}else{uart2_receive_point = uart2.receive_buffer; //重新将接收字符指针指向接收缓冲区头uart2.receive_flag = 1; //置位接收命令完成标志}S2CON &= 0xFE; //清接收标志}}#endif#endif======================================================================= 通过上面两个文件,就能很方便的实现STC12C5A系列单片机中串口操作,并且能够通过配置uart.h文件来实现串口1、串口2的条件编译,测试主函数main.c如下:======================================================================= #include<stc12c5a.h>#include"uart.h"void Sys_init(void); //系统初始化void main(){Sys_init();while(1){if(uart1.receive_flag){uart1.send_string(uart1.receive_buffer, uart1.data_length);uart1.receive_flag = 0;uart1.data_length = 0;}if(uart2.receive_flag){uart2.send_string(uart2.receive_buffer, uart2.data_length);uart2.receive_flag = 0;uart2.data_length = 0;}}}void Sys_init(void) //系统初始化{uart1.init();uart1.send_string("uart1\r\n",7);uart2.init();uart2.send_string("uart2\r\n",7);EA = 1;}该测试主函数实现的功能是:上电后,从串口1、串口2分别输出字符串"uart1\r\n"、“uart2\r\n”,然后两路串口分别等待接收数据,接收的字符串以字符“>”作为结束标志(可以在uart.h文件中进行修改),串口每接收完一个以“>”作为结尾的字符串,会通过相应串口将接收的字符串发送出去。

STC12C5A60S2单片机各个模块程序代码

STC12C5A60S2单片机各个模块程序代码

//****************************************************************************// // STC12C5A60S2可编程时钟模块////// 说明:STC12C5A60S2单片机有三路可编程时钟输出CLKOUT0/T0/P3.4// CLKOUT1/T1/P3.5、CLKOUT2/P1.0//// 涉及寄存器:AUXR(辅助寄存器)、W AKE_CLKO(时钟与系统掉电唤醒控制寄存器)// BRT(独立波特率发生器定时器寄存器)//// 程序说明:// 本程序可选实现P3.4输出CLKOUT0时钟、P3.5输出CLKOUT1时钟// P1.0输出CLKOUT2时钟//////****************************************************************************/ /#include <STC12C5A60S2.H>#include <intrins.h>//#define Port_BRT //如果想测试独立波特率发生器时钟输出请打开此句//若想测试CLKOUT1和CLKOUT0请注释此句#ifdef Port_BRT /*条件编译独立波特率发生器时钟输出*///*********************************//// CLKOUT2时钟初始化////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x04; //Bit2-BRTCLKO 允许P1.0配置为独立波特率发生器的时钟输出//BRT工作在1T模式下时的输出频率= Sysclk/(256-BRT)/2//BRT工作在12T模式下时输出频率= Sysclk/12/(256-BRT)/2 AUXR = 0x14; //Bit4-BRTR 允许独立波特率发生器运行//Bit2-BRTx12 BRT工作在1T模式下BRT = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频}#else /*条件编译CLKOUT0时钟输出*///*********************************//// CLKOUT0时钟和CLKOUT1初始化////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x03; //允许将P3.4/T0脚配置为定时器0的时钟输出CLKOUT0//T0工作在1T模式时的输出频率= SYSclk/(256-TH0)/2//T0工作在12T模式时的输出频率= SYSclk/12/(256-TH0)/2//1T指的是每1个时钟加1,是普通C51的12倍//12T指的是每12个时钟加1与普通C51一样//允许将P3.5/T1脚配置为定时器1的时钟输出CLKOUT1,只能工作在定时器模式2下//T1工作在1T模式时的输出频率= SYSclk/(256-TH0)/2//T1工作在12T模式时的输出频率= SYSclk/12/(256-TH0)/2//1T指的是每1个时钟加1,是普通C51的12倍//12T指的是每12个时钟加1与普通C51一样AUXR = 0xc0; //T0定时器速度是普通8051的12倍,即工作在1T模式下//T1定时器速度是普通8051的12倍,即工作在1T模式下TMOD = 0x22; //定时器0工作模式为方式2,自动装载时间常数//定时器1工作模式为方式2,自动装载时间常数TH0 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频TL0 = 0xff;TH1 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频TL1 = 0xff;TR1 = 1;TR0 = 1;}#endif//**********************************//// 主程序////**********************************//void main(){CLKOUT_init();while(1);}//****************************************************************************// // STC12C5A60S2系统时钟模块////// 说明:STC12C5A60S2单片机有两个时钟源,内部R/C振荡时钟和外部晶体时钟// 出厂标准配置是使用外部晶体或时钟////// 涉及寄存器:CLK_DIV(时钟分频寄存器)// 由该寄存器的Bit0-2组合可实现对时钟源进行0、2、4、8、16// 32、64、128分频// //// 程序说明:// 对外部时钟进行分频得到Sysclk,然后经过P1.0的独立波特率// 时钟输出功能Sysclk/2输出时钟频率//****************************************************************************// #include <STC12C5A60S2.h>#include <intrins.h>#define Bus_clk 12 //若要修改系统时钟直接在此处修改//12 为12M 的sysclk//6 为6M 的sysclk//3 为3M 的sysclk//1500 为 1.5M 的sysclk//750 为750kHz 的sysclk//375 为375kHz 的sysclk//187500 为187.5kHz 的sysclk//93750 为93.75kHz 的sysclk//*********************************************//// 系统时钟初始化////*********************************************//void Sysclk_init(void){WAKE_CLKO = 0x04; //配置P1.0口为频率输出AUXR = 0x14; //允许波特率时钟工作//工作模式为1TBRT = 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 )CLK_DIV = 0x03;#elif( Bus_clk == 750 )CLK_DIV = 0x04;#elif( Bus_clk == 375 )CLK_DIV = 0x05;#elif( Bus_clk == 187500 )CLK_DIV = 0x06;#elif( Bus_clk == 93750 )CLK_DIV = 0x07;#endif}//**********************************************//// 主程序////**********************************************//void main(){Sysclk_init();while(1);}//****************************************************************************// // STC12C5A60S2系统省电模块////// 说明:STC12C5A60S2单片机有三种省电模式以降低功耗.空闲模式,低速模式// 掉电模式////// 涉及寄存器:PCON(电源控制寄存器)// Bit0 - IDL 控制单片机进入IDLE空闲模式// Bit1 - PD 控制单片机进入掉电模式// //// 程序说明:程序实现让单片机先工作一阵子(通过P0^3指示灯显示)// 然后进入掉电状态,利用外部中断0口来唤醒单片机工作// 唤醒后单片机将通过P0^0-3口的灯闪烁显示开始工作////****************************************************************************/ /#include <STC12C5A60S2.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar Power_Down_Flag = 0; //进入掉电状态标志sbit Chip_Start_LED = P0^0; //单片机开始工作指示灯sbit Power_Down_LED_INT0 = P0^1; //INT0口掉电唤醒指示灯sbit N_Power_Down_LED_INT0 = P0^2; //INT0口没有唤醒指示灯sbit Normal_Work_LED = P0^3; //正常工作指示灯sbit Power_Down_Wakeup_INT0= P3^2; //外中断唤醒输入口void Delay_ms( uint time );void Normal_work(void);void Intp_init(void);void After_Powr_Down(void);//***********************************//// 软件延时////***********************************//void Delay_ms( uint time ){uint t; //延时时间= (time*1003+16)us while(time--){for( t = 0; t < 82; t++ );}}//***********************************//// 正常工作指示//***********************************//void Normal_work(void){Normal_Work_LED = 1;Delay_ms(500);Normal_Work_LED = 0;Delay_ms(500);}void After_Power_Down(void){uchar i ;for( i = 0; i < 100; i++ ){P0 = 0x0f;Delay_ms(500);P0 = 0x00;Delay_ms(500);}}//***********************************//// 中断初始化////***********************************//void Intp_init(void){IT0 = 0; //外部中断源0为低电平触发EX0 = 1; //允许外部中断EA = 1; //开总中断}//***********************************//// 主程序////***********************************//void main(){uchar j = 0;uchar wakeup_counter = 0; //记录掉电次数P0 = 0x00;Chip_Start_LED = 1; //单片机开始工作Intp_init(); //外中断0初始化while(1){P2 = wakeup_counter;wakeup_counter++;for( j = 0; j < 250; j++ ){Normal_work(); //系统正常工作指示}Power_Down_Flag = 1; //系统开始进入掉电状态PCON = 0x02;_nop_();_nop_();_nop_();_nop_();After_Power_Down(); //掉电唤醒后}}//**********************************//// 中断服务//**********************************//void INT0_Service(void) interrupt 0{if( Power_Down_Flag ) //掉电唤醒状态指示{Power_Down_Flag = 0;Power_Down_LED_INT0 = 1;while( Power_Down_Wakeup_INT0 == 0 ){_nop_(); //等待高电平}Power_Down_LED_INT0 = 0;}else //未掉电状态{N_Power_Down_LED_INT0 = 1; //不是掉电唤醒指示while( Power_Down_Wakeup_INT0 == 0 ){_nop_();}N_Power_Down_LED_INT0 = 0;}}//****************************************************************************// // STC12C5A60S2 A/D转换模块////// 说明:STC12C5A60S2单片机有8路10位高速AD转换器,P1^0-P1^7//// 涉及寄存器:P1ASF(模拟功能控制寄存器)、ADC_CONTR(ADC控制寄存器)// ADC_RES、ADC_RESL(转换结果寄存器)//// 注意: 1、初次打开内部A/D模拟电源需适当延时等内部模拟电源稳定后,再启动A/D转换// 启动A/D后,在转换结束前不改变任何I/O口的状态,有利于高精度A/D转换// 若能将定时器/串行/中断系统关闭更好。

STC12C5A60S2内部PWM模块程序

STC12C5A60S2内部PWM模块程序
#define uint unsigned int
//新一代1T 8051系列单片机PCA/PWM特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr CCON = 0xD8; //PCA控制寄存器。CF CR - - - - CCF1 CCF0 00xx,xx00
//-----------------------
STC12C5A60S2内部PWM模块程序
/**************************************************************
*******************************
说明:单片机的PCA_PWM使用,60S2只有两个PWM输出,分别是1.3
// 1 1 1 0 0 1 1 0x73 PWM输出由低变高或由高变低都可产生中断
//-----------------------
sfrCCAP0L=0xEA;//PCA模块0的捕捉/比较寄存器低8位。0的捕捉/比较寄存器高8位。
0000,0000
sfrCCAP1L=0xEB;//PCA模块1的捕捉/比较寄存器低8位。
0000,0000
sfrCCAP1H=0xFB;//PCA模块1的捕捉/比较寄存器高8位。
0000,0000
//-----------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfrPCA_PWM0=0xF2;//PCA模块0PWM寄存器。------EPC0H
EPC0L xxxx,xx00
sfrPCA_PWM1=0xF3;//PCA模块1PWM寄存器。------EPC1H

STC12C5A60S2初始化KEILC程序

STC12C5A60S2初始化KEILC程序

STC12C5A60S2初始化KEILC程序STC12C5A60S2初始化KEIL C 程序//独立频率输出,PCA定时器串口独立波特率串口接收,发送// ICL7135 AD中断测量;void MCU_INT(void) //初始化{// 定时器0 icl7135 AD 外部中断0TMOD = 0x29; // 定时器T1工作于模式1 ,定时器T0工作于模式1 由INT0控制定时器T0的启停TR0=1; //;启动定时器T0IT0=1; //下沿INT0中断EX0=1; //外部中断0允许TR1=1;EA = 1;// t1独立输出频率AUXR=0x40; //定时器1为8051的12倍WAKE_CLKO=0x22; //t1独立输出频率TH1=0xfa; // 1T clkout1=(fosc/2)/(256-TH0) 3m/2/6=250k // //PCA定时器寄存器值,50ms,6MCCON=0x00;//CL=0x00;CH=0x00; // Reset PCA base timerCMOD= 0x10;//中断使能系统时钟fosc/12//time(sec) * Fosc / 12, for 50ms @ 3MHz, T_Value = 0.05 * 3000000 / 12 = 12500T_Value0=12500;T_PCA0 = T_Value0;CCAP0L = T_PCA0;CCAP0H = T_PCA0 >> 8; //Initial PCA module-0T_PCA0 += T_Value0;CCAPM0=0x49; //软件定时器,使能中断,pca模块0CR=1; //启动pca// 串口1 独立波特率发生器BRTSCON=0x50;PCON=0X80;BRT= 0XF3;AUXR|=0x11; // 允许独立波特率独立波特率发生器作为串口1 //说明书49页ES=1;//看门独WDT_CONTR=0x3c; //说明书95页fosc=3M 32*393216/3000000 = 4.19s}void Init0 (void ) interrupt 0 using 1 //外部中断0 //定时器0中断{uchar i;if(ADOVER==0){ i++;TR0 = 0; //定时器0关EX0 = 0; //关中断if(i>2){ADHWHEEL=TH0;ADLWHEEL=TL0;ADOVER=1;i=0;}TMOD = 0x29;TR0=1; //;启动定时器T1IT0=1; //下沿INT0中断EX0=1; //外部中断0允许TH0=0;TL0=0;}}void PCA_INT (void ) interrupt 7 using 2 //PCA 定时器50ms {CCF0=0;CCAP0L = T_PCA0;CCAP0H = T_PCA0 >> 8;T_PCA0 += T_Value0;led2=~led2;}void Send_UART(uchar senddata) //独立波特率发生{ES=0;TI=0;SBUF=senddata;while(TI==0);TI=0;ES=1;}void UART_INT(void) interrupt 4 using 3 //串口接收中断{ uchar i;if(RI==1){i=SBUF;Send_UART(i);RI=0;} }。

  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;//关闭串口中断,停止接收
相关文档
最新文档