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定时器,STC12C5A60S2定时器程序

STC12C5A60S2 定时器,STC12C5A60S2 定时器程序
STC12C5A60S2 单片机集成了共4 个16 位定时器,两个与传统8051 兼容的定时器/计数器,16 位定时器T0 和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器,再加上2 路PCA 模块可再实现2 个16 位定时器;
1. 基本特性
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 间隔闪烁,说明我们的代码是正确的。

现在我们修改一下代码,关闭定时器T0 的12 分频,粉色字段为新增加代码。

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单片机产生SPWM主程序C代码

STC12C5A60S2单片机产生SPWM主程序C代码

STC12C5A60S2单片机产生SPWM主程序C代码本程序通过模拟仿真,实际示波器测试,均表现良好,愿拿出来分享,若有更好的实现方法,希望高手多多指教。

/*************spwm产生程序******//*单片机STC12C5A60S2,晶振11.0592M,正弦波50Hz,spwm波形21.6KHz*/#include#define uchar unsigned char#define uint unsigned intuchar codepwm[54]={255,240,226,211,196,182,168,154,141,128, 115,103,91,80,69,59,50,42,34,27,20,15,10,6,3,1,0,0,1,3,6,10,15,20,27,34,42,50,59,69,80,91,103,115, 128,141,154,168,182,196,211,226,240,255}; // 反正弦变化int index=0;sbit P13=P1^3; //PCA模块0输出sbit P14=P1^4; //PCA模块1输出bit zf=0; //前后半周期标志void init_pca(void)//pca计数器初始化函数{CMOD=0x02;//计数器0的溢出为PCA计数器的时钟源,允许pca中断使能CCON=0x00;CCAPM0=0x42;//8位PWM输出,无中断CCAPM1=0x42;//8位PWM输出,无中断CL=0x00;//清零pca计数器CH=0x00;CCAP0L=pwm[0]; //初始化spwm输出的占空比CCAP0H=pwm[0];CCAP1L=pwm[0]; //初始化spwm输出的占空比CCAP1H=pwm[0];CR=1;//运行pca计数器}void init_timer(void)//计数器初始化函数{TMOD= 0x01; //计数器0工作在方式模式1TH0 = 0XF7;//T1的计数值为2048,若是11.0592M晶振,则中断频率为11.0592M/2048=5.4KTL0 = 0xFF; //T1的计数值低位AUXR=0xC0;//计数器均工作在1T模式。

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定时器程序
确的。现在我们修改一下代码,关闭定时器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控制AT24C04的程序(C语言)

单片机STC12C5A60S2控制AT24C04的程序(C语言)
**************************************/
void Delay5ms()
{
WORD n = 2500;
while(n--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/**************************************
起始信号
**************************************/
void AT24C04_Start()
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
Delay5us(); //延时
SCL = 0; //拉低时钟线
SDA = 1; //产生上升沿
*******************************
发送应答信号
入口参数:ack(0:ACK 1:NAK)
**************************************/
void AT24C04_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
/**************************************
接收应答信号
**************************************/

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单片机PWM程序

STC12C5A60S2单片机PWM程序

STC12C5A60S2单片机PWM程序两个头文件main.c#include <REG51.H>#include <intrins.h>#define U8 unsigned char#define U16 unsigned intvoid DelayMs(U8 ms);void PWM_clock(U8 clock); void PWM_start(U8 module,U8 mode);////////////////////// 延时子程序/////////////////////////////void DelayMs(U8 ms) // 在11.0592M 晶振下,stclOf 系列(单周期指令)的ms 级延时{U16 i;while(ms--){for(i = 0; i < 850; i++); }}//////////////////// 主函数入口////////////////////////////sfr CCON = 0xD8; //PCA 控制寄存器sfr CMOD = 0xD9; //PCA 模式寄存器sfr CCAPM0 = 0xDA; //PCA 模块0模式寄存器// 模块0对应P1.3/CEX0/PCA0/PWM0(STC12C5A60系列)sfr CCAPM1 = 0xDB; //PCA 模块1 模式寄存器// 模块1 对应P1.4/CEX1/PCA1/PWM1(STC12C5A60系列)sfr CL = 0xE9; //PCA 定时寄存器低位sfr CH = 0xF9; //PCA 定时寄存器高位sfr CCAP0L = 0xEA; //PCA 模块0的捕获寄存器低位sfr CCAP0H = 0xFA;//PCA模块0的捕获寄存器高位sfr CCAP1L = OxEB; //PCA 模块1的捕获寄存器低位sfr CCAP1H = 0xFB; //PCA 模块1的捕获寄存器高位sfr PCA_PWM0 = 0xF2; //PCA PWM 模式辅助寄存器0sfr PCA_PWM1 = 0xF3; //PCA PWM 模式辅助寄存器1sbit CF = 0xDF; //PCA 计数溢出标志位sbit CR = 0xDE; //PCA 计数器运行控制位sbit CCF1 = 0xD9; //PCA 模块1 中断标志sbit CCF0 = 0xD8; //PCA 模块0 中断标志//* CCAPOH = CCAPOL = 0XC0; // 模块0 输出占空因数为25%//* CCAPOH = CCAPOL = 0X80; // 模块0 输出占空因数为50%//* CCAPOH = CCAPOL = 0X40; // 模块0 输出占空因数为75%void PWM_clock(U8 clock);void PWM_start(U8 module,U8 mode);void PWM_clock(U8 clock){CMOD |= (clock<<1);CL = 0x00;CH = 0x00;void PWM_start(U8 module,U8 mode,U8 zkb) {CCAP0L = 0XC0;CCAP0H = 0XC0; // 模块 0 初始输出 占空因数为 25% CCAP1L = 0XC0; CCAP1H = 0XC0; // 模块 1 初始输出 占空因数为 25% if(module==0) {中断default: break;}}elseif(module==1){switch(mode){ switch(mode){case 0: CCAPM0 = 0X42;break; //case 1: CCAPM0 = 0X53;break; //中断case 2: CCAPM0 = 0X63;break; //中断case 3: CCAPM0 = 0X73;break; //模块0设置为8位PWM 输出,无中断 模块0设置为8位PWM 输出,下降沿产生 模块0设置为8位PWM 输出,上升沿产生case 0: CCAPM0 = CCAPM1 = 0X42;break; //出,无中断case 1: CCAPM0 = CCAPM1 = 0X53;break; //出,下降沿产生中断case 2: CCAPM0 = CCAPM1 = 0X63;break; //出,上升沿产生中断case 3: CCAPM0 = CCAPM1 = 0X73;break; //出,跳变沿产生中断default: break; case 0: CCAPM1 = 0X42;break; //case 1: CCAPM1 = 0X53;break; //中断case 2: CCAPM1 = 0X63;break; // 中断 case 3: CCAPM1 = 0X73;break; //中断default: break;}}elseif(module==2){switch(mode){模块1设置为8位PWM 输出,无中断 模块1设置为8位PWM 输出,下降沿产生 模块1设置为8位PWM 输出,上升沿产生模块0和1设置为8位PWM 输模块0和1设置为8位PWM 输 模块0和1设置为8位PWM 输 模块0和1设置为8位PWM 输}CR=1; //PCA 计数器开始计数}void PCA_Intrrpt(void) interrupt 7 {if(CCF0) CCF0=0;if(CCF1) CCF1=0; // 软件清零if(CF) CF=0; // 软件清零}void main(){TMOD|=0x02; /* timer 0 mode 2: 8-Bit reload */TH0=0xff;TR0=1;PWM_clock(2); // PCA/PWM 时钟源为定时器0 的溢出PWM_start(O,O); // 模块0,设置为PWM输出,无中断,初始占空因素为25% DelayMs(250);ITO=1; // 下降沿触发EXO=1; // 开中断OEA=1; // 开总中断while(1); // 等待中断产生,按下S15按键产生中断信号}#include "reg51.h"#define uchar unsigned char #define uint unsigned intsbit di=P3A7;uchar jishu=0x00; // 用来记录中断的次数void delay(uchar z){uchar i;for(i=0;i<z;i++);}/ """"""""""""""""""""""""""""""""""""// if n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n // 外部中断0 子函数void PWM_Select(void) interrupt 0 {U8 modjishu++; // 中断一次加1mod=jishu%3;switch(mod){case 0: CCAPM0 = 0X42;break; //0 设置为25%PW输出case 1: CCAPM0 = 0X53;break; //0 设置为50%PW输出case 2: CCAPM0 = 0X63;break; //0 设置为75%PW输出default: break;} delay(255);。

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 AD 程序

stc12c5a60s2  AD 程序
//AD速度设置。
#define ADC_SPEEDLL 0x00 //540 clocks
#define ADC_SPEEDL 0x20 //360 clocks
#define ADC_SPEEDH 0x40 //180 clocks
#define uchar unsigned char
#define uint unsigned int
/*LCD 各种端口的设置 */
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
sbit LCD_PSB=P2^3;
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC开始标志位。
/*可写入 4*8 汉字,x的范围是1到4,y的范围是1到8*/
void lcd_string(uchar x,uchar y,char*str)
{
static uchar flag = 0;
uchar i = 0;
if(!flag)
{
lcd_init();
flag = 1;
case 3 : temp = 0x88;
break;
case 4 : temp = 0x98;
break;
default : temp = 0x80;
break;
}
pos = temp + col-1;
LCD_0(0,pos);
}
}
/*字符位置的选定*/

stc12c5a60s2单片机spwm发生程序带仿真文件

stc12c5a60s2单片机spwm发生程序带仿真文件
57d4a26439b28&k=pca&k0=pca&kdi0=0&luki=3&n=10&p=&q=98059059_c
pr&rb=0&rs=1&seller_id=1&sid=289b43264a7d3525&ssp2=1&stid=0&t=tpclicked
3_hc&tu=u1831118&u=http%3A%2F%2Fwww%2E51hei%2Ecom%2Fmcபைடு நூலகம்%2F211
stc12c5a60s2单片机spwm发生程序带仿真文件
包含文件和仿真文件的下载地址:51hei/f/stc12c5a60s2_spwm.zip下面是主程
序部分:#include #include
#define uintunsigned int
uchar index;uchara;void init_pca(void)//pca计数器初始化函数
8%2Ehtml&urlid=0”id=“5_nwl”mpid=“5”target=“_blank”>pca计数器
}
void init_timer(void)//计数器初始化函数
{
TMOD= 0x12; //计数器0工作在方式模式2,计数器1工作在方式1
TH0 = 0xFF;//T0的计数值为5,把时钟源5分频
{
CMOD=0x04;//计数器0的溢出为PCA计数器的时钟源
CCON=0x00;
CCAPM0=0x42;//8位PWM输出,无中断
CL=0x00;//清零pca计数器
CH=0x00;
CCAP0L=pwm[0];//初始化spwm输出的占空比

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。

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)。
CLKOUT1/T1/P3.5、CLKOUT2/P1.0
涉及寄存器:AUXR辅助寄存器)、WAKE_CLKO(钟与系统掉电唤醒控制寄存器)
BRT(独立波特率发生器定时器寄存器)
程序说明:
本程序可选实现P3.4输出CLKOUT0寸钟、P3.5输出CLK0UT1时钟
P1.0输出CLK0UT2寸钟
////**
若想测试CLKOUT和CLKOUT请注释此句
#ifdef Port_BRT/*
条件编译独立波特率发生器时钟输出*/
//*
*******************************
*//
//CLKOUT2时钟初始化//
//*********************************//
void CLKOUT_init(void)
〃Bit2-BRTx12 BRT工作在1T模式下
BRT=0xff;//更改该寄存器的值可实现对输出的时钟频率进行分频
}
#else/*条件编译CLKOUT0寸钟输出*/
//*********************************//
void CLKOUT_init(void)
{
WAKE_CLKO=0x03;//允许将P3.4/T0脚配置为定时器0的时钟输出CLKOUT0
//
对外部时钟进行分频得到Sysclk,然后经过P1.0的独立波特率
//
时钟输出功能Sysclk/2输出时钟频率
'***************************************************************************
//
#include <STC12C5A60S2.h> #include <intrins.h>
== 93750 )
CLK_DIV
=0x07;
#endif
}
//**********************************************//
//主程序//
//**********************************************//
void main()
{
Sysclk_init();
while(1);
}
//*
***************************************************************************
//
//
STC12C5A60S2系 统 省 电 模 块
#define Bus_clk12 //若要修改系统时钟直接在此处修改
//系统时钟初始化//
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 )
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
//*
***************************************************************************
//
//
//
//
//////Fra bibliotek////
//
//
//
//
//
STC12C5A60S2可编程时钟模块
说明:STC12C5A60S2单片机有三路可编程时钟输出CLKOUTO/TO/P3.4
工作在定时器模式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,自动装载时间常数 更改该寄存器的值可实现对输出的时钟频率进行分频
{
WAKE_CLKO=0x04; //Bit2-BRTCLKO允许P1.0配置为独立波特率发生器的时钟输 出
//BRT工作在1T模式下时的输出频率=Sysclk/(256-BRT)/2
//BRT工作在12T模式下时输出频率=Sysclk/12/(256-BRT)/2
AUXR = 0x14; //Bit4-BRTR允许独立波特率发生器运行
//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的时钟输出CLK0UT1只能
************************************************************************
**//
#include <STC12C5A60S2.H>
#include <intrins.h>
//#define Port_BRT//
//
如果想测试独立波特率发生器时钟输出请打开此句
更改该寄存器的值可实现对输出的时钟频率进行分频
//主程序//
void main()
{
CLK0UT_init();
while(1);
}//****************************************************************************
//
//STC12C5A60S2系统时钟模块
//
//
//说明:STC12C5A60S2单片机有两个时钟源,内部R/C振荡时钟和外部晶体时钟
//出厂标准配置是使用外部晶体或时钟
//
//
//涉及寄存器:CLK_DIV(时钟分频寄存器)
//由该寄存器的Bit0-2组合可实现对时钟源进行0、2、4、8、16
//
32
、64、128分频
//
//
//
程序说明:
相关文档
最新文档