STC12C5A60S2编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ADC
#include
#include
#include"ad.h"
#include"uart.h"
unsigned char code dispcode[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
void AD_Configurate (uchar ChannelNum)
{
uchar AD_FLAG=0; //存储A/D转换标志
ChannelNum &= 0x0f; //选择ADC的个接口中的一个(0111 清高位)
ADC_CONTR = 0x40; //ADC转换的速度(XX0 0000 其中XX控制速度,请根据数据手册设置)_nop_();
ADC_CONTR |= ChannelNum; //选择A/D当前通道
_nop_();
ADC_CONTR |= 0x80; //启动A/D电源
delay(1); //使输入电压达到稳定(ms即可)
}
unsigned int ReadADV alue (void)
{
unsigned char AD_FLAG=0; //存储A/D转换标志
ADC_CONTR |= 0x08; //启动A/D转换(1000 令ADCS = 1)
_nop_();
_nop_();
_nop_();
_nop_();
while (AD_FLAG ==0)//等待A/D转换结束
{
AD_FLAG = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
}
ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D转换,
return(ADC_RES*4+ADC_RESL);//返回A/D转换结果(位ADC数据高位在ADC_RES中,低位在ADC_RESL中)
}
void DigitalTube(unsigned long number)
{
P2=0xef; //1110 1111
P0=dispcode[number%10]; //显示number的个位
delay(7);
P2=0xdf; //1101 1111
P0=(dispcode[number/10%10]); //显示number的十位
delay(7);
P2=0xbf; //1011 1111
P0=(dispcode[number/100%10]); //显示number的百位
delay(7);
P2=0x7f; //1011 1111
P0=(dispcode[number/1000]); //显示number的千位
delay(7);
}
void delay (unsigned int a )
{
unsigned int i;
while (--a != 0)
{
for (i = 0; i < 600; i++)
;
}
}
void GPIO_init (void)
{
P2M0 = 0x0F; //0000 1111 //I/O接口的设置
P2M1 = 0x00; //0000 0000 //I/O接口的设置
P1M1 = 0x01; //P1.0作为ad功能
}
PWM
#include
#include"pwm.h"
#include"uart.h"
unsigned int xdata FirstData=0; //上升沿捕捉数据
unsigned int xdata SeconedData=0; //下降沿捕捉数据高电平时间=SeconedData-FirstData unsigned int xdata HighLevel=0; // 保存被测波形高电平时间对于测方波即使半个周期
//采用半个周期的测法主要是提高可被测波形的频率范围unsigned int xdata Frequency=0; // 保存频率的变量
bit Capture_over = 0; //捕获完成标志位
void pwm_init(void)
{
CMOD=0x80; //0000 0010 PCA工作模式寄存器系统时钟/12 计数器溢出中断CF CCAP0H =(CCAP0L = 254); //PCA捕捉/比较寄存器127 高低点
CCAPM0=0x42; //0100 0010
// CCAP1H =(CCAP1L = 0x7f);
// CCAPM1=0x42;
CCAPM1 = 0x21;//16位捕获模式,上升沿触打开捕获中断CCF1
CCAP1L = 0x00;
CCAP1H = 0x00;
EA = 1;
CCON=0x40; //0100 0000 PCA控制寄存器CR=1 启动PCA计数器阵列计数
}
void SetPwm0DutyCycle(unsigned int x) //占空比设置函数
{
unsigned int h=0,l=0;
l=x&0xff;
h=x>>8;
CCAP0L=l;
CCAP0H=h; //设置比较值
}
void PCA_Interrupt(void) interrupt 7
{
if (CCF1) //PCA模块中断
{
CCF1 = 0;
if(FirstData == 0) // 上升沿中断
{
FirstData = CCAP1H; //获得捕捉数据的高位
//高位<<8+低位构成位整数
FirstData = (FirstData << 8) + CCAP1L;
CCAPM1 = 0x11;// 下降沿捕获
}
else// 下降沿中断
{
CCF1 = 0; // 清CCF中断标志
SeconedData = CCAP1H; //获得捕捉数据的高位
//高位<<8+低位构成位整数
SeconedData = (SeconedData << 8) + CCAP1L;
HighLevel = SeconedData - FirstData; //计数值单位为us
Frequency = (long)456000/ HighLevel; // 得到周期
CR = 0;//停止PCA计数器计数
CCAPM1 = 0x10;//停止捕获中断CCF0产生
FirstData=0; // 为下一次捕捉设定初始条件
CCAP1L = 0x00;//清零
CCAP1H = 0x00;
CL = 0x00; //清PCA计数器
CH = 0x00;
CCAPM1 = 0x21;
Capture_over = 1;//捕获完成标志位
}
}
// if(CF == 1) //PCA溢出中断
// {
// USART_Send_Str(" ;;;;;;;");
// CF = 0; //清PCA溢出中断标志// CCAPM1 = 0x21;