stc12c5a60s2单片机模块程序代码技术资料汇编.docx

上传人:b****5 文档编号:3400451 上传时间:2022-11-22 格式:DOCX 页数:43 大小:27.21KB
下载 相关 举报
stc12c5a60s2单片机模块程序代码技术资料汇编.docx_第1页
第1页 / 共43页
stc12c5a60s2单片机模块程序代码技术资料汇编.docx_第2页
第2页 / 共43页
stc12c5a60s2单片机模块程序代码技术资料汇编.docx_第3页
第3页 / 共43页
stc12c5a60s2单片机模块程序代码技术资料汇编.docx_第4页
第4页 / 共43页
stc12c5a60s2单片机模块程序代码技术资料汇编.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

stc12c5a60s2单片机模块程序代码技术资料汇编.docx

《stc12c5a60s2单片机模块程序代码技术资料汇编.docx》由会员分享,可在线阅读,更多相关《stc12c5a60s2单片机模块程序代码技术资料汇编.docx(43页珍藏版)》请在冰豆网上搜索。

stc12c5a60s2单片机模块程序代码技术资料汇编.docx

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--)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1