×
单片机 > 单片机程序设计 > 详情

PIC单片机之PIC16F884

发布时间:2020-06-09 发布时间:
|

buck电路


 


这是一个降压电路,SW 在此处通入PWM ,进行降压的主要工作,Vout分压后,最高不超过芯片工作电压 (5V 也行 )输入到PIC AN1口,进行AD转换,


将转换的结果在1602上显示出来。如果电压不是想要的电压 程序便改变PWM的占空比,以达到需要的值。


主要环节在1602 的初始化 写数据 和写指令 以及 PIC的AD启动工作模块,程序如下


#include


__CONFIG(0x201A);


#define uint unsigned int


#define uchar unsigned char


#define rs RC4 //数据命令


#define en RC5 // 使能端


#define DATA PORTD //数据口


//RC1 作为PWM输出口


const uchar dis1[]="The voltage is:"; //asm("nop");


const uchar dis2[]=" . V";


void delay(uchar time) //1ms


{


uint j;


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


for(j=160;j>0;j--);


}


void lcd_wcmd(uchar cmd)


{


rs = 0;


en = 0;


DATA = cmd;//将8位数据通过P0口传给1602


delay(2);


en = 1;


delay(2);


en = 0;


}


void lcd_wdat(uchar dat)


{


rs = 1;


en = 0;


DATA= dat;//将8位数据通过P0口传给1602


delay(2);


en = 1;


delay(2);


en = 0;


}


void lcd_init()


{


TRISC=0Xcf; //1100 1111


TRISD=0X00;


lcd_wcmd(0x38); ////16*2显示,5*7点阵,8位数据


lcd_wcmd(0x0c); //显示开,关光标


lcd_wcmd(0x06); //移动光标


lcd_wcmd(0x01); //清除LCD的显示内容


}


void pwm_init()


{


TRISC1=1; //CCP2 OUTPUT DISABLE


PR2=0XFF;


CCP2CON=0X3C; //0011(CCPR1L后两位))1100 11XX PWM MODE


CCPR2L=0X3F; //CCPR2L:CCP2CON


//0X3F 25%


TMR2IF=0;


T2CON=0X05; //启动定时器2 预分频比是1:4


while(TMR2IF)


{


TMR2IF=0;


TRISC1=0;


}


}


void adc_init()


{


ADCON0=0X45;// f/2的频率 AN1通道 AD转换完成 禁止ADC


ADCON1=0X80; //右对齐 参考电压 VSS VDD


TRISA=0X01; //输入


delay(5);


}


void deal_ad()


{


uint temp;


uint ad_sample;


uint result;


uchar a1,a2,a3;


GO_DONE=1;


while(GO_DONE);


ad_sample=ADRESL (ADRESH<<8);


result=(ad_sample*500)>>10; //参考电压5V 扩大了100倍


temp=result;


a1=temp/100;


a2=temp0/10;


a3=temp0;


if(a1!=0)


{


lcd_wcmd(0x80 0x44);



lcd_wdat(a1 0x30);


}


lcd_wcmd(0x80 0x45);


lcd_wdat(a2 0x30);


lcd_wcmd(0x80 0x47);


lcd_wdat(a3 0x30);


}


void lcd_dis()


{


uchar i;


lcd_wcmd(0x80);


i=0; //设置显示位置为第一行的第5个字符


while(dis1[i]!='\0')


{ //显示字符"welcome!"


lcd_wdat(dis1[i]);


i ;


}


lcd_wcmd(0x80 0X40);


i=0; //设置显示位置为第一行的第5个字符


while(dis2[i]!='\0')


{ //显示字符"welcome!"


lcd_wdat(dis2[i]);


i ;


}


}


void main()


{



delay(10);


lcd_init(); //初始化LCD 只要写起始地址就 就行了啊


adc_init();


while(1)


{


lcd_dis();


deal_ad();


}


// pwm_init();


while(1);


}


不是很完美,仅供参考。PWM的调节还没完善 不过这也不是很大难度了


关键字:PIC单片机  PIC16F884 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向