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

下载本文档

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

文档简介

.7/7PIC单片机编程样例MCU:PIC16F1938;开发语言:C语言 开发工具: 编译环境:MPLABIED; C编译器:HI-TECHPICCCcompiler 编辑软件:sourceinsight 烧录工具:MPLABICD2 仿真软件:Protues 说明:程序已经通过编译并在仿真软件和硬件平台上成功跑起来; 目的:对用到PIC16F系列单片机开发软件的群众提供样例支持,希望有帮助。Protues仿真图:1、一些定义typedefvoidVOID;typedefbitBIT;typedefunsignedcharUINT8;typedefintINT16;typedefunsignedintUINT16;typedeflongINT32;typedefunsignedlongUINT32;VOIDdelay<VOID>{ inti=100; while<i-->;}2、EEPROM读写/******************************************************************************功 能:从EEPROM中读取一个字节的数据原 型: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;}/******************************************************************************功 能:向EEPROM中写入一个字节的数据原 型:VOIDEEPROM_write<UINT8addr,UINT8ee_data>参数说明: 输入参数:addr输入地址,ee_data需要写入的数据 输出参数:无返 回:无注 意:******************************************************************************/VOIDEEPROM_write<UINT8addr,UINT8ee_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模块的初始化*/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<AD_NUM;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_result?AD_min:AD_result; } throttle=<throttle-AD_max-AD_min>/<AD_NUM-2>;//去掉最大值和最小值,均值滤波}4、定时器0/**定时器0初始化*/staticVOIDTimer0_init<VOID>{ OPTION_REG=0b10000100;//禁止所有弱上拉、内部指令周期时钟32分频 TMR0=TIMER0_1MS;//定时器0的中断间隔为1ms TMR0IE=1;//定时器0开中断//总的中断开关记得在所有模块初始化完成后打开}staticUINT8timecount=0;staticBITtime10msflg;staticBITtime1msflg;VOIDinterruptISR<VOID>{ uart_handler<>;//串口通讯接收 /**定时器0的处理*/ if<1==TMR0IF> { TMR0IF=0;//清零标志位 TMR0=TIMER0_1MS;//重新赋值 timecount++; if<timecount>=10> { timecount=0; time10msflg=1; } time1msflg=1; //根据实际情况添加自己的代码 }}5、IO初始化/**IO初始化*/staticVOIDIO_init<VOID>{ /**PORTA*/ ANSELA=0x00;//所有IO为数字IO TRISA=0x00;//所有IO为output PORTA=0x00;//初始化所有IO输出电平为低电平 /**PORTB*/ ANSELB=0x03;//RB0和RB1都绑定为同一模拟AD输入 TRISB=0X03;//RB0和RB1为输入,其他端口为输出 PORTB=0x00; /**POTRC*/ PORTC=0xff; LATC=0xff; TRISC=0xC4;//TX和RX引脚都要设置为1,禁止CCP1引脚输出驱动器}6、PWM模块/**PWM模块的初始化*/staticVOIDPWMCCP_init<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引脚输出驱动器 CCPR1L=0x00;//PWM占空比为0 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才可以达到完全的100 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; TXSTA=0x20;//addbylihffortest //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_50UINT8get_uart_sub[_SUB_NUM_];voiduart_handler<void>{ UINT8i; if<1==RCIF> { RCIF=0; for<i=0;i<_SUB_NUM_-1;i++> get_uart_sub[i]=get_uart_sub[i+1]; get_ua

温馨提示

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

评论

0/150

提交评论