PIC16F1938单片机编程样例.docx

上传人:b****3 文档编号:2225207 上传时间:2022-10-28 格式:DOCX 页数:10 大小:436.96KB
下载 相关 举报
PIC16F1938单片机编程样例.docx_第1页
第1页 / 共10页
PIC16F1938单片机编程样例.docx_第2页
第2页 / 共10页
PIC16F1938单片机编程样例.docx_第3页
第3页 / 共10页
PIC16F1938单片机编程样例.docx_第4页
第4页 / 共10页
PIC16F1938单片机编程样例.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

PIC16F1938单片机编程样例.docx

《PIC16F1938单片机编程样例.docx》由会员分享,可在线阅读,更多相关《PIC16F1938单片机编程样例.docx(10页珍藏版)》请在冰豆网上搜索。

PIC16F1938单片机编程样例.docx

PIC16F1938单片机编程样例

PIC单片机编程样例

MCU:

PIC16F1938;

开发语言:

C语言

开发工具:

编译环境:

MPLABIED

C编译器:

HI-TECHPICCCcompiler编辑软件:

sourceinsight烧录工具:

MPLABICD2仿真软件:

Protues

说明:

程序已经通过编译并在仿真软件和硬件平台上成功跑起来;

目的:

对用到PIC16F系列单片机开发软件的群众提供样例支持,希望有帮助。

Protues仿真图:

片H4I--C2iUF:

-."IOsOiTICKI2临

丽r^rrckiNiadz占芒湖FC:

£|]兀讯口EFUMOTTO®铐3由厲气I||啊21bF讥BA启凶«耳匚IOUL'CPa&nU匸-TLG耳111匚匚肥戈EMve甸+•殳uur/vi1.4*-hi.iH仝心^lj!

i=wn3sari:

lkoltivuf0;ii

YUIT町T£rCF丈「LDlKbi4IT4ri*%JKIFJBI^I皿口1陆1庐StRI

PSiJPliiULLW

RB?

rfWT[lilN2XFiKLPaTO^UCCB

=:

B+l/UFMi'F1DJCXC

N脅阳iltfli'FSIGXO.I

■^asic^CLtncrcij-jGa-4|RIT<1CIFDHiNEIDfllKH^I

f■rnwSUM匸Viiinc

1、一些定义

 

typedefvoidtypedefbit

VOID;

BIT;

 

typedefunsignedcharUINT8;typedefintINT16;

typedefunsignedintUINT16;typedeflongINT32;

typedefunsignedlongUINT32;

VOIDdelay(VOID)

{

inti=100;

while(i--);

}

2、EEPRO读写

/******************************************************************************

功能:

从EEPRO中读取一个字节的数据

原型:

UINT8EEPROM_read(UINT8addr)

参数说明:

输入参数:

addr输入地址

输出参数:

返回:

读取的字节

注意:

******************************************************************************/

UINT8EEPROM_read(UINT8addr)

{

UINT8EE_data;

EEADRL=addr;

EEPGD=0;

CFGS=0;

GIE=0;//禁止所有中断

RD=1;

asm("nop");

EE_data=EEDATL;

RD=0;

GIE=1;//恢复所有中断

returnEE_data;

}

****************************************************************************功能:

向EEPRO中写入一个字节的数据

原型:

VOIDEEPROM_write(UINT8addr,UINT8ee_data)参数说明:

输入参数:

addr输入地址,ee_data需要写入的数据输出参数:

返回:

注意:

****************************************************************************

VOIDEEPROM_write(UINT8addr,UINT8ee_data)

{

EEADRL=addr;

EEDATL=ee_data;

EEPGD=

0;

CFGS=0

J

GIE=0;

//

禁止所有中断

WREN=1

;//

运行执行编程/擦除操作

EECON2:

=0x55;//

必须按这样的时序

EECON2:

=0xAA;

WR=1;

while(WR==1);//

等待写操作完成

GIE=1;

WREN=C

);//

禁止执行编程/擦除操作

3、ADC模块

/**ADC模块的初始化*/

staticVOIDADC_init(VOID)

{

ADCON0=0b00110001;//选择AN12通道、ADC使能位

ADCON1=0b11100000;//AD转换结果右对齐,64分频作为转换时钟,选择VSS

VDD乍为参考电压

ADIF=0;//清楚AD转换标志

}

staticUINT16throttle=0;

staticVOIDAD_Function(VOID)

{

UINT8i;

UINT16AD_result;

UINT16AD_max=0;

UINT16AD_min=2000;

throttle=0;

for(i=0;i

ADIF=0;

ADRESH=0;

ADRESL=0;

delay();

ADCON0|=0x02;

while(0==ADIF);//ADIF=0;

等待转换完成

AD_result=ADRESH;

AD_result=AD_result<<8;

AD_result=AD_result|ADRESL;

throttle+=AD_result;

AD_max=AD_max>AD_result?

AD_max:

AD_result;

AD_min=AD_min

AD_min:

AD_result;

throttle=(throttle-AD_max-AD_min)/(AD_NUM-2);//

值,均值滤波

}

去掉最大值和最小

4、定时器0

/**定时器0初始化*/

staticVOIDTimer0_init(VOID)

{

OPTION_REG=0b10000100;//禁止所有弱上拉、部指令周期时钟

TMR0=TIMER0_1MS;//定时器0的中断间隔为1ms

TMR0IE=1;//定时器0开中断

32分频

 

//总的中断开关记得在所有模块初始化完成后打开staticUINT8timecount=0;

staticBITtimelOmsflg;

staticBITtimelmsflg;

VOIDinterruptISR(VOID)

串口通讯接收

{

uart_handler();//

/**定时器0的处理*/

if(1==TMR0IF)

TMR0=TIMER0_1MS;//重新赋值

timecount++;

if(timecount>=10)

{

timecount=0;time10msflg=1;

}timelmsflg=1;

//根据实际情况添加自己的代码

}

5、IO初始化

/**io初始化*/

staticVOIDIO_init(VOID){

所有IO为数字IO

所有IO为output

初始化所有IO输出电平为低电平

/**PORTA*/

ANSELA=0x00;//

TRISA=0x00;//

PORTA=0x00;//

/**PORTB*/

ANSELB=0x03;〃RB0和RB1都绑定为同一模拟AD输入

6、PWM模块

/**PWM模块的初始化*/

staticVOIDPWMCCP」nit(VOID)

{

CCP1CON=0b00001100;//单输出,PWM模式

CCPTMRS0&=0b11111100;//CCP1选择Timer2作为定时器

PR2=249;

//PWM

周期计算:

(PR2+1)*0.0625*4(16Mhz晶振四分频,

即指令周期广预分频值,

当PR2为249时,PWM频率为16K

T2CON=0x00;

//

预分频为1:

1;

TMR2ON=1;

//

使能定时器Timer2

TRISC2=0;

//

打开CCP1引脚输出驱动器

CCP1CON&=0b11001111;

}/******************************************************************************

功能:

PWM占空比设置

原型:

VOIDPWM_WidthSet(UINT8width)

参数说明:

输入参数:

width占空比的百分比分子,设置值从0至100,例如width=50时,设

置的占空比为50%

输出参数:

返回:

注意:

******************************************************************************/

staticVOIDPWM_WidthSet(UINT8width)

{

UINT16PWM_width;

UINT16tmp;

PWM_width=width*10;

if(100==width)

{

//经过Protues仿真,100时至少比1000大于4才可以达到完全的

PWM_width+=4;

}

/**高八位赋值*/

CCPR1L=PWM_width>>2;

/**低两位赋值*/

tmp=PWM_width&0x0003;

tmp=tmp<<4;

CCP1CON&=0b11001111;

CCP1CON|=tmp;

}

7、串口通讯模块

voiduart_init(void)

{

UINT8ii;

for(ii=0;ii<_SUB_NUM_;ii++)

get_uart_sub[ii]=0xff;

RCSTA=0xb0;

//addbylihffortest

TXSTA=0x20;

//TXSTA=0x20;

BAUDCONbits.BRG16=0;

 

SPBRGH=0;//8

位定时器BaudRateGenerator

SPBRG=_FOSC_/64/_BAUD_-1;//23;

TXIE=0;//发送不需要中断处理

RCIE=1;

PEIE=1;

//没有开全局中断

//发送数据

staticVOIDUART_sent(UINT8byte)

{

〃while(0==TXIF)

//continue;

TXREG=byte;

while(0==TRMT)

{

asm("nop");

}

}

//接收在中断里面调用uart_handler()函数

#define_SUB_NUM_50

UINT

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1