PIC单片机应用开发典型模块第四章程序.docx
- 文档编号:12624246
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:20
- 大小:22.27KB
PIC单片机应用开发典型模块第四章程序.docx
《PIC单片机应用开发典型模块第四章程序.docx》由会员分享,可在线阅读,更多相关《PIC单片机应用开发典型模块第四章程序.docx(20页珍藏版)》请在冰豆网上搜索。
PIC单片机应用开发典型模块第四章程序
(1)多功能波形信号发生模块
程序应用
#INCLUDE
RTCCEQU01H
PCEQU02H
PCLATHEQU0AH
TEMP0TIMEEQU20H;方波次数
TEMP0CONSTEQU21H;方波常数
TEMO0DOTEQU22H;方波点数
TEMP0OUTEQU23H;方波输出值
TEMP1TIMEEQU30H;锯齿波次数
TEMP1CONSTEQU31H;锯齿波常数
TEMP1DOTEQU32H;锯齿波点数
TEMP1OUTEQU33H;锯齿波输出值
TEMP2TIMEEQU40H;三角波次数
TEMP2CONSTEQU41H;三角波常数
TEMP2DOTEQU42H;三角波点数
TEMP2OUTEQU43H;三角波输出值
OPTION_REQU81H
WBUEQU2FH;W暂存
SBUEQU2EH;STATUS暂存
RCCEQU0FAH;最大频率常数
;------------------------------------------------------------------------------------------------------
ORG0
SYS_RESET
GOTOSTART
;------------------------------------------------------------------------------------------------------
ORG4;中断程序
MOVWFWBU
SWAPFWB0,0
SWAPFSTATUS,0
MOVWFSBU
CALLSERV_INT
SWAPFSBU,0
MOVWFSTATUS
SWAPFWBU,0
RETFIE
;------------------------------------------------------------------------------------------------------
ORG40H
NOP
START
CALLINT
CALLINTPORT
CALLINTTMO
LOOP;延时
NOP
NOP
GOTOLOOP
;------------------------------------------------------------------------------------------------------
INT
CLRFTEMP0DOT
CLRFTEMP1DOT
CLRFTEMP2DOT
CLRFTEMP0OUT
CLRFTEMP1OUT
CLRFTEMP2OUT
MOVLW03H
MOVWFTEMP0TIME
MOVWFTEMP0CONST
MOVWFTEMP2TIME
MOVWFTEMP2CONST
MOVLW06H
MOVWFTEMP1TIME
MOVWFTEMP1CONST
RETURN
;------------------------------------------------------------------------------------------------------
INTPORT;端口初始化
BCFSTATUS,0
BCFSTATUS,1
BCFSTATUS,5
CLRFPORTC
CLRFPORTD
BSFPORTE,1
BSFSTATUS,5
MOVLW00H
MOVWFTRISD
MOVLWOF4H
MOVWFTRISC
;定义RE1为输出,其他为输入
MOVWFTRISE
BCFSTATUS,5
RETURN
;------------------------------------------------------------------------------------------------------
INTTM0;定时器初始化
BSFSTATUS,5
MOVLW80H
MOVWFOPTION_R
BCFSTATUS,5
MOVLW0A0H
;开放定时器中断
MOVLWRCC;RCC=最大频率延时常数
MOVWFRTCC
RETURN;
;------------------------------------------------------------------------------------------------------
SERY_INT;中断服务程序
BTFSCINTCON,2
GOTOSERVRTCC
CLRFINTCON
BSFINTCON,5
RETURN
SERVRTCC
MOVLWRCC
MOVWFRTCC
BCFINTCON,2
CALLOUTPUT
RETFIE
;------------------------------------------------------------------------------------------------------
OUTPUT;输出波形
BCFSTATUS,5
FBODECFSZTEMP0TIME,1;方波
GOTOJBO
CALLFANGBO
JBODECFSZTEMP1TIME,1;锯齿波
GOTOSJBO
CALLJUCBO
SJBODECFSZTEMP2TIME,1;三角波
RETURN
CALLSJIAOBO
RETURN
;------------------------------------------------------------------------------------------------------
FANGBO
BCFPORTS,1;
为低
BCFPORTC,0
BCFPORTC,1;选择输出通道,0通道为方波
INCFTEMP0DOT,1
MOVFTEMP0CONST,0
MOVWFTEMP0TIME
BTFSCTEMP0DOT,7
GOTOGAO
GOTODI
GAOMOVLWOFFH
MOVWFPORTD
BSFPORTE,1
RETURN
DIM0VLW00H
MOVWFPORTD
BSFPORTE,1
RETURN
;------------------------------------------------------------------------------------------------------
JUCBO
BCFPORTE,1
BCFPORTC,0;选择输出通道,1通道为锯齿波
MOVFTEMP1CONST,0
MOVWFTEMP1TIME
INCFSZTEMP1DOT,1
GOTOJUBO1
MOVFTEMP1OUT,0
MOVWFPORTD
INCFTEMP1OUT,1
RETURN
JUBO1MOVLW00H
MOVWFTEMPlOUT
RETURN
;------------------------------------------------------------------------------------------------------
SJIAOBO
BCFPORTE,1
BCFPORTC,1;选择输出通道,2通道为三角波
MOVFTEMP2CONST,0
MOVWFTEMP2TIME
INCFSZTEMP2DOT,1
GOTOSJBO2
CALLSJBO0
SJB02MOVFTEMP2OUT,0
MOVWFPORTD
BSFPORTE,1
MOVLW02H
BTFSSTEMP2DOT,7
GOTOSJBO1
ADDWFTEMP2OUT,1
RETURN
SJBO1
SUBWFTEMP2OUT,1
RETURN
SJBO0CLRFTEMP2OUT
RETURN
END
(2)PWM信号发生模块
程序应用
#include
/*CCP1模块的PWM工作方式初始化子程序*/
voidINIT_CCP1()
{
PR2=0XFF;/*设置PWM周期*/
CCPR1L=0X7F;/*设置工作循环的高8bit为01111111*/
CCP1CON=0X3C;/*设置CCP1为PWM工作方式,且工作循环的低bit2为11*/
INTCON=0X00;/*禁止总中断和外围中断*/
TRISC=0XFB;/*设置RC2/CCP1为输出*/
}
/*主程序*/
main()
{
INIT_CCP1();/*CCP1模块的PWM工作方式初始化*/
T2CON=0X03;/*前分频比为16,打开TMR2,同时输出PWM信号*/
}
(3)正弦信号发生模块
程序应用
#include
//本程序将通过PIC16F877的I2C方式驱动D/A转换器MAX518,使其D/A0通道输出
//一个连续的正弦波形
constchartable[]={0X80,0X86,0X8D,0X93,0X99,0X9F,0XA5,0XAB,
0XB1,0XB7,0XBC,0XC2,0XC7,0XCC,0XD1,0XD6,0XDA,0XDF,0XE3,0XE7,0XEA,0XEE,0XF1,0XF4,0XF6,0XF8,0XFA,0XFC,0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFD,0XFB,0XF9,0XF7,0XF5,0XF2,0XEF,0XEC,0XE9,0XE5,0XE1,0XDD,0XD8,0XD4,0XCF,0XCA,0XC5,0XBF,0XBA,0XB4,0XAE,0XA8,0XA2,0X9C,0X96,0X90,0X89,0X83,0X80,0X79,0X72,0X6C,0X66,0X60,0X5A,0X55,0X4E,0X48,0X43,0X3D,0X38,0X33,0X2E,0X29,0X25,0X20,0X1C,0X18,0X15,0X11,0X0E,0X0B,0X09,0X07,0X05,0X03,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X02,0X04,0X06,0X08,0X0A,0X0D,0X10,0X13,0X16,0X1A,0X1E,0X22,0X27,0X2B,0X30,0X35,0X3A,0X40,0X45,0X4C,0X51,0X57,0X5D,0X63,0X69,0X6F,0X76,0X7C};
//以上的数组用于存放正弦表,在定义数组时,前面应该加上const,
//使数组存放于ROM中,而不至于占用太多的RAM
unsignedchari;
unsignedcharj;
unsignedcharn;
//I2C初始化子程序
voidi2cint()
{
SSPCON=0X08;//初始化SSPCON寄存器
TRISC3=1;//设置SCL为输入口
TRISC4=1;//设置SDA为输入口
TRISA4=0;
SSPSTAT=0X80;//初始化SSPSTAT寄存器
SSPADD=0X02;//设定I2C时钟频率
SSPCON2=0X00;//初始化SSPCON2寄存器
di();//关闭总中断
SSPIF=0;//清SSP中断标志
RA4=0;//关掉74HC165的移位时钟使能,以免74HC165
//移位数据输出与I2C总线的数据线发生冲突
SSPEN=1;//SSP模块使能
}
//I2C总线输出数据子程序
voidi2cout()
{
SEN=1;//产生I2C启动信号
for(n=0x02;--n;)
continue;//给予一定的延时,保证启动
do
{
RSEN=1;//产生I2C启动信号
}while(SSPIF==0);//如果没能启动,则反复启动,直到启动为止
SSPIF=0;//SSPIF标志清0
SSPBUF=0X58;//I2C总线发送地址字节
do{
;
}while(SSPIF==0);//等待地址发送完毕
SSPIF=0;//SSPIF标志清0
SSPBUF=0X01;//I2C总线发送命令字节
do{
;
}while(SSPIF==0);//等待命令发送完毕
SSPIF=0;//SSPIF标志清0
SSPBUF=j;//I2C总线发送数据字节
do{
;
}while(SSPIF==0);//等待数据发送完毕
SSPIF=0;//SSPIF标志清0
PEN=1;//产生停止条件
do{
;
}while(SSPIF==0);//等待停止条件产生
SSPIF=0;//SSPIF标志清0
}
//主程序
main()
{
i2cint();//I2C初始化
while
(1){
for(i=0x00;i<=127;++i)
{
j=table[i];//从数组中得到需要传输的数据量
i2cout();//利用I2C总线方式送出数据
}
}
(4)简易频率计模块程序
#include
#include
#include
bank3intcp1z[11];//定义一个数组,用于存放各次的捕捉值
unioncp1
{
inty1;
unsignedcharcp1e[2];
}cp1u;//定义一个共用体
unsignedcharCOUNTW,COUNT;//测量脉冲个数寄存器
unsignedcharCOUNTER,data,k;
unsignedchars1[4];//定义4个显示缓冲数组
unsignedchars2[4];
unsignedchars3[4];
unsignedchars4[4];
intT5,uo;
doubleRE5;
doublepuad5;
//CCP模块工作于捕捉方式初始化子程序
voidccpint()
{
CCP1CON=0X05;//首先设置CCP1捕捉每个脉冲的上升沿
T1CON=0X00;//关闭TMR1震荡器
PEIE=1;//外围中断允许(此时总中断关闭)
CCP1IE=1;//允许CCP1中断
TRISC2=1;//设置RC2为输入
}
//系统其它部分初始化子程序
voidinitial()
{
COUNT=0X0B;//为保证测试精度,测试5个脉冲的参数后
//求平均值,每个脉冲都要捕捉其上升、下降沿,故需要有11次中断
}
//中断服务程序
voidinterruptcp1int(void)
{
CCP1IF=0;//清除中断标志
cp1u.cp1e[0]=CCPR1L;
cp1u.cp1e[1]=CCPR1H;
cp1z[data]=cp1u.y1;//存储1次捕捉值
CCP1CON=CCP1CON^0X01;//把CCP1模块改变成捕捉相反的脉冲沿
data++;
COUNT--;
}
//周期处理子程序
voidPERIOD()
{
T5=cp1z[10]-cp1z[0];//求得5个周期的值
RE5=(double)T5;//强制转换成双精度数
RE5=RE5/5;//求得平均周期,单位为μs
}
//频率处理子程序
voidFREQUENCY()
{
PERIOD();//先求周期
RE5=1000000/RE5;//周期值求倒数,再乘以1000000,得频率,单位为Hz
}
//脉宽处理子程序
voidPULSE()
{
intpu;
for(data=0,puad5=0;data<=9;data++)
{
pu=cp1z[data+1]-cp1z[data];
puad5=(double)pu+puad5;
data=data+2;
}//求得5个脉宽的和值
RE5=puad5/5;//求得平均脉宽
}
//占空比处理子程序
voidOCCUPATIONAL()
{
PULSE();//先求脉宽
puad5=RE5;//暂存脉宽值
PERIOD();//再求周期
RE5=puad5/RE5;//求得占空比
}
precision(RE5)//为了保证小数点的精度,对RE5进行处理
{
k=5;
if(RE5<1)
{
RE5=RE5*1000;//若RE5<1,则乘以1000,保证小数点的精度
k=0x00;
}
elseif(RE5<10)
{
RE5=RE5*1000;//若RE5<10,则乘以1000,保证小数点的精度
k=0x00;
}
elseif(RE5<100)
{
RE5=RE5*100;//若RE5<100,则乘以100,保证小数点的精度
k=0x01;
}
elseif(RE5<1000)
{
RE5=RE5*10;//若RE5<1000,则乘以10,保证小数点的精度
k=0x02;
}
elseRE5=RE5;
}
//主程序
main()
{
ccpint();//CCP模块工作于捕捉方式初始化
initial();//系统其它部分初始化
data=0x00;//存储数组指针赋初值
TMR1H=0;
TMR1L=0;//定时器1清0
CCP1IF=0;//清除CCP1的中断标志,以免中断一打开就进入
//中断
ei();//中断允许
TMR1ON=1;//定时器1开
while
(1)
{
if(COUNT==0)break;
}//等待中断次数结束
di();//禁止中断
TMR1ON=0;//关闭定时器
//进行下面的数值转换和显示工作
PERIOD();//进行周期处理
precision(RE5);
uo=(int)RE5;
sprintf(s1,"%4d",uo);//把周期数据转换成4位ASII码,且放入数组S1中
FREQUENCY();//进行频率处理
precision(RE5);
uo=(int)RE5;
sprintf(s2,"%4d",uo);//把频率数据转换成4位ASII码,且放入数组S2中
OCCUPATIONAL();//进行占空比处理
precision(RE5);
uo=(int)RE5;
sprintf(s2,"%4d",uo);//把占空比数据转换成4位ASII码,且放入数组S3中
PULSE();//进行脉宽处理
precision(RE5);
uo=(int)RE5;
sprintf(s2,"%4d",uo);//把脉宽数据转换成4位ASII码,且放入数组S4中
}
(5)交流电压测量模块程序
#include
#include
#include
unionadres
{
inty1;
unsignedcharadre[2];
}adresult;//定义一个共用体
bank3intre[40];//定义存放A/D转换结果的数组,在bank3中
unsignedchark,data;//定义几个通用寄存器
doublesqu,squad;//平方寄存器和平方和寄存器,squ又通用为存储其它数值
intuo;
bank1unsignedchars[4];//此数组用于存储需要显示的字符的ASII码
//A/D转换初始化子程序
voidadinitial()
{
ADCON0=0x41;//选择A/D通道为RA0,且打开A/D转换器
//在工作状态,使A/D转换时钟为8Tosc
ADCON1=0X8E;//转换结果右移,及ADRESH寄存器的高6位为"0"
//把RA0口设置为模拟量输入方式
ADIE=1;//A/D转换中断允许
PEIE=1;//外围中断允许
TRISA0=1;//设置RA0为输入方式
}
//系统其它初始化子程序
voidinitial()
{
CCP2IE=0;//禁止CCP中断
SSPIE=0;//禁止SSP中断
CCP2CON=0X0B;//初始化CCP2CON,CCP2为特别事件触发方式
CCPR2H=0X01;
CCPR2L=0XF4;//初始化CCPR2寄存器,设置采样间隔500μs,
//一个周期内电压采40个点
}
//中断服务程序
void interruptadint(void)
{
CCP2IF=0;
ADIF=0;//清除中断标志
adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH;//读取并存储A/D转换结果,A/D转换的结果
//通过共用体的形式放入了变量y1中
re[k]=adresult.y1;//1次A/D转换的结果存入数组
k++;//数组访问指针加1
}
//主程序
main()
{
adinitial();//A
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC 单片机 应用 开发 典型 模块 第四 章程