收藏 分享(赏)

PIC16F1938单片机编程样例.doc

上传人:精品资料 文档编号:10822564 上传时间:2020-01-12 格式:DOC 页数:9 大小:60.67KB
下载 相关 举报
PIC16F1938单片机编程样例.doc_第1页
第1页 / 共9页
PIC16F1938单片机编程样例.doc_第2页
第2页 / 共9页
PIC16F1938单片机编程样例.doc_第3页
第3页 / 共9页
PIC16F1938单片机编程样例.doc_第4页
第4页 / 共9页
PIC16F1938单片机编程样例.doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、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;typede

2、f 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

3、= 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;E

4、EPGD = 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, V

5、DD 作为参考电压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; i AD_result ? AD_max : AD_result;AD_min = AD_min = 10 )timecount = 0; time10msflg = 1;time1msflg = 1;/根据实际情况添加自己的代码5、 IO 初始化/

6、* 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 引脚都

7、要设置为 1,禁止 CCP1 引脚输出驱动器6、 PWM 模块/* PWM 模块的初始化 */static VOID PWMCCP_init(VOID)CCP1CON = 0b00001100; /单输出,PWM 模式CCPTMRS0 /CCP1 选择 Timer2 作为定时器PR2 = 249; /PWM 周期计算:(PR2 + 1)*0.0625*4(16Mhz 晶振四分频,即指令周期)* 预分频值,当 PR2 为 249 时,PWM 频率为 16KT2CON = 0x00; /预分频为 1:1;TMR2ON = 1; /使能定时器 Timer2TRISC2 = 0; /打开 CCP1 引

8、脚输出驱动器CCPR1L = 0x00; /PWM 占空比为 0CCP1CON /*功 能: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 仿真, 1

9、00 时至少比 1000 大于 4 才可以达到完全的 100PWM_width += 4;/* 高八位赋值 */CCPR1L = PWM_width 2 ;/* 低两位赋值 */tmp = PWM_width tmp = tmp 4;CCP1CON 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.B

10、RG16=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_

11、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 中如何仿真串口通讯,网上很多资料,找一份参考一下。8、初始化模块VOID init(VOID)INTCON = 0x00; /禁止所有中断IO_init();uart_init();Timer0_init();PWMCCP_init();ADC_init();WDT_Init();GIE = 1; /开全局中断delay();ADCON0 |= 0x02; /AD 转换开始

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报