stc12c5a60s2单片机模块程序代码技术资料汇编.docx
《stc12c5a60s2单片机模块程序代码技术资料汇编.docx》由会员分享,可在线阅读,更多相关《stc12c5a60s2单片机模块程序代码技术资料汇编.docx(43页珍藏版)》请在冰豆网上搜索。
![stc12c5a60s2单片机模块程序代码技术资料汇编.docx](https://file1.bdocx.com/fileroot1/2022-11/22/4c1fc1bb-0da1-4032-aabb-90155fdeb725/4c1fc1bb-0da1-4032-aabb-90155fdeb7251.gif)
stc12c5a60s2单片机模块程序代码技术资料汇编
//****************************************************************************//
//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
#include
//#definePort_BRT//如果想测试独立波特率发生器时钟输出请打开此句
//若想测试CLKOUT1和CLKOUT0请注释此句
#ifdefPort_BRT/*条件编译独立波特率发生器时钟输出*/
//*********************************//
//CLKOUT2时钟初始化//
//*********************************//
voidCLKOUT_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-BRTx12BRT工作在1T模式下
BRT=0xff;//更改该寄存器的值可实现对输出的时钟频率进行分频
}
#else/*条件编译CLKOUT0时钟输出*/
//*********************************//
//CLKOUT0时钟和CLKOUT1初始化//
//*********************************//
voidCLKOUT_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
//**********************************//
//主程序//
//**********************************//
voidmain()
{
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
#include
#defineBus_clk12//若要修改系统时钟直接在此处修改
//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
//*********************************************//
//系统时钟初始化//
//*********************************************//
voidSysclk_init(void)
{
WAKE_CLKO=0x04;//配置P1.0口为频率输出
AUXR=0x14;//允许波特率时钟工作
//工作模式为1T
BRT=0xff;
#if(Bus_clk==12)
CLK_DIV=0x00;
#elif(Bus_clk==6)
CLK_DIV=0x01;
#elif(Bus_clk==3)
CLK_DIV=0x02;
#elif(Bus_clk==1500)
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
}
//**********************************************//
//主程序//
//**********************************************//
voidmain()
{
Sysclk_init();
while
(1);
}
//****************************************************************************//
//STC12C5A60S2系统省电模块//
//
//说明:
STC12C5A60S2单片机有三种省电模式以降低功耗.空闲模式,低速模式
//掉电模式
//
//
//涉及寄存器:
PCON(电源控制寄存器)
//Bit0-IDL控制单片机进入IDLE空闲模式
//Bit1-PD控制单片机进入掉电模式
////
//程序说明:
程序实现让单片机先工作一阵子(通过P0^3指示灯显示)
//然后进入掉电状态,利用外部中断0口来唤醒单片机工作
//唤醒后单片机将通过P0^0-3口的灯闪烁显示开始工作
////****************************************************************************//
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharPower_Down_Flag=0;//进入掉电状态标志
sbitChip_Start_LED=P0^0;//单片机开始工作指示灯
sbitPower_Down_LED_INT0=P0^1;//INT0口掉电唤醒指示灯
sbitN_Power_Down_LED_INT0=P0^2;//INT0口没有唤醒指示灯
sbitNormal_Work_LED=P0^3;//正常工作指示灯
sbitPower_Down_Wakeup_INT0=P3^2;//外中断唤醒输入口
voidDelay_ms(uinttime);
voidNormal_work(void);
voidIntp_init(void);
voidAfter_Powr_Down(void);
//***********************************//
//软件延时//
//***********************************//
voidDelay_ms(uinttime)
{
uintt;//延时时间=(time*1003+16)us
while(time--)
{
for(t=0;t<82;t++);
}
}
//***********************************//
//正常工作指示
//***********************************//
voidNormal_work(void)
{
Normal_Work_LED=1;
Delay_ms(500);
Normal_Work_LED=0;
Delay_ms(500);
}
voidAfter_Power_Down(void)
{
uchari;
for(i=0;i<100;i++)
{
P0=0x0f;
Delay_ms(500);
P0=0x00;
Delay_ms(500);
}
}
//***********************************//
//中断初始化//
//***********************************//
voidIntp_init(void)
{
IT0=0;//外部中断源0为低电平触发
EX0=1;//允许外部中断
EA=1;//开总中断
}
//***********************************//
//主程序//
//***********************************//
voidmain()
{
ucharj=0;
ucharwakeup_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();//掉电唤醒后
}
}
//**********************************//
//中断服务
//**********************************//
voidINT0_Service(void)interrupt0
{
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;
}
}
//****************************************************************************//
//STC12C5A60S2A/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转换
//若能将定时器/串行/中断系统关闭更好。
//2、A/D转换模块使用的时钟为内部R/C振荡器所产生的系统时钟
//3、由于使用两套时钟,设置好ADC_CONTR后要加4个空延时操作才可以正确
//读到ADC_CONTR寄存器的值
////
//程序说明:
//本程序实现P1^0口作为A/D采集输入口,对外部电压的测量并将测量结果通过
//12864和串口显示出来
////****************************************************************************//
#include
#include
#include"lcd.h"
#defineADC_POWER0x80//AD电源控制
#defineADC_START0x08//AD转换控制
#defineADC_FLAG0x10//AD转换完成
#defineSpeed_00x00//540clk
#defineSpeed_10x20//360clk
#defineSpeed_20x40//180clk
#defineSpeed_30x60//90clk
#defineADC00x00//P1.0
#defineADC10x01//P1.1
#defineADC20x02//P1.2
#defineADC30x03//P1.3
#defineADC40x04//P1.4
#defineADC50x05//P1.5
#defineADC60x06//P1.6
#defineADC70x07//P1.7
voidAD_init(void);
doubleResult_Calculate(void);
voidSendData(ucharbyte);
//**********************************//
//A/D初始化//
//**********************************//
voidAD_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周期转换,选择P1.0作输入
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
EADC=1;//允许A/D转换中断
EA=1;//开总中断
}
//****************************************//
//串口初始化//
//****************************************//
voidUART_init(void)
{
SM0=0;//选择串口为方式1工作
SM1=1;//8位数据波特率可变
REN=1;
BRT=0xDC;
AUXR=0x15;//选择独立波特率发生器为串行
//口的波特率发生器,模式为1T
}
//******************************************//
//转换结果计算//
//******************************************//
doubleResult_Calculate(void)
{
uinttemp;
doubleresult;
temp=ADC_RES*256+ADC_RESL;
result=temp*4.94/1024;
returnresult;
}
//******************************************//
//串口发送数据//
//******************************************//
voidSendData(ucharbyte)
{
SBUF=byte;
while(!
TI);
TI=0;
}
//******************************************//
//主程序//
//******************************************//
voidmain()
{
Init_LCD();
AD_init();
UART_init();
while
(1);
}
//******************************************//
//A/D中断服务//
//******************************************//
voidAD_Service(void)interrupt5
{
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_();
}
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitPSB=P0^4;//串/并行接口选择1-并行0-串行
sbitRS=P0^7;//并行数据/命令选择,串行片选0-指令1-数据
sbitRW=P0^6;//并行读写选择0-写1-读串行数据口
sbitE=P0^5;//并行使能,串行同步时钟
voidDelay_ms(uinttime);//延时
ucharBusy(void);//读忙
ucharRead_Status(void);//读状态
ucharRead_Date(void);//读数据
voidWrite_Cmd(ucharcmd);//写命令
voidWrite_Date(uchardate);//写数据
voidInit_LCD(void);//初始化LCD
voidLocation(ucharx,uchary);//设定显示位置
voidClear_Screen(void);//清屏
voidWrite_str(uchar*p);
voidPrintf_Decimal(doubleNum);
#include"lcd.h"
externvoidSendData(ucharbyte);
/***********以下部分为LCD的驱动程序*************/
//**********************************//
//*名称:
Delay_ms()
//*功能:
实现软件延时
//*输入:
time-时间参数
//*输出:
无
//**********************************//
voidDelay_ms(uinttime)
{
uintt;//82,延时时间=(time*1003+16)us
while(time--)