新手入门
- 积分
- 35
- 金钱
- 35
- 注册时间
- 2015-9-16
- 在线时间
- 4 小时
|
1金钱
我想用STC12c5a60s2单片机自带的AD做一个电压检测,以保护电路的安全。单片机检测到的电压应该是1.0V时单片机停止PWM的输出,以保护外电路的安全。我试验的时候再程序中用蜂鸣器的响和停来代替PWM的输出。程序下载好后被测电压还是零伏的时候蜂鸣器就开始响了,不知道是为什么,一下是我的程序和电路,请各位大神帮我看看哪里有问题了,小弟将感激不尽。
#include "STC12C5A60S2.H "
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define ADC_SPEEDLL 0x00
#define ADC_CHS0 0x01
#define ADC_CHS1 0x02
#define ADC_CHS2 0x04
sbit beer=P1^3;
sbit swei1=P1^1;
sbit swei2=P1^2;
sbit swei4=P3^7;
sbit swei3=P3^6;
uchar code table0[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
uchar q,b,s,g;
uint num,add,add1;
void display(uchar,uchar,uchar,uchar);
void adc_get();
void delay(uchar z)
{
uchar i,j;
for(i=z;i>0;i--)
{
for(j=110;j>0;j--);
}
}
void display(uchar qian,uchar bai, uchar shi ,uchar ge) //数码管显示AD转
//换结果即add=(((uint)ADC_RES<<2)|(ADC_RESL&3))
{
P2=0xff;
swei3=0;
P2=table0[shi];
delay(15);
P2=0xff;
swei3=1;
swei4=0;
P2=table0[ge];
delay(15);
P2=0xff;
swei4=1;
swei1=0;
P2=table0[qian];
delay(15);
P2=0xff;
swei1=1;
swei2=0;
P2=table0[bai];
delay(15);
P2=0xff;
swei2=1;
}
void adc_get()
{
if(num>=10)
{
num=0;
add1=add/10;
if(add1>=204)
{
q=add/1000;
b=add%1000/100;
s=add%1000%100/10;
g=add%10;
beer=0;
delay(10);
beer=1;
delay(10);
}
}
}
void init()
{
P1ASF=0x80; //用的市P1.7口
AUXR1=0x00;
ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ADC_CHS0|ADC_CHS1|ADC_CHS2;
_nop_();
_nop_();
_nop_();
_nop_();
ADC_RES=0;
ADC_RESL=0;
EADC=1; //开ADC中断
beer=1;
EA=1;
}
void main()
{
init();
while(1)
{
adc_get();
display(q,b,s,g);
}
}
void adc() interrupt 5
{
uint add;
ADC_CONTR&=!ADC_FLAG;
_nop_();
_nop_();
_nop_();
_nop_();
num++;
add=(((uint)ADC_RES<<2)|(ADC_RESL&3));
add1+=add;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ADC_CHS0|ADC_CHS1|ADC_CHS2;
_nop_();
_nop_();
_nop_();
_nop_();
}
|
-
|