最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

pic16f676

来源:动视网 责编:小OO 时间:2025-09-23 12:26:03
文档

pic16f676

#include//包含单片机内部资源预定义#defineuintunsignedint#defineucharunsignedchar#defineN9__CONFIG(0X31E4);//定义芯片工作时的配置位uchark,ads;//off堵转后马上回到关闭档马上转动ucharstart,start1,start2,kkkk;//start为启动一次标志位start1为堵转保护启动标志位ucharmo_stop;ucharssss,num;////////////////////////
推荐度:
导读#include//包含单片机内部资源预定义#defineuintunsignedint#defineucharunsignedchar#defineN9__CONFIG(0X31E4);//定义芯片工作时的配置位uchark,ads;//off堵转后马上回到关闭档马上转动ucharstart,start1,start2,kkkk;//start为启动一次标志位start1为堵转保护启动标志位ucharmo_stop;ucharssss,num;////////////////////////
#include // 包含单片机内部资源预定义

#define uint unsigned int

#define uchar unsigned char

#define N 9

__CONFIG(0X31E4); // 定义芯片工作时的配置位

uchar k,ads; //off堵转后马上回到关闭档马上转动

uchar start,start1,start2,kkkk; //start为启动一次标志位 start1为堵转保护启动标志位

uchar mo_stop;

uchar ssss,num;

///////////////////////////////////////////////////////////////////////////////////////

uchar adtongdao(uchar channel);

void delay(uint time);

void init(); // I/O口初始化函数申明

void mode_select(); // ADC函数申明

void off_mode();

void auto_mode();

void low_mode();

void high_mode();

void anion(); //负离子监测,

void motor_stop();

void voltage_test();

void st1();

///////////////////////////////////////////////////////////////////////////////////////

void main()

{

init();

while(1)

{

voltage_test();

}

}

uchar adtongdao(uchar channel)

{

uchar s,k,temp,i,j;

uchar bian[N]={0,0,0,0,0};

uint ADRES=0; //累加和注意清零

for(s=0;s{

channel&=0x07;

ADCON0&=0x01; //ADON=1;,flag

ADCON0|=(channel<<2);

delay(1);

GODONE=1;

while(GODONE) continue; //while(GODONE==1) 注意程序简洁

k++;

bian[k]=ADRESH;

if(k==N)

{

k=0;

for(i=0;ifor(j=i+1;j{

if(bian[i]>bian[j])

{

temp=bian[i];

bian[i]=bian[j];

bian[j]=temp;

}

}

}

}

for(i=3;iADRES+=bian[i];

ads=(uchar)(ADRES/(N-6));

return ads; //仅仅返回高位值

}

void delay(uint time) //1ms延时

{

uint x,y;

for(x=110;x>0;x--)

for(y=time;y>0;y--);

}

void init() //初始化函数

{

CMCON=0x07; //比较器控制寄存器,比较器关断

PORTA=0x00;

OSCCAL=0x80; //内部振荡器校准寄存器,中心频率4MHz

OPTION=0x7F; //选择寄存器,使能弱上拉功能

INTCON=0x00; //中断控制寄存器,禁止所有中断

T1CON=0x00; //Timer1控制寄存器

PIE1=0x00; //外设中断使能寄存器,禁止EE写完成中断、A/D转换中断、比较器中断

WPUA=0x13; //使能弱上拉

CMCON=0x07; //比较器控制寄存器,比较器关断

IOCA=0x00;

//电平变换中断控制寄存器,禁止电平变化中断

ADCON1=0x00; //A/D转换时钟频率选择:

ADCON0=0X01; //采用左对齐

TRISA=0x1B; //0001 1011

TRISC=0x3F; //PORTC输入

ANSEL=0xFB; //AN3~AN7作为A/D模块的模拟信号输入

start=1;

start1=1;

start2=1;

}

void mode_select() // 工作模式选择

{

uchar ADCR,i;

if(kkkk==1) //堵转后返回OFF档位时判断从新开始

{

kkkk=0;

for(i=0;i<255;i++) //约4秒 255*16=4000

{

ADCR=adtongdao(4);

if(ADCR<=55)

delay(16);

else if(ADCR>55)

break;

}

}

ADCR=adtongdao(4);

if (ADCR<=2)

{

if(k<4)

high_mode();

}

else if (ADCR<=20)

{

if(k<4)

low_mode();

}

else if (ADCR<=55)

{

if(k<4)

auto_mode();

}

else

off_mode();

}

void high_mode()

{

if(start1==1)

{

start1=0;

if(start2==1){start2=0;delay(4000);} //在档位上重新上电延时和进口主板现象一致

st1();

}

if(mo_stop<2)

{

if(ssss==1)

{

delay(3000);

CMCON=0x07;

RA0=0;

RA1=0;

RA2=0;

RA5=0;

}

else

{

CMCON=0x0D;

VRCON=0x87;

ssss=1;

if(num<3)

anion();

}

}

else

{

CMCON=0x0D;

VRCON=0x87;

if(num<3)

anion();

}

}

void low_mode()

{

if(start1==1)

{

start1=0;

if(start2==1){start2=0;delay(4000);} //在档位上重新上电延时和进口主板现象一致,实际从低档测试时候把 delay(4000)可以该小一点

st1();

}

if(mo_stop<2)

{

if(ssss==1)

{

delay(3000);

CMCON=0x07;

RA0=0;

RA1=0;

RA2=0;

RA5=0;

}

else

{

CMCON=0x0D;

VRCON=0x82;

if(num<3)

anion();

ssss=1;

}

}

else

{

CMCON=0x0D;

VRCON=0x82;

if(num<3)

anion();

}

}

void auto_mode()

{

uchar auto_ad;

auto_ad=adtongdao(7);

start1=0; //屏蔽高、低之间的推力

if(start2==1){start2=0;delay(4000);} //在档位上重新上电延时和进口主板现象一致

st1();

if(auto_ad>72&&auto_ad<180) //80对应电压值为1.5V左右、145对应3.7V

{

if(mo_stop<2)

{

if(ssss==1)

{

delay(3000);

CMCON=0x07;

RA0=0;

RA1=0;

RA2=0;

RA5=0;

}

else

{

CMCON=0x0D;

VRCON=0x87;

if(num<3)

anion();

ssss=1;

}

}

else

{

CMCON=0x0D;

VRCON=0x87;

if(num<3)

anion();

}

}

e

lse if(auto_ad>180)

{

if(mo_stop<2)

{

if(ssss==1)

{

delay(3000);

CMCON=0x07;

RA0=0;

RA1=0;

RA2=0;

RA5=0;

}

else

{

CMCON=0x0D;

VRCON=0x88;

if(num<3)

anion();

ssss=1;

}

}

else

{

CMCON=0x0D;

VRCON=0x88;

if(num<3)

anion();

}

}

else if(auto_ad<72)

{

if(mo_stop<2)

{

if(ssss==1)

{

delay(3000);

CMCON=0x07;

RA0=0;

RA1=0;

RA2=0;

RA5=0;

}

else

{

CMCON=0x0D;

VRCON=0x84;

if(num<3)

anion();

ssss=1;

}

}

else

{

CMCON=0x0D;

VRCON=0x84;

if(num<3) //负离子拔插查2次

anion();

}

}

}

void off_mode()

{

CMCON=0x07; //比较器控制寄存器

RA0=0;

RA1=0;

RA2=0;

RA3=0;

RA4=0; //堵转反馈

RA5=0;

k=0; //控制电机堵转次数

start=1; //自动档启动时候仅仅一次保护标志位

start1=0;

start2=0; //克服掉自动档启动时候的沿时

ssss=0; //控制启动时拔电机

num=0; //控制负离子拔插次数

}

void anion()

{

uchar anion_ad,kk; // 初值设置为ss=1,可以让程序一直执行程序

RA5=1;

delay(5); // 注意调节时间,注意实时性

anion_ad=adtongdao(5);

if((anion_ad>2)&&(anion_ad<25))

{

RA5=1;

kk=1;

}

else

{

RA5=0;

if(kk==1){kk=0;num++;}//num<3 其实加到3结束

delay(2000);

}

}

void motor_stop()

{

mo_stop=adtongdao(3);

if(mo_stop>130) //马达正常运转时候,AN3对应的最高电压值为:3.43V左右,对应的AD值约为:175

{

delay(1);

if(mo_stop>130) //35为单片机进行电流监测电流最小值

{

CMCON=0x07; //比较器控制寄存器

RA0=0;

RA1=0;

RA2=0;

RA3=0;

RA4=0;

start=1;

start1=1;

delay(2000);

kkkk=1;

k++;

if(k==4) RA5=0;

}

}

}

void voltage_test()

{

uchar vo_test;

vo_test=adtongdao(6);

if((vo_test<70)||(vo_test>130)) //70对应工作电压为9.1V,130对应工作电压为:16.1V

{

delay(1);

if((vo_test<70)||(vo_test>130))

{

CMCON=0x07; //比较器控制寄存器

PORTA=0; //关闭负离子

}

}

else

{

motor_stop();

mode_select();

}

}

void st1()

{

if(start==1)

{

start=0;

RA2=1;

delay(1);

RA2=0;

RA2=1;

delay(1);

RA2=0;

RA2=1;

delay(2);

RA2=0;

RA2=1;

delay(2);

RA2=0;

RA2=1;

delay(2);

RA2=0;

RA2=1;

delay(2);

RA2=0;

RA2=1;

delay(3);

RA2=0;

RA2=1;

delay(4);

RA2=0;

RA1=1;

delay(4);

RA2=0;

RA1=1;

delay(5);

RA2=0;

RA1=1;

delay(6);

RA2=0;

delay(4);

RA2=1;

delay(7);

RA2=0;

delay(5);

RA2=1;

delay(8);

RA2=0;

delay(6);

RA2=1;

delay(9);

RA2=0;

delay(7);

RA2=1;

delay(10);

RA2=0;

delay(8);

RA2=1;

delay(11);

RA2=0;

delay(9);

RA2=1;

delay(11);

RA2=0;

delay(10);

RA2=1;

delay(12);

RA2=0;

delay(11);

RA2=1;

delay(13);

RA2=0;

delay(12);

RA2=1;

delay(14);

RA2=0;

delay(13);

RA2=1;

delay(15);

RA2=0;

delay(14);

RA2=1;

delay(17);

RA2=0;

delay(16);

RA2=1;

delay(18);

RA2=0;

delay(17);

RA2=1;

delay(19);

RA2=0;

delay(20);

RA2=1;

delay(20);

RA2=0;

delay(25);

RA2=1;

delay(22);

RA2=0;

delay(30);

RA2=1;

delay(24);

RA2=0;

delay(35);

RA2=1;

delay(25);

RA2=0;

delay(40);

RA2=1;

delay(28);

RA2=0;

delay(43);

RA2=1;

delay(29);

RA2=0;

delay(45);

RA2=1;

delay(30);

RA2=0;

delay(50);

RA2=1;

delay(35);

RA2=0;

delay(55);

RA2=1;

delay(40);

RA2=0;

delay(60);

RA2=1;

delay(45);

RA2=0;

delay(65);

RA2=1;

delay(50);

}

}

文档

pic16f676

#include//包含单片机内部资源预定义#defineuintunsignedint#defineucharunsignedchar#defineN9__CONFIG(0X31E4);//定义芯片工作时的配置位uchark,ads;//off堵转后马上回到关闭档马上转动ucharstart,start1,start2,kkkk;//start为启动一次标志位start1为堵转保护启动标志位ucharmo_stop;ucharssss,num;////////////////////////
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top