PIC16F1938单片机编程样例.docx
- 文档编号:2225207
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:10
- 大小:436.96KB
PIC16F1938单片机编程样例.docx
《PIC16F1938单片机编程样例.docx》由会员分享,可在线阅读,更多相关《PIC16F1938单片机编程样例.docx(10页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC16F1938 单片机 编程