PIC16F1938单片机编程样例.docx
《PIC16F1938单片机编程样例.docx》由会员分享,可在线阅读,更多相关《PIC16F1938单片机编程样例.docx(10页珍藏版)》请在冰豆网上搜索。
![PIC16F1938单片机编程样例.docx](https://file1.bdocx.com/fileroot1/2022-10/28/f63cf4b2-1bbb-4297-bd24-a85961d45bd1/f63cf4b2-1bbb-4297-bd24-a85961d45bd11.gif)
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;iADIF=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_minAD_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