|
发表于 2009-7-14 09:21:01
|
显示全部楼层
675我也用过,我再给你发个项目,是通过滚轮开关来采样AD转换作为按键输入的,
#include "pic.h"
#include "pic12f6x.h"
#include "math.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define FAN_ON GPIO0
#define FAN_LOW GPIO1
#define LAMP_ION GPIO5
#define VoltageADR_H 0
#define VoltageADR_L 1
//+++++R3---R2---R1---R0-----
// U2 U1 U0
#define R0 107//40
#define R1 13//20
#define R2 6//10
#define R3 15//62
#define RA (R0+R1+R2+R3)
#define POW 0
#define IN 1
__CONFIG(UNPROTECT & BOREN & MCLREN & PWRTEN & WDTEN & INTIO);
/**************************************************************************
* 函数原型: void DelayXms(void)
* 功 能: 延时程序
**************************************************************************/
void DelayXms(uint j){
uint i;
for(;j > 0;j--){
CLRWDT();
i=196;
while(i){
i--;
}
}
}
/**************************************************************************
* 函数原型: void DATA_WRITE(void)
* 功 能: 写EEPROM
**************************************************************************/
/*
void DATA_WRITE(uchar ADDR, uchar DATA){
WREN = 1;
EEADR = ADDR;
EEDATA = DATA;
EECON2 = 0x55;
EECON2 = 0xaa;
WR = 1;
DelayXms(10);
}
/**************************************************************************
* 函数原型: void DATA_READ(void)
* 功 能: 读EEPROM
**************************************************************************/
/*
uchar DATA_READ(uchar ADDR){
EEADR = ADDR;
RD = 1;
DelayXms(10);
return(EEDATA);
}
/**************************************************************************
* 函数原型: void InitSys(void)
* 功 能: 系统初始化
**************************************************************************/
void InitSys(){
CMCON = 0x07; //关闭比较器功能
TRISIO = 0x14; //I/O口设置方向寄存器
GPIO = 0x00; //
WPU = 0x14; //弱上拉寄存器
ANSEL = 0x1c; //模拟选择寄存器:
}
/**************************************************************************
* 函数原型: void Voltage_Test(void)
* 功 能: 电压采样
**************************************************************************/
uint Voltage_Test( uchar mode){
uchar i;
uint cAVerage;
uint cTemp;
cAVerage = 0;
DelayXms(10);
if(mode == POW){
ADCON0 = 0x89; //A/D 控制寄存器:0x89--->AN2, 0x8d--->AN3
}
else{
ADCON0 = 0x8d; //A/D 控制寄存器:0x89--->AN2, 0x8d--->AN3
}
for(i=0; i<64; i++){
DelayXms(2);
GODONE = 1;
while(GODONE == 1);
cTemp = ADRESH;
cTemp &= 0x03;
cTemp <<= 8;
cTemp += ADRESL;
cAVerage += cTemp;
if(i>0){
cAVerage >>= 1;
}
}
return(cAVerage);
}
/**************************************************************************
* 函数原型: void ABS(void)
* 功 能: 绝对值计算
**************************************************************************/
uint ABS(uint a, uint b){
uint cTemp;
if(a>b){
cTemp = a-b;
}
else{
cTemp = b-a;
}
return(cTemp);
}
/**************************************************************************
* 函数原型: void compare(void)
* 功 能: 采样电压与电源输入电压比较
**************************************************************************/
uchar compare(void){
uint v_POW, v_IN;
uint v_U0, v_U1, v_U2;
uint cTemp0, cTemp1, cTemp2;
v_POW = Voltage_Test(POW);
v_IN = Voltage_Test(IN);
if(v_IN<0x10){
return(2);
}
v_U0 = ((R0*(v_POW>>1))/RA)<<1;
v_U1 = (((R0+R1)*(v_POW>>1))/RA)<<1;
v_U2 = (((R0+R1+R2)*(v_POW>>1))/RA)<<1;
cTemp0 = ABS(v_IN, v_U0);
cTemp1 = ABS(v_IN, v_U1);
cTemp2 = ABS(v_IN, v_U2);
if(cTemp0<=cTemp1){
if(cTemp0<=cTemp2){//----------2
return(0);
}
else{//--------0
return(2);
}
}
else{
if(cTemp1<=cTemp2){//----------1
return(1);
}
else{//--------0
return(2);
}
}
}
/**************************************************************************
* 函数原型: void Control(void)
* 功 能: 输出
**************************************************************************/
void Control(void){
switch(compare()){
case 0: //高速
FAN_ON = 1;
FAN_LOW = 0;
LAMP_ION = 1;
break;
case 1: //低速
FAN_ON = 0;
FAN_LOW = 1;
LAMP_ION = 1;
break;
default: //关
FAN_ON = 0;
FAN_LOW = 0;
LAMP_ION = 0;
break;
}
}
/**************************************************************************
* 函数原型: void main(void)
* 功 能: 主程序
**************************************************************************/
void main(void){
InitSys();
while(1){
CLRWDT();
Control();
}
} |
|