STC12C5A60S2 双串口使用程序

合集下载

STC12C5A60S2单片机PWM程序

STC12C5A60S2单片机PWM程序

STC12C5A60S2PWM程序
由于STC12C5A60S2单片机内部自带两路PWM,所以可以利用自带的PWM进行负载电压调节。

电路图如上,该程序的功能是利用按键S1对LED的亮度进行调节。

程序如下:
#include"STC12C5A.h"//注意这个头文件,用reg52是不行的,如果你没有的话,可以去百// //度文档里搜索“STC12C5A系列单片机头文件”,有我共享的头文件。

void delay(unsigned int cnt)
{
unsigned char i;
for(;cnt>0;cnt--)
for(i=0;i<250;i++);
}
void main()
{
CCON=0; //禁止寄存器CCON中CF位的中断)
CL=0; //PCA的16位计数器低八位
CH=0; //PCA的16位计数器高八位
CMOD=0x00; //选择系统时钟/12 为计数脉冲,则PWM的频率f=sysclk/256/12;
CCAP0H=0x80; // 占空比控制
CCAP0L=0x80;
PCA_PWM0=0x00; //控制占空比的第九位为0
CCAPM0=0x42; //允许P13作为PWM输出
CR=1; //启动PCA计数器
while(1)
{
if(P10==0)
{
delay(200);
while(P10==0);
CCAP0H+=10; //占空比调节
CCAP0L+=10;
}
}
}
欢迎阅读。

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

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

//********************************************************************** ******// // STC12C5A60S2可编程时钟模块//////****************************************************************************//#include <STC12C5A60S2.H>#include <intrins.h>//#define Port_BRT //如果想测试独立波特率发生器时钟输出请打开此句 //若想测试CLKOUT1和CLKOUT0请注释此句#ifdef Port_BRT /*条件编译独立波特率发生器时钟输出*///*********************************//}#else /*条件编译CLKOUT0时钟输出*///*********************************//// CLKOUT0时钟和CLKOUT1初始化 ////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x03; //允许将P3.4/T0脚配置为定时器0的时钟输出CLKOUT0 //T0工作在1T模式时的输出频率 =SYSclk/(256-TH0)/2倍倍AUXR = 0xc0; //T0定时器速度是普通8051的12倍,即工作在1T模式下//T1定时器速度是普通8051的12倍,即工作在1T模式下TMOD = 0x22; //定时器0工作模式为方式2,自动装载时间常数 //定时器1工作模式为方式2,自动装载时间常数TH0 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频TL0 = 0xff;TH1 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频//****************************************************************************//// STC12C5A60S2系统时钟模块////// 说明: STC12C5A60S2单片机有两个时钟源,内部R/C振荡时钟和外部晶体时钟// 出厂标准配置是使用外部晶体或时钟//4、8、#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 的sysclkCLK_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 )//****************************************************************************//// STC12C5A60S2系统省电模块////// 说明: STC12C5A60S2单片机有三种省电模式以降低功耗.空闲模式,低速模式// 掉电模式//)#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; //外中断唤醒输入口for( t = 0; t < 82; t++ );}}//***********************************//// 正常工作指示//***********************************// void Normal_work(void){Normal_Work_LED = 1;Delay_ms(500);}//***********************************// // 中断初始化 // //***********************************// void Intp_init(void){IT0 = 0; //外部中断源0为低电平触发 EX0 = 1; //允许外部中断EA = 1; //开总中断}wakeup_counter++;for( j = 0; j < 250; j++ ){Normal_work(); //系统正常工作指示}Power_Down_Flag = 1; //系统开始进入掉电状态PCON = 0x02;_nop_();_nop_();_nop_();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 )////// 说明: 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口的状态,有利于高精#include <STC12C5A60S2.h>#include <intrins.h>#include "lcd.h"#define ADC_POWER 0x80 //AD电源控制#define ADC_START 0x08 //AD转换控制#define ADC_FLAG 0x10 //AD转换完成#define Speed_0 0x00 //540 clk#define Speed_1 0x20 //360 clk#define Speed_2 0x40 //180 clk// A/D初始化////**********************************//void AD_init(void){AUXR1 = 0x04; //转换结果高2位放在ADC_RES的低2位中,低8位放在ADC_RESL中P1ASF = 0x01; //P1.0口作为模拟功能A/D使用 ADC_RES = 0x00; //结果清零ADC_RESL = 0x00;ADC_CONTR = ADC_POWER|Speed_2|ADC0|ADC_START; //打开电源,180CLK周// 串口初始化 ////****************************************//void UART_init(void){SM0 = 0; //选择串口为方式1工作SM1 = 1; //8位数据波特率可变REN = 1;BRT = 0xDC;AUXR = 0x15; //选择独立波特率发生器为串行 //口的波特率发生器,模式为1T// 串口发送数据// //******************************************// void SendData( uchar byte ){SBUF = byte;while(!TI);TI = 0;}//******************************************//// 主程序//ADC_CONTR &= !ADC_FLAG; //清标志Printf_Decimal(Result_Calculate());ADC_RES = 0x00;ADC_RESL = 0x00;ADC_CONTR = ADC_POWER|Speed_2|ADC_START; //开始下一次转换_nop_();_nop_();_nop_();_nop_();}uchar Read_Date(void); //读数据void Write_Cmd( uchar cmd ); //写命令void Write_Date( uchar date );//写数据void Init_LCD(void);//初始化LCDvoid Location( uchar x, uchar y );//设定显示位置void Clear_Screen(void);//清屏void Write_str( uchar *p );void Printf_Decimal(double Num);#include "lcd.h"for( t = 0; t < 41; t++ );}}//**********************************////* 名称: Busy()//* 功能: 读取忙状态//* 输入: 无//* 输出: 1-忙 0-空闲//**********************************//uchar Busy(void)//* 功能: 读12864状态//* 输入: 无//* 输出: status-当前状态//**********************************// uchar Read_Status(void){uchar status;RS = 0;RW = 1;E = 0;//* 名称: Write_Cmd()//* 功能: 向12864写命令//* 输入: cmd - 命令参数//* 输出: 无//**********************************//void Write_Cmd( uchar cmd ){RS = 0;RW = 0;//**********************************// void Write_Date( uchar date ){while(Busy());RS = 1;E = 0;_nop_();_nop_();P2 = date;uchar Read_Date(void){uchar date;while(Busy()); //忙RS = 1;E = 0;_nop_();_nop_();_nop_();//**********************************// void Init_LCD(void){Delay_ms(4);PSB = 1;//并行方式Delay_ms(4);Write_Cmd(0x0c);//开显示关游标Delay_ms(4);Clear_Screen();//清屏}else if( x == 2 )x = 0x90;else if( x == 3 )x = 0x88;else if( x == 4 )x = 0x98;position = x + y;Write_Cmd(position);Delay_ms(2);}Delay_ms(10);}//**********************************// //* 名称: Write_str()//* 功能: 向12864里写字符串//* 输入: *p -- 字符串地址//* 输出: 无//**********************************// void Write_str( uchar *p ){{uchar s[6] = {0,0,46,0,0};uint t;t = (uint)(Num * 1000);s[0] = t/10000+48;s[1] = t%10000/1000+48;s[3] = t%1000/100+48;s[4] = t%100/10+48;s[5] = t%10+48;Location(1,2);// STC12C5A60S2 PCA/PWM模块////// 说明: STC12C5A60S2单片机有两路可编程计数器阵列(PCA)模块,可用于软件// 定时器,外部脉冲的捕捉、高速输出以及脉宽调制(PWM)输出//// 涉及寄存器:CMOD(PCA工作模式寄存器) CCON(PCA控制寄存器) // CCAPM0,CCAPM1(PCA比较/捕获寄存器)// CH,CL(PCA的16位计数器)、CCAPnL,CCAPnH(PCA捕捉/比较********//#include <STC12C5A60S2.H>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/*******高速模式变量更改*********/#define FOSC 12000000#define T100KHz (FOSC/2/100000) //高速脉冲输出频率计算: f = PCA模块的时钟源/(2*CCAP0L)//CCAP0L = PCA时钟源/2/f)#define CLK_6 0x0d //Sysclk/6#define CLK_8 0x0e //Sysclk/8/********模式选择********/#define H_model 0x4d //高速输出模式,中断模式#define T_model 0x49 //定时模式#define P_model 0x42 //无中断PWM模式#define PL_model 0x63 //由低变高可中断PWM模式#define PH_model 0x53 //由高变低可中断PWM模式#define PHL_model 0x73 //高低都可中断PWM模式#define CU_model 0x61 //16位捕获,上升触发中断模式//********************************//// H_model初始化 ////********************************//void HP_init(void){CMOD = CLK_4; //PCA时钟源为SysclkCCAPM0 = H_model; //高速输出模式CCAP0L = value;CCAP0H = value>>8;value += T100KHz;CR = 1; //开启PCA计数器//当不使用定时0溢出为时钟源时,PWM输出的频率=PCA的时钟源/256//使用定时器溢出的时钟源时,可设定定时器的值对输出频率的改变//分频为0-256分频}//********************************// // T_model初始化 // //********************************//void CD_init(void){CMOD = CLK_4;CCAPM0 = CD_model;CR = 1;EA = 1;}//********************************// // 主程序 // //********************************////*******************************// void CD_Service(void) interrupt 7{CCF0 = 0;LED = ~LED;/*void TP_Service(void) interrupt 7{CCF0 = 0; //清除PCA计数器溢出中断标志test++;CCAP0L = value;CCAP0H = value>>8;value += T100KHz;} *///****************************************************************************//// STC12C5A60S2串行通信模块// IP(中断优先级寄存器)IPH()SADEN()SADDR()WAKE_CLKO(时钟唤醒寄存器)// Bit1 - PD 控制单片机进入掉电模式// //// 程序说明:程序实现从PC端发送数据到单片机,单片机将接收到的数据通过12864// 显示出来////****************************************************************************//时需修//波特率为19200uchar Send_Bflag = 0; //正在发送标志uchar Receive_Bflag = 0; //正在接送标志uchar Re;sbit LED = P1^4;sbit LED1 = P1^5;void UART_init(void);void Delay( uint time );#elif( BTL == 4800 )BRT = 0xB8;#elif( BTL == 9600 )//波特率设置为9600BRT = 0xDC;#elif( BTL == 14400 )BRT = 0xE8;#elif( BTL == 19200 )BRT = 0xEE;#elif( BTL == 28800 )BRT = 0xF4;}//************************************************// // 发送一个字节数据 // //************************************************// void Send_byte( uchar byte ){SBUF = byte;while(!TI);TI = 0;// 接收函数 // //************************************************//void Receive( void ){Write_Date(SBUF);Re++;if( Re == 16 )Location(2,0); if( Re == 32 )Location(3,0); if( Re == 48 )Location(4,0);if( Re == 66 )UART_init();while(1){if( RI == 1 ){RI = 0;Receive();Printf("Success!");}EA = 1;}//****************************************************************************//// STC12C5A60S2 SPI接口模块////是数#include <STC12C5A60S2.H>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/************对SPCTL寄存器的设置位宏定义*************/#define SSIG 0x80 //SS引脚忽略#define SPEN 0x40 //SPI使能位#define DORD 0x20 //SPI数据发送LSB最先发送#define MSTR 0x10 //主从模式选择/************串口波特率设定*************************/#define BTL 9600 //若要更改波特率直接更改此处,当波特率大于9600时需修改相应的接收程序,//可选波特率有以下: 否则有可能出现乱码//波特率为2400 //波特率为28800//波特率为4800 //波特率为38400 //波特率为9600 //波特率为57600 //波特率为14400 //波特率为115200//波特率为19200void UART_init(void);#if( BTL == 2400 )BRT = 0x70; //波特率设置为9600 #elif( BTL == 4800 )BRT = 0xB8;#elif( BTL == 9600 )BRT = 0xDC;#elif( BTL == 14400 )BRT = 0xE8;#elif( BTL == 19200 )BRT = 0xEE;// IP = 0X10; //PS = 1;串口1中断为最高优先级中断// EA = 1; //开总中断}//************************************************// // 发送一个字节数据 ////************************************************// void Send_byte( uchar byte ){SBUF = byte;while(!TI);//************************************************// // 接收函数 // //************************************************//uchar Receive( void ){uchar byte;_nop_();_nop_();_nop_();_nop_();//***********************************//void Init_SPI(void){SPDAT = 0; //清空数据寄存器 SPSTAT = SPIF|WCOL; //清空SPI状态寄存器SPCTL = SPEN|MSTR; //SPI设置为主机模式IE2 = 0x02; //允许SPI中断}//***********************************////* 名称:mainif(flag) //当PC端有发送数据时才进行SPI传输数据{SPISS = 0;SPDAT = flag;flag = 0;。

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编程

STC12C5A60S2编程

ADC#include<STC12C5A60S2.H>#include<intrins.h>//51基本运算(包括_nop_空函数)#include"ad.h"#include"uart.h"unsigned char code dispcode[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};void AD_Configurate (uchar ChannelNum){uchar AD_FLAG=0; //存储A/D转换标志ChannelNum &= 0x0f; //选择ADC的个接口中的一个(0111 清高位)ADC_CONTR = 0x40; //ADC转换的速度(XX0 0000 其中XX控制速度,请根据数据手册设置)_nop_();ADC_CONTR |= ChannelNum; //选择A/D当前通道_nop_();ADC_CONTR |= 0x80; //启动A/D电源delay(1); //使输入电压达到稳定(ms即可)}unsigned int ReadADV alue (void){unsigned char AD_FLAG=0; //存储A/D转换标志ADC_CONTR |= 0x08; //启动A/D转换(1000 令ADCS = 1)_nop_();_nop_();_nop_();_nop_();while (AD_FLAG ==0)//等待A/D转换结束{AD_FLAG = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否}ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D转换,return(ADC_RES*4+ADC_RESL);//返回A/D转换结果(位ADC数据高位在ADC_RES中,低位在ADC_RESL中)}void DigitalTube(unsigned long number){P2=0xef; //1110 1111P0=dispcode[number%10]; //显示number的个位delay(7);P2=0xdf; //1101 1111P0=(dispcode[number/10%10]); //显示number的十位delay(7);P2=0xbf; //1011 1111P0=(dispcode[number/100%10]); //显示number的百位delay(7);P2=0x7f; //1011 1111P0=(dispcode[number/1000]); //显示number的千位delay(7);}void delay (unsigned int a ){unsigned int i;while (--a != 0){for (i = 0; i < 600; i++);}}void GPIO_init (void){P2M0 = 0x0F; //0000 1111 //I/O接口的设置P2M1 = 0x00; //0000 0000 //I/O接口的设置P1M1 = 0x01; //P1.0作为ad功能}PWM#include<STC12C5A60S2.H>#include"pwm.h"#include"uart.h"unsigned int xdata FirstData=0; //上升沿捕捉数据unsigned int xdata SeconedData=0; //下降沿捕捉数据高电平时间=SeconedData-FirstData unsigned int xdata HighLevel=0; // 保存被测波形高电平时间对于测方波即使半个周期//采用半个周期的测法主要是提高可被测波形的频率范围unsigned int xdata Frequency=0; // 保存频率的变量bit Capture_over = 0; //捕获完成标志位void pwm_init(void){CMOD=0x80; //0000 0010 PCA工作模式寄存器系统时钟/12 计数器溢出中断CF CCAP0H =(CCAP0L = 254); //PCA捕捉/比较寄存器127 高低点CCAPM0=0x42; //0100 0010// CCAP1H =(CCAP1L = 0x7f);// CCAPM1=0x42;CCAPM1 = 0x21;//16位捕获模式,上升沿触打开捕获中断CCF1CCAP1L = 0x00;CCAP1H = 0x00;EA = 1;CCON=0x40; //0100 0000 PCA控制寄存器CR=1 启动PCA计数器阵列计数}void SetPwm0DutyCycle(unsigned int x) //占空比设置函数{unsigned int h=0,l=0;l=x&0xff;h=x>>8;CCAP0L=l;CCAP0H=h; //设置比较值}void PCA_Interrupt(void) interrupt 7{if (CCF1) //PCA模块中断{CCF1 = 0;if(FirstData == 0) // 上升沿中断{FirstData = CCAP1H; //获得捕捉数据的高位//高位<<8+低位构成位整数FirstData = (FirstData << 8) + CCAP1L;CCAPM1 = 0x11;// 下降沿捕获}else// 下降沿中断{CCF1 = 0; // 清CCF中断标志SeconedData = CCAP1H; //获得捕捉数据的高位//高位<<8+低位构成位整数SeconedData = (SeconedData << 8) + CCAP1L;HighLevel = SeconedData - FirstData; //计数值单位为usFrequency = (long)456000/ HighLevel; // 得到周期CR = 0;//停止PCA计数器计数CCAPM1 = 0x10;//停止捕获中断CCF0产生FirstData=0; // 为下一次捕捉设定初始条件CCAP1L = 0x00;//清零CCAP1H = 0x00;CL = 0x00; //清PCA计数器CH = 0x00;CCAPM1 = 0x21;Capture_over = 1;//捕获完成标志位}}// if(CF == 1) //PCA溢出中断// {// USART_Send_Str(" ;;;;;;;");// CF = 0; //清PCA溢出中断标志// CCAPM1 = 0x21;// FirstData=0; // 为下一次捕捉设定初始条件// CCAP1L = 0x00;//清零// CCAP1H = 0x00;// }}UART#include<STC12C5A60S2.H>#include<stdio.h>#include<string.h>#include"uart.h"//void uartinit(void)//{//// SCON = 0x50; //REN=1允许串行接受状态,串口工作模式// TMOD|= 0x20; //定时器工作方式// PCON|= 0x80;// //TH1 = 0xFD; //baud*2 /* reload value 19200、数据位、停止位。

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。

简单好用的stc12c5a串口2发送程序!

简单好用的stc12c5a串口2发送程序!

//功能:stc12c5a串口2发送程序,发送0--9,晶振频率11.0592MHz,串行口工作于方式1,波特率为9600#ifndef __STC12C5A60S2_H__#define __STC12C5A60S2_H__//--------------------------------------------------------------------------------//新一代 1T 8051系列单片机内核特殊功能寄存器 C51 Core SFRs// 7 6 5 4 3 21 0 Reset Valuesfr ACC = 0xE0; //Accumulator 0000,0000sfr B = 0xF0; //B Register 0000,0000sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OVF1 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 21 0 Reset Valuesfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PDIDL 0001,0000// 7 6 5 4 3 21 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单片机双串口通信
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 双串口使用程序

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

STC12C5A60S2双串口应用

STC12C5A60S2双串口应用
}
}
//串口2中断
void serial_2() interrupt 8 using 2
{
unsigned char rti;
unsigned char in_data;
rti=S2CON;
rti=rti &amp; 0x01;
if (rti==1) //接收
{
In_Data=S2BUF;
S2CON=S2CON &amp; 0xfe;
重入装载数,S2CON配置通讯模式。
例如:在12MHz频率下两串口工作在9600,8,1配置如下
//配置串口1
SCON=0x40; /*n,8,1 */
PCON=0x80; //Bps加倍
TCON=0;
ES=1;
REN=1;
//STC串口2定义
AUXR=0x1d; //配置两个串口波特率发生器采用内置,1个时钟/机器周期
STC12C5A60S2双串口应用
增强型8051芯片,具有双串口。我以前通常采用软件模拟一个串口来实
现,要占用太多的系统资源。该芯片可以通过一个内置的波特率发生器,实
现两个串口同时工作在一个波特率下,或一个通过内置,一个通过TH1实现
不同波特率的通讯。通过配置AUXR来配置波特率发生器BRT设置波特率
}
else //发送
{
S2CON=S2CON &amp; 0xfd;
//S2BUF=0x55; //发送数据
}
}ห้องสมุดไป่ตู้
BRT=0xb2; //重装载数
S2CON=0x50;
IE2=0x01; //ES2=1 //开中端
//串口1中断
void serial_1() interrupt 4using 2

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精简开发板产品使用手册

STC12C5A60S2单片机开发学习板产品使用手册【简要说明】一、尺寸:长83mmX宽79mmX高18mm二、主要芯片:STC12C5A60S2单片机三、工作电压:直流6~15伏四、、特点:1、具有电源指示;2、所有I/O口已引出;3、可以实现与电脑串口通信;4、可以实现双串口通讯;5、具有上电复位和手动复位;6、附带SD卡读写接口;7、支持STC串口下载;8、双串口通讯(注:只能使用COM1下载程序);9、八路LED灯(注:可拔出短路帽,断开LED灯);10、可端子接线供电、可排针引电;11、7805供电,输入电压范围宽,且确保AD参考电压准确(注:因无外部参考电压点)五、提供相关软件、资料、原理图适用场合:单片机学习、电子竞赛、产品开发、毕业设计。

注意啦:本产品提供的所有程序都附带原理图以及说明!【图片标注】【原理图】(放大可以看清楚)【PCB尺寸图】【开发板支持同系列单片机的型号】STC单片机最新型号——STC12C5A60S2STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。

内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。

1.增强型8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051;2.工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V-2.2V(3V单片机);3.工作频率范围:0 - 35MHz,相当于普通8051的 0~420MHz;4.用户应用程序空间8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K字节;5.片上集成1280字节RAM;6.通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口),可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏,每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55Ma;7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片;8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM);9. 看门狗;10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地);11.外部掉电检测电路:在P4.6口有一个低压门槛比较器,5V单片机为1.32V,误差为+/-5%,3.3V单片机为1.30V,误差为+/-3%;12.时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为+/-5%到+/-10%以内) 1用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟,常温下内部R/C振荡器频率为:5.0V单片机为:11MHz~15.5MHz,3.3V单片机为:8MHz~12MHz,精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准;13.共4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器再加上2路PCA模块可再实现2个16位定时器;14. 2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟;15.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块, Power Down模式可由外部中断唤醒,INT0/P3.2,INT1/P3.3,T0/P3.4, T1/P3.5, RxD/P3.0,CCP0/P1.3(也可通过寄存器设置到P4.2 ), CCP1/P1.4 (也可通过寄存器设置到P4.3);16. PWM(2路)/PCA(可编程计数器阵列,2路):——也可用来当2路D/A使用——也可用来再实现2个定时器——也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持);17.A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次)18.通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口;19. STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3);20.工作温度范围:-40 - +85℃(工业级) / 0 - 75℃(商业级)21.封装:PDIP-40,LQFP-44,LQFP-48 I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口, 还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。

常用程序模块备份(二):STC12C5A60S2,串口Uart

常用程序模块备份(二):STC12C5A60S2,串口Uart

void UartReceiveHandler(void); #endif uart.c------------------------------------------------------------------------------------------------------ #includeSTC12C5A60S2.h #include #include //stdio.h,stdarg.h 用于 vsprintf 函数原型 #include #define UART0_BUF_LEN 32 int UART1_Recv_count; //接收计数 bit UART1_Overflow_Flag;//缓冲区满标志 bit MarkFlag = 1;
while(!TI); //等待发送完成 TI=0; } else { SBUF=c; while(!TI); //等待发送完成 TI=0; } } void sendstring(unsigned char *string) //此处*string 相当于数组
} void sendbyte(unsigned char c) { if(c==‘\n’) //如果遇到\n 就换行 { //发送 CR(carriage return) SBUF=0x0D; while(!TI); //等待发送完成 TI=0; //发送 LF(NL line feed,new line) SBUF=0x0A;
RI = 0; if(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

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精简开发板带232及485产品使用手册

STC12C5A60S2精简开发板带232及485产品使用手册

STC12C5A60S2单片机开发学习板带232及485产品使用手册【简要说明】一、尺寸:长80mmX宽71mmX高12mm二、主要芯片:STC12C5A60S2单片机三、工作电压:直流6~36伏四、、特点:1、具有电源指示;2、所有I/O口已引出;3、可以实现与电脑串口通信;4、可以实现RS485通讯;5、具有上电复位和手动复位;6、LM2596宽电压稳压芯片;7、支持STC串口下载以及UART口下载;8、串口通讯(注:只能使用下载程序);9、八路LED灯(注:可拔出短路帽,断开LED灯);10、可端子接线供电、可排针引电;11、输入电压范围宽,且确保AD参考电压准确(注:因无外部参考电压点);12、四位按键输入,一位按键复位。

五、提供相关软件、资料、原理图适用场合:单片机学习、电子竞赛、产品开发、毕业设计。

注意啦:本产品提供的所有程序都附带原理图以及说明!【图片标注】【连接图】【原理图】(放大可以看清楚)【PCB尺寸图】【开发板支持同系列单片机的型号】STC单片机最新型号——STC12C5A60S2STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。

内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。

1.增强型8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051;2.工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V-2.2V(3V单片机);3.工作频率范围:0 - 35MHz,相当于普通8051的 0~420MHz;4.用户应用程序空间8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K 字节;5.片上集成1280字节RAM;6.通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口),可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏,每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55Ma;7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片;8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM);9. 看门狗;10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地);11.外部掉电检测电路:在P4.6口有一个低压门槛比较器,5V单片机为1.32V,误差为+/-5%,3.3V单片机为1.30V,误差为+/-3%;12.时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为+/-5%到+/-10%以内) 1用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟,常温下内部R/C振荡器频率为:5.0V单片机为:11MHz~15.5MHz,3.3V单片机为:8MHz~12MHz,精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准;13.共4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器再加上2路PCA模块可再实现2个16位定时器;14. 2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟;15.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块, Power Down模式可由外部中断唤醒,INT0/P3.2,INT1/P3.3,T0/P3.4, T1/P3.5, RxD/P3.0,CCP0/P1.3(也可通过寄存器设置到P4.2 ), CCP1/P1.4 (也可通过寄存器设置到P4.3);16. PWM(2路)/PCA(可编程计数器阵列,2路):——也可用来当2路D/A使用——也可用来再实现2个定时器——也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持);17.A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次)18.通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口;19. STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3);20.工作温度范围:-40 - +85℃(工业级) / 0 - 75℃(商业级)21.封装:PDIP-40,LQFP-44,LQFP-48 I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口, 还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

相关文档
最新文档