PIC16F1938单片机编程样例.docx_第1页
PIC16F1938单片机编程样例.docx_第2页
PIC16F1938单片机编程样例.docx_第3页
PIC16F1938单片机编程样例.docx_第4页
PIC16F1938单片机编程样例.docx_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PIC单片机编程样例MCU:PIC16F1938;开发语言:C语言开发工具:编译环境:MPLAB IED;C 编译器:HI-TECH PICC C compiler编辑软件:source insight烧录工具:MPLAB ICD2仿真软件:Protues说明:程序已经通过编译并在仿真软件和硬件平台上成功跑起来;目的:对用到PIC16F系列单片机开发软件的群众提供样例支持,希望有帮助。Protues仿真图:1、一些定义typedef void VOID;typedef bit BIT;typedef unsigned char UINT8;typedef int INT16;typedef unsigned int UINT16;typedef long INT32;typedef unsigned long UINT32;VOID delay( VOID )int i = 100;while( i- );2、EEPROM读写/*功 能:从EEPROM中读取一个字节的数据原 型:UINT8 EEPROM_read( UINT8 addr )参数说明:输入参数:addr 输入地址 输出参数:无返 回:读取的字节注 意: */UINT8 EEPROM_read( UINT8 addr )UINT8 EE_data;EEADRL = addr;EEPGD = 0;CFGS = 0;GIE = 0; /禁止所有中断RD = 1;asm(nop);EE_data = EEDATL;RD = 0;GIE = 1; /恢复所有中断return EE_data;/*功 能:向EEPROM中写入一个字节的数据原 型:VOID EEPROM_write( UINT8 addr, UINT8 ee_data )参数说明:输入参数:addr 输入地址,ee_data 需要写入的数据输出参数:无返 回:无注 意: */VOID EEPROM_write( UINT8 addr, UINT8 ee_data )EEADRL = addr;EEDATL = ee_data;EEPGD = 0; CFGS = 0; GIE = 0; /禁止所有中断WREN = 1; /运行执行编程/擦除操作EECON2 = 0x55; /必须按这样的时序EECON2 = 0xAA;WR = 1; while( WR=1 ); /等待写操作完成 GIE = 1;WREN = 0; /禁止执行编程/擦除操作3、ADC模块/* ADC模块的初始化 */static VOID ADC_init( VOID )ADCON0 = 0b00110001; /选择AN12通道、ADC使能位ADCON1 = 0b11100000; /AD转换结果右对齐,64分频作为转换时钟,选择VSS,VDD作为参考电压ADIF = 0; /清楚AD转换标志static UINT16 throttle = 0;static VOID AD_Function( VOID )UINT8 i;UINT16 AD_result;UINT16 AD_max = 0;UINT16 AD_min = 2000;throttle = 0;for( i=0; iAD_NUM; i+ )ADIF = 0;ADRESH = 0;ADRESL = 0;delay();ADCON0 |= 0x02;while( 0 = ADIF ); /等待转换完成ADIF = 0;AD_result = ADRESH;AD_result = AD_result AD_result ? AD_max : AD_result;AD_min = AD_min = 10 )timecount = 0; time10msflg = 1;time1msflg = 1;/根据实际情况添加自己的代码5、IO初始化/* IO 初始化 */static VOID IO_init(VOID)/* PORT A */ANSELA = 0x00; /所有IO为数字IOTRISA = 0x00; /所有IO为outputPORTA = 0x00; /初始化所有IO输出电平为低电平/* PORT B */ANSELB = 0x03; /RB0和RB1都绑定为同一模拟AD输入TRISB = 0X03; /RB0和RB1为输入,其他端口为输出PORTB = 0x00;/* POTR C */PORTC =0xff; LATC = 0xff;TRISC =0xC4; /TX和RX引脚都要设置为1,禁止CCP1引脚输出驱动器6、PWM模块/* PWM模块的初始化 */static VOID PWMCCP_init(VOID)CCP1CON = 0b00001100; /单输出,PWM模式CCPTMRS0 &= 0b11111100; /CCP1选择Timer2作为定时器PR2 = 249; /PWM周期计算:(PR2 + 1)*0.0625*4(16Mhz晶振四分频,即指令周期)*预分频值,当PR2为249时,PWM频率为16KT2CON = 0x00; /预分频为1:1;TMR2ON = 1; /使能定时器Timer2TRISC2 = 0; /打开CCP1引脚输出驱动器CCPR1L = 0x00; /PWM占空比为0CCP1CON &= 0b11001111;/*功 能:PWM占空比设置原 型:VOID PWM_WidthSet( UINT8 width )参数说明:输入参数:width 占空比的百分比分子,设置值从0至100,例如width = 50时,设置的占空比为50% 输出参数:无返 回:无注 意: */static VOID PWM_WidthSet( UINT8 width )UINT16 PWM_width;UINT16 tmp;PWM_width = width * 10;if( 100 = width )/经过Protues仿真,100时至少比1000大于4才可以达到完全的100PWM_width += 4;/* 高八位赋值 */CCPR1L = PWM_width 2 ;/* 低两位赋值 */tmp = PWM_width & 0x0003;tmp = tmp 4;CCP1CON &= 0b11001111;CCP1CON |= tmp;7、串口通讯模块void uart_init(void) UINT8 ii;for(ii=0;ii_SUB_NUM_;ii+)get_uart_subii=0xff; RCSTA = 0xb0; TXSTA = 0x20; /add by lihf for test/TXSTA = 0x20; BAUDCONbits.BRG16=0; SPBRGH = 0; /8 位定时器 Baud Rate GeneratorSPBRG = _FOSC_/64/_BAUD_-1; /23;TXIE = 0; /发送不需要中断处理RCIE = 1;PEIE = 1; /没有开全局中断 /发送数据static VOID UART_sent( UINT8 byte )/while( 0 = TXIF )/continue;TXREG = byte;while( 0 = TRMT )asm(nop);/接收在中断里面调用uart_handler()函数#define _SUB_NUM_ 50UINT8 get_uart_sub_SUB_NUM_;void uart_handler(void) UINT8 i;if( 1 = RCIF )RCIF = 0;for(i=0;i_SUB_NUM_-1;i+) get_uart_subi=get_uart_subi+1;get_uart_sub_SUB_NUM_-1 = RCREG;Protues中如何仿真串口通讯,网上很多资

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论