STC12C5A60S2的ADC PWM功能.docx
- 文档编号:27073983
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:15
- 大小:19.89KB
STC12C5A60S2的ADC PWM功能.docx
《STC12C5A60S2的ADC PWM功能.docx》由会员分享,可在线阅读,更多相关《STC12C5A60S2的ADC PWM功能.docx(15页珍藏版)》请在冰豆网上搜索。
STC12C5A60S2的ADCPWM功能
STC12C5A60S2的ADC+PWM功能
STC12C5A60S2单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,速度可达到250KHz(25万次/秒)。
脉宽调制(PWM)是一种使用程序来控制波形占空比、周期、相位波形的技术。
STC12C5A60S2单片机的PAC模块可以通过程序设定,使其工作于8位PWM模式。
下面是一段将ADC和PWM结合起来应用的程序:
/***************************************************************
时间:
2012.12.1
晶振:
12MHz
功能描述:
AD采集电位器的电压信号,然后信号以PWM信号输出控制LED的亮度(调节电位器)
当电位器两端的电压大时,LED较亮,同时用1602显示采集的电压值
AD采集通道:
P1.0
PWM输出:
P1.3
***************************************************************/
#include;
#include;
unsignedintresult,ge,shifen,baifen;
unsignedcharseg[10]={'0','1','2','3','4','5','6','7','8','9'};//要显示字符
sbitRS=P2^4;//命令数据
sbitRW=P2^5;//写还是读
sbitEN=P2^6;//使能端
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP0
/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bitLCD_Check_Busy(void)
{
DataPort=0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return(bit)(DataPort&0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
voidLCD_Write_Com(unsignedcharcom)
{
while(LCD_Check_Busy());//忙则等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort=com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
voidLCD_Write_Data(unsignedcharData)
{
while(LCD_Check_Busy());//忙则等待
RS_SET;
RW_CLR;
EN_SET;
DataPort=Data;
_nop_();
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
voidLCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)
{
if(y==0)
{
LCD_Write_Com(0x80+x);//表示第一行
}
else
{
LCD_Write_Com(0xC0+x);//表示第二行
}
while(*s)
{
LCD_Write_Data(*s);
s++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
{
if(y==0)
{
LCD_Write_Com(0x80+x);
}
else
{
LCD_Write_Com(0xC0+x);
}
LCD_Write_Data(Data);
}
/*------------------------------------------------
LCD初始化函数
------------------------------------------------*/
voidLCD_Init(void)
{
LCD_Write_Com(0x38);/*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);/*显示关闭*/
LCD_Write_Com(0x01);/*显示清屏*/
LCD_Write_Com(0x06);/*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C);/*显示开及光标设置*/
}
/*------------------------------------------------
ADC初始化函数
------------------------------------------------*/
voidInitADC()
{
P1ASF=0x01;//使能P1口ADC功能
ADC_RES=0;
ADC_CONTR=0xc8;
}
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
LCD_Init();
LCD_Clear();//清屏
LCD_Write_String(5,0,"526lab");//(列,行,数据)
LCD_Write_String(2,1,"Result:
");
InitADC();
IE=0xa0;//开中断
while
(1)
{
//PWM初始化
CCON=0;
CMOD=0;//1M
CCAP0H=CCAP0L=ADC_RES;
CCAPM0=0x42;//开启PWM
CR=1;//计时开始
//调用显示
LCD_Write_Char(9,1,seg[ge]);
LCD_Write_Char(10,1,'.');
LCD_Write_Char(11,1,seg[shifen]);
LCD_Write_Char(12,1,seg[baifen]);
LCD_Write_Char(13,1,'V');
}
}
/*------------------------------------------------
ADC中断处理函数
------------------------------------------------*/
voidadc_isr()interrupt5using1
{
unsignedinttemp;
temp=ADC_RES;
result=temp*0.01953125*1000;
ge=result/1000;
shifen=result%1000/100;
baifen=result%100/10;
ADC_CONTR=0xc8;//开启转换
}
12C5A60S2.h的头文件
//--------------------------------------------------------------------------------
//新一代1T8051系列单片机内核特殊功能寄存器C51CoreSFRs
//76543210ResetValue
sfrACC=0xE0;//Accumulator0000,0000
sfrB=0xF0;//BRegister0000,0000
sfrPSW=0xD0;//ProgramStatusWordCYACF0RS1RS0OVF1P0000,0000
//-----------------------------------
sbitCY=PSW^7;
sbitAC=PSW^6;
sbitF0=PSW^5;
sbitRS1=PSW^4;
sbitRS0=PSW^3;
sbitOV=PSW^2;
sbitP=PSW^0;
//-----------------------------------
sfrSP=0x81;//StackPointer0000,0111
sfrDPL=0x82;//DataPointerLowByte0000,0000
sfrDPH=0x83;//DataPointerHighByte0000,0000
//--------------------------------------------------------------------------------
//新一代1T8051系列单片机系统管理特殊功能寄存器
//76543210ResetValue
sfrPCON=0x87;//PowerControlSMODSMOD0LVDFPOFGF1GF0PDIDL0001,0000
//76543210ResetValue
sfrAUXR=0x8E;//AuxiliaryRegisterT0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRS0000,0000
//-----------------------------------
sfrAUXR1=0xA2;//AuxiliaryRegister1-PCA_P4SPI_P4S2_P4GF2ADRJ-DPS0000,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,使用缺省数据指针DPTR0
1,使用另一个数据指针DPTR1
*/
//-----------------------------------
sfrWAKE_CLKO=0x8F;//附加的SFRWAK1_CLKO
/*
76543210ResetValue
PCAWAKEUPRXD_PIN_IET1_PIN_IET0_PIN_IELVD_WAKE_T1CLKOT0CLKO0000,0000B
b7-PCAWAKEUP:
PCA中断可唤醒powerdown。
b6-RXD_PIN_IE:
当P3.0(RXD)下降沿置位RI时可唤醒powerdown(必须打开相应中断)。
b5-T1_PIN_IE:
当T1脚下降沿置位T1中断标志时可唤醒powerdown(必须打开相应中断)。
b4-T0_PIN_IE:
当T0脚下降沿置位T0中断标志时可唤醒powerdown(必须打开相应中断)。
b3-LVD_WAKE:
当CMPIN脚低电平置位LVD中断标志时可唤醒powerdown(必须打开相应中断)。
b2-
b1-T1CLKO:
允许T1CKO(P3.5)脚输出T1溢出脉冲,Fck1=1/2T1溢出率
b0-T0CLKO:
允许T0CKO(P3.4)脚输出T0溢出脉冲,Fck0=1/2T1溢出率
*/
//-----------------------------------
sfrCLK_DIV=0x97;//ClockDivder-----CLKS2CLKS1CLKS0xxxx,x000
//-----------------------------------
sfrBUS_SPEED=0xA1;//Stretchregister--ALES1ALES0-RWS2RWS1RWS0xx10,x011
/*
ALES1andALES0:
00:
TheP0addresssetuptimeandholdtimetoALEnegativeedgeisoneclockcycle
01:
TheP0addresssetuptimeandholdtimetoALEnegativeedgeistwoclockcycles.
10:
TheP0addresssetuptimeandholdtimetoALEnegativeedgeisthreeclockcycles.(default)
11:
TheP0addresssetuptimeandholdtimetoALEnegativeedgeisfourclockcycles.
RWS2,RWS1,RWS0:
000:
TheMOVXread/writepulseis1clockcycle.
001:
TheMOVXread/writepulseis2clockcycles.
010:
TheMOVXread/writepulseis3clockcycles.
011:
TheMOVXread/writepulseis4clockcycles.(default)
100:
TheMOVXread/writepulseis5clockcycles.
101:
TheMOVXread/writepulseis6clockcycles.
110:
TheMOVXread/writepulseis7clockcycles.
111:
TheMOVXread/writepulseis8clockcycles.
*/
//--------------------------------------------------------------------------------
//新一代1T8051系列单片机中断特殊功能寄存器
//有的中断控制、中断标志位散布在其它特殊功能寄存器中,这些位在位地址中定义
//其中有的位无位寻址能力,请参阅新一代1T8051系列单片机中文指南
//76543210ResetValue
sfrIE=0xA8;//中断控制寄存器EAELVDEADCESET1EX1ET0EX00x00,0000
//-----------------------
sbitEA=IE^7;
sbitELVD=IE^6;//低压监测中断允许位
sbitEADC=IE^5;//ADC中断允许位
sbitES=IE^4;
sbitET1=IE^3;
sbitEX1=IE^2;
sbitET0=IE^1;
sbitEX0=IE^0;
//-----------------------
sfrIE2=0xAF;//AuxiliaryInterrupt------ESPIES20000,0000B
//-----------------------
//76543210ResetValue
sfrIP=0xB8;//中断优先级低位PPCAPLVDPADCPSPT1PX1PT0PX00000,0000
//--------
sbitPPCA=IP^7;//PCA模块中断优先级
sbitPLVD=IP^6;//低压监测中断优先级
sbitPADC=IP^5;//ADC中断优先级
sbitPS=IP^4;
sbitPT1=IP^3;
sbitPX1=IP^2;
sbitPT0=IP^1;
sbitPX0=IP^0;
//-----------------------
//76543210ResetValue
sfrIPH=0xB7;//中断优先级高位PPCAHPLVDHPADCHPSHPT1HPX1HPT0HPX0H0000,0000
sfrIP2=0xB5;//------PSPIPS2xxxx,xx00
sfrIPH2=0xB6;//------PSPIHPS2Hxxxx,xx00
//-----------------------
//新一代1T8051系列单片机I/O口特殊功能寄存器
//76543210ResetValue
sfrP0=0x80;//8bitPort0P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.01111,1111
sfrP0M0=0x94;//0000,0000
sfrP0M1=0x93;//0000,0000
sfrP1=0x90;//8bitPort1P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.01111,1111
sfrP1M0=0x92;//0000,0000
sfrP1M1=0x91;//0000,0000
sfrP1ASF=0x9D;//P1analogspecialfunction
sfrP2=0xA0;//8bitPort2P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.01111,1111
sfrP2M0=0x96;//0000,0000
sfrP2M1=0x95;//0000,0000
sfrP3=0xB0;//8bitPort3P3.7P3.6P3.5P3.4P3.3P3.2P3.1P3.01111,1111
sfrP3M0=0xB2;//0000,0000
sfrP3M1=0xB1;//0000,0000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STC12C5A60S2的ADC PWM功能 STC12C5A60S2 ADC PWM 功能
![提示](https://static.bdocx.com/images/bang_tan.gif)