标题:
利用STC12LE5404AD单片机的AD和定时器输出频率和占空比可调 附视频
[打印本页]
作者:
ZPK
时间:
2018-11-11 10:20
标题:
利用STC12LE5404AD单片机的AD和定时器输出频率和占空比可调 附视频
题目:利用STC12LE5404AD单片机的AD和定时器输出频率和占空比可调。
功能:当调节频率时,占空比不变;调节占空比时,频率不变。
输出范围:10~500Hz , 5%~95%
电路描述:
1、手里现有STC12LE5204AD,所以使用它。要借鉴的朋友,根据自己的单片机资源调整;
2、现成的晶振频率为18.432MHz。根据自己手里的晶振使用,不需要通讯的话,可以使用12MHz或者24MHz的晶振,好计算周期。
3、使用单片机的A/D采样口为P1.6和P1.7端口(可以自己选择)。使用精密电位器,两个固定端,一个接地,一个3.3V电源;可调端接一个0.1uF的电容对地,然后通过一个2k
Ω
电阻接入单片机A/D采样端口。
4、
P3.7口输出(方波自己布PCB线路,可以自己选择输出口)
使用A/D采样的值(0~FF)去改变定时器的值实现占空比和频率调节。
最终性能有一点偏差,调节频率时,占空比有小范围波动。代码总长度为
0E78H
。望各位大侠勿喷,求指点迷津。
单片机源程序:
#include "reg51.h"
#include "intrins.h"
#define FOSC 18432000L
typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr ADC_CONTR = 0xBC; //ADC control register
sfr ADC_RES = 0xBD; //ADC high 8-bit result register
sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register
sfr P1ASF = 0x9D; //P1 secondary function control register
sfr AUXR = 0x8e;
sbit out=P3^7;
//sbit led1=P1^5;
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80 //ADC power control bit
#define ADC_FLAG 0x10 //ADC complete flag
#define ADC_START 0x08 //ADC start control bit
#define ADC_SPEEDLL 0x00 //420 clocks
float i=100,j=100;
float k=0,d,f,t,t1,t2;
WORD xms;
void InitADC();
void SendData(BYTE dat);
BYTE GetADCResult(BYTE ch);
void Delay(WORD n);
void ShowResult(BYTE ch);
void Timer0Init();
void Delay_xms(WORD xms);
void main()
{
InitADC(); //Init ADC sfr
out=1;
while (1)
{
ShowResult(6); //Show Channel6
ShowResult(7); //Show Channel7
i = GetADCResult(6);
f = GetADCResult(7);
_nop_(); //Must wait before inquiry
_nop_();
if(i<15) i=15;
else if(i>240) i=240;
if(f<5) f=5;
else if(f>240) f=250;
_nop_();
_nop_();
t=256/f;
d=i/256;
t1=d*t*100;
t2=(1-i/256)*t*100;
_nop_(); //Must wait before inquiry
_nop_();
_nop_();
_nop_();
out =1;
Delay_xms(t1);
out = 0;
Delay_xms(t2);
}
}
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));
ADC_CONTR &= ~ADC_FLAG;
return ADC_RES;
}
void InitADC()
{
P1ASF = 0xc0; //Open 8 channels ADC function
ADC_RES = 0; //Clear previous result
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2); //ADC power-on and delay
}
void SendData(BYTE dat)
{
while (!TI); //Wait for the previous data is sent
TI = 0; //Clear TI flag
SBUF = dat; //Send current data
}
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
void Timer0Init(void) //1????@18.432MHz
{
AUXR &= 0x7F;
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x00;
TH0 = 0xFA;
TF0 = 0;
TR0 = 1;
}
void Delay_xms(WORD xms)
{
WORD nms;
nms=xms*140;
while (nms--)
{
Timer0Init();
}
}
复制代码
0.png
(38.49 KB, 下载次数: 25)
下载附件
2018-11-11 14:00 上传
全部资料51hei下载地址:
视频.rar
(10.77 MB, 下载次数: 14)
2018-11-11 10:12 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1