资源描述
PIC 单片机编程样例MCU:PIC16F1938;开发语言:C语言 开发工具:编译环境:MPLAB IED;C 编译器:HI-TECH PICC C compiler编辑软件:source insight烧录工具:MPLAB ICD2仿真软件:Protues说明:程序已经通过编译并在仿真软件和硬件平台上成功跑起来;目的:对用到PIC16F系列单片机开发软件的群众提供样例支持,希望有帮助。Protues仿真图:7THDRTSU1-LL11R1HEllMCLRlW1-CJ- 4FuF iT&T- HOdHH e Rco/riosamcKiRCI/TI0:=reCPZf2A. RQfCCPlJPlMBB RCCLCLES RC&DirSDVTIGiEBBll FiMiTDMEGU RCfllTOUKTC L PhPJBSEDQ HCTffiWDT/PSBfSBraXiCRYSTA TFZSD2DIODE ST-PICIOF1S3S WD*匸 flE=DHD2Dh:GNDCNDrLTUUlznD?JED-RHGND1、一些定义typedef void typedef bitVOID;BIT;typedef unsigned char UINT8;typedef intINT16;typedef unsigned intUINT16;typedef longINT32;typedef unsigned longUINT32;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; 所有 10 为数字 10 TRISA = 0x00; /所有 IO 为 outputPORTA = 0x00;初始化所有10输出电平为低电平/* P0RT B */ANSELB = 0x03;/RB0和RB1都绑定为同一模拟AD输入/* POTR C */ PORTC =0xff;LATC = 0xff; TRISC =0xC4;TRISB = 0X03; /RB0 和 RB1 为输入,其他端口为输出 PORTB = 0x00;/TX 和 RX 引脚都要设置为1,禁止 CCP1 引脚输出驱动器6、PWM 模块/* PWM 模块的初始化 */static VOID PWMCCP_init(VOID)CCP1C0N = ObOOOOIlOO;单输出,PWM 模式CCPTMRS0 &= 0b11111100; /CCP1 选择 Timer2 作为定时器PR2 = 249;/PWM 周期计算:(PR2 + 1)*O.O625*4(16Mhz 晶振四分频,即指令周期)*预分频值,当PR2为249时,PWM频率为16KT2CON = OxOO;/预分频为 1:1;TMR2ON = 1;使能定时器 Timer2TRISC2 = O;/打开 CCP1 引脚输出驱动器CCPR1L = OxOO;/PWM 占空比为 OCCP1CON &= Ob11OO1111;功 能:PWM占空比设置原 型: VOID PWM_WidthSet( UINT8 width ) 参数说明:输入参数:width占空比的百分比分子,设置值从0至100,例如width = 50时,设置 的占空比为 5O%输出参数:无返 回:无注意: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中如何仿真串口通讯,网上很多资料,找一份参考一下。8、初始化模块VOID init(VOID)INTCON = 0x00;/禁止所有中断IO_init();uart_init();Timer0_init();PWMCCP_init();ADC_init();WDT_Init();GIE = 1;/开全局中断delay();ADCONO | = 0x02;AD 转换开始
展开阅读全文