STC12C5A60S2串行通信模块
STC12C5A60S2单片机简介
S T C12C5A60S2单片机简介-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIANSTC12C5A60S2单片机简介:STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)STC12C5A60S2是哪一类单片机?是8051系列单片机,与普通51单片机相比有以下特点:1、同样晶振的情况下,速度是普通51的8~12倍2、有8路10位AD3、多了两个定时器,带PWM功能4、有SPI(串行外设接口)接口5、有EEPROM6、有1K内部扩展RAM7、有WATCH_DOG8、多一个串口9、IO口可以定义,有四种状态10、中断优先级有四种状态可定义单片2.4G无线射频收发芯片nRF24L01:可接受5V电平的输入,工作电压1.9~3.6V,单片无线收发器芯片,GFSK:高斯频移键控,在调制之前通过一个高斯低通滤波器来限制信号的频谱宽度。
数字调制方法,如:ASK——幅移键控调制,把二进制符号0和1分别用不同的幅度来表示。
FSK——频移键控调制,即用不同的频率来表示不同的符号。
如2KHz表示0,3KHz表示1。
GFSK——高斯频移键控,在调制之前通过一个高斯低通滤波器来限制信号的频谱宽度。
单片机的PCA模块?:PCA(可编程计数器阵列Programmable Counter Array)可编程计数器阵列(PCA)提供增强的定时器功能,与标准8051计数器/定时器相比,它需要较少的CPU 干预。
由高字节(PCAH)和低字节(PCAL)组成。
25页报告出现的传感器:RPR220:反射型光电探测器。
第12章STC12C5A60S2的串行口及SPI接口讲述
11/95
8.2
STC12C5A60S2单片机的串行口
STC12C5A60S2单片机具有2个采用UART工作方式 的全双工串行通信接口(串口1和串口2)。每个串口由2个 数据缓冲器、1个移位寄存器、1个串行控制寄存器和一个 波特率发生器等组成。每个串口的数据缓冲器由串行接收 缓冲器和发送缓冲器构成,它们在物理上是独立的,既可 以接收数据也可以发送数据,还可以同时发送和接收数据。 接收缓冲器只能读出,不能写入,而发送缓冲器则只能写 入,不能读出。它们共用一个地址号。STC12C5A60S2的 串行口既可以用于串行异步通信,也可以构成同步移位寄 存器。如果在串行口的输入/输出引脚上加上电平转换器, 可以方便地构成标准的RS-232接口。串口1与传统8051单片 机的串口完全兼容。串口2的结构、工作原理与串口1类似。
增强型8051单片机实用开发技术
3/95
并行通信与串行通信
通信的基本方式可分为并行通信和串行通信两种。 并行通信,是指数据的各位同时进行传送的方式。其特 点是传输速度快,但当距离较远,位数又多时导致了通 信线路复杂且成本高。串行通信,是指数据一位一位的 顺序传送的通信方式。其特点是通信线路简单,只要一 对传输线就可以实现通信,从而大大的降低了成本,特 别适用于远距离通信,但传送速度慢。
增强型8051单片机实用开发技术
1/95
第8章
串行通信
8.1 通信的有关概念
8.2 STC12C5A60S2单片机的串行接口 8.3 STC12C5A60S2单片机的SPI接口
增强型8051单片机实用开发技术
2/95
8.1 通信的有关概念
实际应用中,计算机的CPU与外部设备之间常常要进 行信息的交换,计算机之间也需要交换信息,所有这些 信息的交换均称为“通信”。
STC12C5A60S2串口通信
void ADC_ISR() interrupt 5
{
EADC = 0;//关闭A/D转换中断
ADC_CONTR &= !ADC_FLAG;//Clear ADC interrupt flag
ADC_RESULT = ADC_RES;//高8位赋值
AnswerChange(ADC_RESULT);
#include <STC_NEW_8051.H>
#include "UART.h"
#include "AD.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char RESULT[] = "The Answer of A/D Conventer :" ;
#include <intrins.h>
#include <STC_NEW_8051.H>
#include "UART.h"
#include "AD.h"
#define uchar unsigned char
#define uint unsigned int
sbit xxxx = P3^5;
uint i = 0;
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;
STC12C5A60S2定时器,STC12C5A60S2定时器程序
加代码。
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-AD采集-12864串行显示终极程序-带滤波
本程序是以电流采集为例的,采集的是电流传感器输出的电压,然后转换成电流,如果只需要采集电压的话将转化为电流的语句删除即可。AD是stc12c5a60s2自带的10位AD。使用很方便。有不明白的可以qq联系我,1264136841
WriteCommandLcd12864(0x01);//清屏
}
void WriteByteLcd12864(unsigned char temp)
{
unsigned char i;
LCD_CLK = 0;
for(i=0;i<8;i++)
{
if(temp&0x80)
LCD_SID = 1;
else
LCD_SID = 0;
}
void WriteStringAddress(unsigned char add,unsigned char length,unsigned char *temp)
{
WriteCommandLcd12864(add);
for(;length>0;length--)
{
WriteDataLcd12864(*temp);
temp++;
}
}
/***显示电压和电流***/
void displaystring(unsigned char add,unsigned int num)
{
unsigned char buf[10],i;
buf[0] = num/10000;
buf[1] = num%10000/1000;
STC12C5A60S2单片机双串口通信
//-----------------------------------
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&S2RI)
{
S2CON&=~S2RI;
flag2=1;
temp2=S2BUF;
}
}
12C5A60S2.h的头文件如下:
//--------------------------------------------------------------------------------
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模块简介
单片机STC12C5A60S2模块简介1、综述系统采用STC12C5A16S2单片机为核心,配合USB转串口芯片CH340T、RS232芯片Max232、四位共阳数码管、LED、按键和蜂鸣器组成最小系统。
单片机内部集成双串口、8路10bitADC和两路八位PWM。
系统由MINI USB供电和提供程序下载接口,使得电路大大简化,通用性增强。
2、模块分析2、1电源模块全系统工作在+5V且功耗较低,所以采用USB电源供电即可满足。
电源前级接入500mA自恢复保险丝,提供短路保护,芯片前级对地分别连接100uF 和0.1uF进行电源滤波。
电源部分引入三脚单联扭子开关将USB转串口芯片CH340T 的电源与芯片电源进行隔离,以方便下载程序。
图2.1 电源模块2.2、USB转串口STC12C5A16S2单片机可以通过串口烧写程序,系统采用CH340T将USB转换为串口信号,以供单片机下载程序,电路如图2.2:图2.2USB转串口模块图中UD+与UD-为计算机USB信号,RxD与TxD信号为CH340T转换后接到单片机的串口信号。
2.3、单片机模块单片机模块由复位电路,晶振电路和蜂鸣器电路组成,然后将多余I/O口外接以供扩展。
图2.3 单片机模块2.4、RS232模块使用Max232将单片机的第二串口引出,通过DB9接口实现与外界串口通信。
图2.4 RS232模块2.5、四位共阳数码管和LED模块单片机P2.0端口用于8个LED选通,P2.1-P2.4端口用于数码管位选;P0.0-P0.7用于数码管段选和8个LED选择。
图2.5四位共阳数码管图2.6 8位LED模块2.6、按键模块单片机P3.2-P3.5端口用于扫描按键状态,组成1X4键盘。
图2.7 按键模块3、操作步骤1、安装CH340T芯片驱动;2、将MINI USB电缆连接到开发板,进入计算机设备管理器-端口选项,会出现CH340T,并显示COM X,记住此端口号;3、拨动开关,电源指示灯有高亮和微亮两种状态;4、编写程序文件,编译生成.hex文件,打开STC串口上位机软件,打开.hex程序文件,选择端口号;5、拨动开关,调节电源指示灯在微亮状态,点击下载程序按钮,然后拨动开关,调节电源指示灯到高亮状态,开始下载文件。
STC12C5A60S2单片机各个模块程序代码
//* // CLKOUT2 时钟初始化 // //*********************************// void CLKOUT_init(void){WAKE_CLKO = 0x04; //Bit2-BRTCLKO 允许 P1.0 配置为独立波特率发生器的时钟输 出//BRT 工作在 1T 模式下时的输出频率 = Sysclk/(256-BRT)/2 //BRT 工作在 12T 模式下时输出频率 = Sysclk/12/(256-BRT)/2AUXR = 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文案大全实用标准文档 //* // // // // // // //// // // // // ////STC12C5A60S2 可编程时钟模块说明: STC12C5A60S2单片机有三路可编程时钟输出 CLKOUT0/T0/P3.4 CLKOUT1/T1/P3.5、 CLKOUT2/P1.0涉及寄存器: AUXR(辅助寄存器 ) 、WAKE_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 /* 条件编译独立波特率发生器时钟输出 */*// *//////T0 //T0 //1T //12T工作在 1T 模式时的输出频率 = SYSclk/(256-TH0)/2 工作在 12T 模式时的输出频率 = SYSclk/12/(256-TH0)/2 指的是每 1 个时钟加 1, 是普通 C51 的 12 倍 指的是每 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 一样定时器速度是普通 8051的 12倍, 即工作在 1T 模式下 定时器速度是普通 8051 的 12 倍, 即工作在 1T 模式下 定时器 0工作模式为方式 2, 自动装载时间常数 定时器 1工作模式为方式 2, 自动装载时间常数 更改该寄存器的值可实现对输出的时钟频率进行分频更改该寄存器的值可实现对输出的时钟频率进行分频//* // 主程序 // //* void main(){CLKOUT_init(); while(1);}//**************************************************************************** //// STC12C5A60S2 系统时钟模块 // //// 说明: STC12C5A60S2 单片机有两个时钟源,内部 R/C 振荡时钟和外部晶体时钟 // 出厂标准配置是使用外部晶体或时钟 // //// 涉及寄存器: CLK_DIV(时钟分频寄存器 )// 由该寄存器的 Bit0-2 组合可实现对时钟源进行 0、2、4、8、 16文案大全实用标准文档AUXR = 0xc0; //T0//T1TMOD = 0x22; ////TH0 = 0xff; // TL0 = 0xff; TH1 = 0xff; // TL1 = 0xff; TR1 = 1; TR0 = 1;}#endif*// *//实用标准文档//32 、64、 128 分频 ////// 程序说明:// 对外部时钟进行分频得到 Sysclk, 然后经过 P1.0 的独立波特率 //时钟输出功能 Sysclk/2 输出时钟频率//#include <STC12C5A60S2.h> #include <intrins.h>#define Bus_clk 12 // 若要修改系统时钟直接在此处修改// 系统时钟初始化 // *//的 sysclk 的 sysclk 的 sysclk 的 sysclk*////*void Sysclk_init(void){WAKE_CLKO = 0x04; // AUXR = 0x14;//配置 P1.0 口为频率输出 允许波特率时钟工作 // 工作模式为 1T档#endif}//**********************************************// // 主程序 ////**********************************************// void main(){Sysclk_init();while(1);}//*// // STC12C5A60S2 系统省电模块////// 说明: STC12C5A60S2 单片机有三种省电模式以降低功耗 . 空闲模式,低速模式// 掉电模式////// 涉及寄存器:// Bit0 - IDL // Bit1 - PD PCON电(源控制寄存器)控制单片机进入 IDLE 空闲模式控制单片机进入掉电模式/ / / // / 程序说明:程序实现让单片机先工作一阵子(通过 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 为低电平触发EX0 = 1; // 允许外部中断 EA = 1 ; // 开总中断文案大全//* *////软件延时 ////*//*//// 主程序 // *//void main(){uchar j = 0;uchar wakeup_counter = 0; // P0 = 0x00;Chip_Start_LED = 1; // Intp_init(); // 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 初始化系统正常工作指示 系统开始进入掉电状态 掉电唤醒后}else // 未掉电状态 文案大全实用标准文档 //* //* // = 0; Power_Down_LED_INT0 = 1; while( Power_Down_Wakeup_INT0 == 0 ) {nop();}Power_Down_LED_INT0 = 0;掉电唤醒状态指示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 (AD 控C 制寄存器 ) ADC_RES 、 ADC_RESL 转( 换结果寄存器 ) // 动 A/D 转换 // 转换 // 注意 : 、初次打开内部 A/D 模拟电源需适当延时等内部模拟电源稳定后 , 再启 启动 A/D 后,在转换结束前不改变任何 I/O 口的状态 , 有利于高精度 A/D // // 正确 // //// // 若能将定时器 / 串行/ 中断系统关闭更好。
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双串口通信例程
#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 板子的使用学习经历分享
最近,做项目,用到这个芯片。
由于我开始接触硬件,所以学习缓慢。
从暑假开始,到现在已经将近两个月了。
在第一段时间,主要看了7513 和2810 芯片它们的datasheet,很多寄存器,看的我头大。
第二段时间,开始学习stc12c5a60s2 的使用。
我有个试验箱,里面也有stc 芯片,不过它是90 的,而且有很多例程。
我就对着历程学习。
我对语言算法的了解还是不错的,所以大部分例程还是能很快看懂。
知道了端口,寄存器
的使用,SMON,PCON 等各种用于串口初始化工作相关设置。
写了串口通
信的上位机程序(用的是C#语言),写了下位机,通过对上位机命令的读取,
解析和执行。
第三阶段,也就是现在我在做的。
要通过I2C 协议,实现对7513 和2810 芯片的控制。
在前段时间,我也看过I2C 协议。
这个协议已经有很多代码
了,拿过来用就好。
花费时间较多的地方是,I2C 协议有器件地址和从地
址,我对从地址这概念就一直很困惑,现在的理解就是从器件内部的地址。
器件地址相当于班号,从器件地址相当于学号。
但是现在还没有实现,对7513 芯片内部一个寄存器的写和读(我用的从地
址是0x45),读出来的总是0,而且写进去后,再读还是0。
用的是别人写的
有子地址器件读写多字节函数,返回值都是1,表示函数执行完全正确,但。
STC12C5A60S2双串口应用
}
//串口2中断
void serial_2() interrupt 8 using 2
{
unsigned char rti;
unsigned char in_data;
rti=S2CON;
rti=rti & 0x01;
if (rti==1) //接收
{
In_Data=S2BUF;
S2CON=S2CON & 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 & 0xfd;
//S2BUF=0x55; //发送数据
}
}ห้องสมุดไป่ตู้
BRT=0xb2; //重装载数
S2CON=0x50;
IE2=0x01; //ES2=1 //开中端
//串口1中断
void serial_1() interrupt 4using 2
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 双串口使用程序(已经验证成功)#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;*/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--)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=1SM0 = 0; // 串口工作方式1:1位起始位,8位数据位,1位停止位允许串口接收SM1 = 1;REN = 1; // 允许串口接收//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发送函数*****************/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) // 发送端(发送的是字符){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() interrupt 4 // 中断编号4为串行口1中断{if(RI) // 接收标志位,0:正在接收1:接收完毕(如果RI=1就一直执行中断){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 = 0wj_uun2 = S2BUF; // 将串口2接收到的字符送入变量中}}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 = '?';}}}。
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&S2TI)); //若S2TI=0,在此等待S2CON&=~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&S2RI){S2CON&=~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。
stc12C60s2双485通讯开发板
适用场合:单片机学习、电子竞赛、产品开发、毕业设计。。。 注意啦:本产品提供的所有程序都附带原理图以及说明! 【整版标注】
2
【PCB 尺寸图】
【测试程序】
include "STC12C5A60S2.h" //库文件
#define uchar unsigned char//宏定义无符号字符型
}
/********************************************************************
串口二 发送一个字符
*********************************************************************/
TR1 = 1;
//启动定时器产生波特率
AUXR = 0x10;
//启动波特率发生器
IP = 0x00;
//优先级默认
EA = 1;
//开总中断
ES = 1;
//开串口 1 中断
IE2 = 0x01;
//开串口 2 中断
}
/********************************************************************
串口一 发送接收中断函数
*********************************************************************/
void uart_isr() interrupt 4
{
if( RI ) RI = 0;
dat1 = SBUF;
if( TI ) TI = 0;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
while( *p != '\0' )
{
Send_byte(*p);
p++;
}
}
//************************************************//
//口的波特率发生器,模式为1T
ES = 1; //允许串口中断
IPH = 0X10; //PSH = 1;
IP = 0X10; //PS = 1;串口1中断为最高优先级中断
EA = 1; //开总中断
//***********************************************//
void Com_Service(void) interrupt 4
{
EA = 0;
EA = 1;
}
}
if( TI == 1 )
{
TI = 0;
}
}
}
//***********************************************//
// 串口中断服务 //
//****************************************************************************//
// STC12C5A60S2串行通信模块 //
#include <intrins.h>
#include "LCD.h"
#define uchar unsigned char
#define uint unsigned int
#define BTL 9600 //若要更改波特率直接更改此处,当波特率大于9600时需修改相应的接收程序,
// IP(中断优先级寄存器)IPH()SADEN()SADDR()WAKE_CLKO(时钟唤醒寄存器)
// Bit1 - PD 控制单片机进入掉电模式
// //
// 程序说明: 程序实现从PC端发送数据到单片机,单片机将接收到的数据通过12864
// 当在P4口时 TxD2-P4.3引脚 RxD2-P4.2引脚
//
// 涉及寄存器:BRT(独立波特率发生器) AUXR(辅助寄存器)SCON(串行控制寄存器)
// SBUF(数据缓冲寄存器)PCON(电源控制寄存器)IE(中断控制寄存器)
//可选波特率有以下: 否则有可能出现乱码
//波特率为2400 //波特率为28800
//波特率为4800 //波特率为38400
//波特率为9600 //波特率为57600
//波特率为14400 //波特率为115200
//波特率为19200
uchar 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 );
void Receive(void);
void Printf( uchar *p );
}
//************************************************//
// 发送一个字节数据 //
//************************************************//
void Send_byte( uchar byte )
BRT = 0xF4;
#elif( BTL == 38400 )
BRT = 0xF7;
#elif( BTL == 57600 )
BRT = 0xFA;
#elif( BTL == 115200 )
BRT = 0xFD;
#endif
AUXR = 0x15; //选择独立波特率发生器为串行
#elif( BTL == 9600 )//波特率设置为9600
BRT = 0xDC;
#elif( BTL == 14400 )
BRT = 0xE8;
#elif( BTL == 19200 )
BRT = 0xEE;
#elif( BTL == 28800 )
//
// 说明: STC12C5A60S2单片机有2个采用UART工作方式的全双工串行通信接口
// 两个串口都有4种工作方式,两种波特率可变,两种波特率固定的
// 串口1为 TxD-P3.1引脚 RxD-P3.0引脚
// 串口2为 当在P1口时 TxD2-P1.3引脚 RxD2-P1.2引脚
{
SBUF = byte;
while(!TI);
TI = 0;
}
//************************************************//
// 打印字符 //
//************************************************//
// 显示出来
//
//****************************************************************************//
#include <STC12C5A60S2.h>
//****************************************//
// 串口初始化 //
//****************************************//
void UART_init(void)
{
SM0 = 0; //选择串口为方式1工作
SM1 = 1; //8位数据波特率可变
REN = 1;
#if( BTL == 2400 )
BRT = 0Байду номын сангаас70;
#elif( BTL == 4800 )
BRT = 0xB8;
}
Receive_Bflag = 1;
}
//************************************************//
// 主函数 //
//************************************************//
// 接收函数 //
//************************************************//
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 )
{
Re = 0;
Clear_Screen();
Location(1,0);
void main()
{
Init_LCD();
UART_init();
while(1)
{
if( RI == 1 )
{
RI = 0;
Receive();
Printf("Success!");