你好!欢迎来到 !
语言
当前位置: 首页>> 技术中心>> 单片机入门>> PIC单片机之PIC16F884

PIC单片机之PIC16F884

关键字: PIC16F884 PIC单片机 作者:admin 来源:不详 发布时间:2018-05-18 浏览:0

buck电路

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<5:4>/4(PR2+1)PULSE WIDTH

//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=temp%100/10;

a3=temp%100%10;

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的调节还没完善 不过这也不是很大难度了

编辑:admin 最后修改时间:2019-10-12

联系方式

0755-82591179

传真:0755-82591176

邮箱:vicky@yingtexin.net

地址:深圳市龙华区民治街道民治大道973万众润丰创业园A栋2楼A08

Copyright ? 2014-2023 All Rights Reserved.粤ICP备14043402号-4

Baidu
map