STC12C5A60S2编程

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ADC

#include

#include//51基本运算(包括_nop_空函数)

#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;

相关文档
最新文档