stc12c5a60s2单片机模块程序代码技术资料汇编Word格式文档下载.docx
- 文档编号:16305940
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:43
- 大小:27.21KB
stc12c5a60s2单片机模块程序代码技术资料汇编Word格式文档下载.docx
《stc12c5a60s2单片机模块程序代码技术资料汇编Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《stc12c5a60s2单片机模块程序代码技术资料汇编Word格式文档下载.docx(43页珍藏版)》请在冰豆网上搜索。
}
#else/*条件编译CLKOUT0时钟输出*/
//CLKOUT0时钟和CLKOUT1初始化//
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
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输出时钟频率
STC12C5A60S2.h>
#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)
//配置P1.0口为频率输出
//允许波特率时钟工作
//工作模式为1T
#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
//**********************************************//
//主程序//
Sysclk_init();
//STC12C5A60S2系统省电模块//
STC12C5A60S2单片机有三种省电模式以降低功耗.空闲模式,低速模式
//掉电模式
PCON(电源控制寄存器)
//Bit0-IDL控制单片机进入IDLE空闲模式
//Bit1-PD控制单片机进入掉电模式
////
程序实现让单片机先工作一阵子(通过P0^3指示灯显示)
//然后进入掉电状态,利用外部中断0口来唤醒单片机工作
//唤醒后单片机将通过P0^0-3口的灯闪烁显示开始工作
#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;
voidAfter_Power_Down(void)
uchari;
for(i=0;
i<
100;
i++)
P0=0x0f;
P0=0x00;
//中断初始化//
voidIntp_init(void)
IT0=0;
//外部中断源0为低电平触发
EX0=1;
//允许外部中断
EA=1;
//开总中断
//主程序//
ucharj=0;
ucharwakeup_counter=0;
//记录掉电次数
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_();
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)
//等待高电平
Power_Down_LED_INT0=0;
else//未掉电状态
N_Power_Down_LED_INT0=1;
//不是掉电唤醒指示
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"
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作输入
EADC=1;
//允许A/D转换中断
//****************************************//
//串口初始化//
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;
{
Init_LCD();
AD_init();
UART_init();
//A/D中断服务//
voidAD_Service(void)interrupt5
ADC_CONTR&
=!
ADC_FLAG;
//清标志
Printf_Decimal(Result_Calculate());
ADC_CONTR=ADC_POWER|Speed_2|ADC_START;
//开始下一次转换
sbitPSB=P0^4;
//串/并行接口选择1-并行0-串行
sbitRS=P0^7;
//并行数据/命令选择,串行片选0-指令1-数据
sbitRW=P0^6;
//并行读写选择0-写1-读串行数据口
sbitE=P0^5;
//并行使能,串行同步时钟
//延时
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);
externvoidSendData(ucharbyte);
/***********以下部分为LCD的驱动程序*************/
//*名称:
Delay_ms()
//*功能:
实现软件延时
//*输入:
time-时间参数
//*输出:
无
//82,延时时间=(time*1003+16)us
while(time--)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- stc12c5a60s2单片机模块程序代码 技术资料汇编 stc12c5a60s2 单片机 模块 程序代码 技术资料 汇编