PIC16F1938单片机编程样例Word格式文档下载.docx
《PIC16F1938单片机编程样例Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《PIC16F1938单片机编程样例Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
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)
EEDATL=ee_data;
EEPGD=
0;
CFGS=0
J
//
禁止所有中断
WREN=1
;
//
运行执行编程/擦除操作
EECON2:
=0x55;
必须按这样的时序
=0xAA;
WR=1;
while(WR==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<
AD_NUM;
i++){
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:
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)
//重新赋值
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|=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)
//接收在中断里面调用uart_handler()函数
#define_SUB_NUM_50
UINT