PIC单片机课程设计Word文档下载推荐.docx
- 文档编号:22184175
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:28
- 大小:512.71KB
PIC单片机课程设计Word文档下载推荐.docx
《PIC单片机课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《PIC单片机课程设计Word文档下载推荐.docx(28页珍藏版)》请在冰豆网上搜索。
《PIC单片机课程设计》是电气工程与自动化专业及相近专业的一门重要的专业实践课,本课程在《PIC单片机》课程的基础上,通过硬件设计与软件编程与实际实验板调试的实践,进一步掌握PIC单片机的C程序语言的编写与调试,是毕业设计前的一次重要的实践,为今后走上工作岗位打下坚实的单片机应用基础。
具体来说,这次课程设计能让我扩展、加深对PIC单片机应用的了解,包括中断、定时器、PWM、显示等功能模块的应用;
接触项目中C语言编程的逻辑,如何一步一步实现所想要的功能;
通过分析选择元件,学着查找相关元件资料;
在后期,优化程序,使之能满足实际运行要求;
最终完成该课程设计。
二.课程设计任务和要求:
我的课程设计题目是《温度监测与控制》,要求当温度T超过电机启动设定值(START_T)时,为了防止在临界温度值时的风扇频繁启/停,控制风扇的启/停要有一定的回差值(DELTA_T),即当T>
=START_T时启动风扇,当T<
(START_T-DELTA_T)时关闭风扇,并要求START_T和DELTA_T能由用户设定。
具体来说:
1)利用LCD,显示实时温度,电机启动温度值及温度控制回差值;
2)能够通过按键的设置增大或减小转启动温度及回差温度;
3)通过LED亮灭实现预警;
4)通过风扇(直流电机)实现散热。
三.课程设计具体步骤:
3.1总体方案设计说明
本课程设计利用TC74温度传感器采用温度数据,通过PIC16F877芯片IIC通信模块传送温度数据,经BCD转换,在LCD上显示出来。
并且该温度值将与电机启动设定值对比,与电机启动设定值和回差值的差进行对比,调控风扇的转停,LED的闪灭。
为了防止电机旋转转速过高,根据脉宽调制原理编写相应程序,利用单片机调整输出PWM的高电平时间控制直流电机的转速。
3.2 硬件设计说明
整个系统硬件电路包括四个主要模块:
LCD显示模块、按键输入模块、微型直流电机PWM控制模块。
3.2.1 LCD显示模块
课设板所用的LCD型号为YB1602A,接线如图3.2.1所示。
图中采用4位数据线接线方式,是为了节省单片机的IO口。
从图中可以知道,要使用该LCD时,短路插P38、P22的短路插(除RD7外)均要插上。
如要使用背光控制,可将P22的短路插8插短接,如不用背光,该短路插不接。
表1为LCDYB1602A的引脚功能说明。
引脚名
功能
RS
命令/数据选择:
1:
数据,0:
命令
R/W
读/写选择:
读,0:
写
E
数据使能:
下降沿送入有效
DB7~DB0
数据线,如用4位数据,使用高4位
表1LCDYB1602A引脚功能表
上电后要延时15ms后,才能进行初始化,LCD初始化过程详见附录。
3.2.2 按键输入模块
采用课设板上4×
4按键中的三个普通按键S1、S5、S9即可,三个按键对应的功能见表2,接线如图3.2.2所示,其中P45须短接到地,P20的1~3短路插短接,用到RB0~RB2共3个引脚,编程时利用RB0/INT中断与RB电平变化中断进行按键处理。
按键
S1(SET)
进入调整模式,或者退出调整模式
S5(INC)
每按一次,则数值增1
S6(DEC)
每按一次,则数值减1
表2按键功能表
3.2.3 微型直流电机PWM控制模块
本模块的接线图如图3.3.3所示,利用单片机输出的PWM波形控制T3的通断,对VCC电压进行斩波,通过改变PWM占空比从而改变直流电机的电枢电压,从而改变电机转速。
为了防止T3断开时电机产生的过电流使板上器件烧毁,在电机两端反并联了二极管D4。
本设计采用CCP1模块即通过RC2输出1kHz的PWM波控制电机转速,P26需将2用短路插短接。
3.2.4TC74温度传感器模块
温度传感器TC74是Microchip公司的一款IIC接口的数字式温度传感器。
其测温范围为-40~125℃,在25~85℃之间的误差为-2~+2℃,在0~125℃之间的误差为-3~+3℃。
它有两种分装,如下图:
硬件框图:
3.3软件设计说明
3.3.1主程序框图:
y
n
y
ny
n
是
3.3.2各部分功能实现
3.3.2.1按键功能程序流程图
本设计用了3个按键,一个是接于RB0/INT的按键,它利用INT中断功能,为功能设置键;
另两个是接与RB1、RB2的按键,它们利用RB电平变化中断,为+1和-1键。
因此程序要用到INT中断与RB电平变化中断。
为了方便编程,定义了结构体类型STRU变量KEY:
●KEY的成员SET为3位,保存按键SET的次数,次数只能在0~2间循环,但结构体预留了3位,最大可至7,便于程序功能扩展;
●成员INC=1表明有INC按键按下,但未处理,处理后令其等于0,就不会重复处理了;
●成员DEC=1表明有DEC按键按下,其他操作与成员INC相同;
●成员FLAG=1表明有按键需要处理,成员CHANGE=1表明显示需要刷新。
在按键的处理中,中断程序中只是设置了标志位,处理按键均在主程序中进行,一旦有有效按键按下(先按SET后按INC或DEC),启动TMR1进行延时计时时,超过5秒内无按键,程序自动退出按键状态,因此每次有效按键时,TMR1的中断次数计数值T1N均清零。
3.3.2.2 PWM输出程序设计
本设计采用CCP1模块从RC2引脚输出1kHz(即周期为1000
)的PWM波,预分频比用1:
16,晶振为8MHz,则1000=(PR2+1)×
4×
0.125×
16PR2=124
假设高电平时间为
则由CCPR1L及CCP1CON的5、4两×
位共10位的X值为
,时间单位为
。
而占空比
改变PWM的高电平时间,只需对CCPR1L和CCP1CON的5、4两位重新赋值即可。
3.3.2.3温度采样显示程序设计
LCD液晶显示及IIC初始化,单片机通过IIC通信向TC74发送地址,地址在字节的高7位,最低位为0表示为写,接着单片机向TC74发送第二个数据,即读温度命令字RTR(0b00000000);
然后再重新开始,单片机再向TC74发送地址,但此时最低位为1,表示接下来要读TC74的温度值。
最后单片机接受TC74发出的温度值。
经过BCD转码后,将该温度值显示在LCD液晶屏上。
4、结论
4.1设计结果
本次课程设计能够满足题目要求,实现温度监测与控制,能够根据用户设置的设定值启动风扇降温,并通过灯光信号变化预警。
4.2问题及解决方法
1)第一个碰到的问题编译是有不少错误,只能一个一个解决,不仅需要看书,还需要和同学多交流,比如,书上IIC_SEND程序中STAT_RW在MPLAB里一直报错,后来改成RW就可以了;
2)是LCD液晶屏无法显示数据。
有PROTEUS上接线的错误,线脚直接接在LCD的针脚上,程序中初始化定义出错,未能理解LCD_WRITE及LCD_WRITE_4的不同,后来通过在项目中设置LED检测,从主程序开头逐句排查,了解程序运行卡在哪里,逐一解决,实现正常显示;
3)温度显示T=000,先排除显示模块出现问题的可能,屏蔽按键中断功能,反复检查IIC初始化,及IIC主动接收、主动发送程序,发现在IIC端口加IIC调试器观察IIC通信是否正常工作;
4)按键失灵,按键没有反应,解决办法是检查相关程序,着重检查端口设置;
5)刚开始对电机何时运行,LED的闪灭情况有些混乱,解决办法是,把功能设定用文字写下来,再根据文字编写程序;
6)实际烧写发现LCD显示异常,按键没有反应,又重新梳理程序,更改了按键程序逻辑;
7)实际电机运转时,电机转速忽大忽小,无法稳定。
这种情况可能是由于程序里对PWM的高电平时间调整得过于频繁,或者是由于调整的幅度过大,可在相应程序段插入一段延时,或者将PWM高电平时间调整的幅度减小。
4.3感想及体会
1)确定课题后,就确定了要用到哪些元件、芯片及PIC16F887的哪几个功能模块,所以,必须对这些有个比较深的了解和认识,这样在编写程序时能减少错误,构思出程序流程图,再根据流程图写确定主函数框架,确定子程序,这样程序编写起来才不会乱,也有助于检查时迅速找到相应的程序段;
2)观察实验板实际电路,根据实验板确定使用哪些端口,之后再进行相应程序编写;
3)程序的编写,需分模块写,子程序化设计做到细致认真,特别是端口地址设置,编译出现错误耐心解决,在编译成功后,而仿真运行发生故障时,一个一个检查相应模块程序运行是否正常,并且对硬件设计也要多加留心,有时是硬件接线的问题;
4)实时保存,留有备份,以防万一,对出现问题的程序段可反复推敲;
5)程序基本构架完毕和调试成功后,对程序可进行必要的删减和优化,使其更加简练。
还可以添加一些附加功能,使系统设计更完善和人性化。
通过这次课程设计使我对PIC单片机有了更深的了解,积累了一些设计经验,懂得了理论与实际相结合是很重要的,严谨和细心才能把程序做好做漂亮。
不同的课题使我在做课设的过程中更加独立,掌握到更多知识。
虽然只是一个小小的题目,但是却有很丰富的内容,比如还可以加入电机测试模块,对电机进行调速,这都是我接下来要实现的目标。
参考书目:
[1]《PIC16系列单片机C程序设计与PROTEUS仿真》江和,北京航空航天大学出版社,2010
[2]《福州大学PIC单片机课程设计指导书》江和,鲍光海,2012年3月
附录
#include<
pic.h>
__CONFIG(0x3771);
//引脚定义
#defineLCD_RSRD4//LCD寄存器选择数据H/指令L
#defineLCD_RWRD5//LCD读H/L写控制线
#defineLCD_ERD6//LCDE时钟
#defineLEDRA5//LED
#defineFSRC2//电机
#defineKEY_DECRB2
#defineKEY_INCRB1
//常数定义
#defineTC74_ADD0b1001101
#defineCOM0
#defineDAT1
#defineLINE10b10000000
#defineLINE20b11000000
#defineRTR0b00000000
#defineST_POSITIONLINE2+5
#defineDT_POSITIONLINE2+13
//函数声明
voidCSH();
voidLCD_CSH(void);
voidLCD_WRITE(char,char);
voidLCD_WRITE_4(char,char);
voidDISP_MENU(void);
voidDISP_T(signedchar);
voidDISP_ST_DT(void);
voidBCD(unsignedint);
voidDELAY_I(unsignedint);
voidDELAY_US(char);
voidDELAY(unsignedint);
voidIIC_SEND(char);
voidIIC_CSH(void);
signedcharREAD_T(void);
voidinterruptISR(void);
charAA[17]="
WKDJ011000643"
;
__EEPROM_DATA(50,3,255,255,255,255,255,255);
charBW,SW,GW;
charT1N,START_T,DELTA_T;
//定义结构体类型STRU的变量KEY
structSTRU
{unsignedSET:
3;
unsignedINC:
1;
unsignedDEC:
unsignedFLAG:
unsignedCHANGE:
}KEY;
voidmain(void)
{charST_OLD,DT_OLD;
signedcharR5;
unsignedinti;
CSH();
LCD_WRITE(0b00000001,COM);
DELAY
(2);
DISP_MENU();
DELAY(50);
DISP_T(R5);
DISP_ST_DT();
while
(1)
{R5=READ_T();
//读温度传感器的温度值
DISP_T(R5);
//显示温度值
LED=1;
if(R5>
=(START_T-DELTA_T))
LED=0;
if(R5<
=(START_T))
CCP1CON=0b00000000;
=START_T)
{TRISC2=0;
PR2=124;
CCPR1L=0x32;
CCP1CON=0b00001100;
T2CON=0b00000110;
LED=1;
i=0;
while(KEY.FLAG==0)
{DELAY
(1);
i++;
if(i>
100)LED=0;
200)break;
}
}
ST_OLD=START_T;
DT_OLD=DELTA_T;
while(KEY.FLAG==1)
{LED=0;
NOP();
FS=0;
if(KEY.SET==1)//进入修改
LCD_WRITE(ST_POSITION,COM);
elseif(KEY.SET==2)
LCD_WRITE(DT_POSITION,COM);
LCD_WRITE(0b00001111,COM);
//字符闪
if(KEY.SET==1)
{if(KEY.INC==1)
{
KEY.INC=0;
DELAY(3);
START_T++;
if(START_T>
=100)START_T=100;
}
elseif(KEY.DEC==1)
KEY.DEC=0;
START_T--;
if(START_T<
=25)START_T=25;
KEY.CHANGE=1;
if(KEY.SET==2)
DELTA_T++;
if(DELTA_T>
=20)DELTA_T=20;
elseif(KEY.DEC==1)
DELTA_T--;
if(DELTA_T<
=1)DELTA_T=1;
if(KEY.CHANGE==1)//如有修改,刷新显示
{DISP_ST_DT();
KEY.CHANGE=0;
if(KEY.SET==1)
LCD_WRITE(ST_POSITION,COM);
elseif(KEY.SET==2)
LCD_WRITE(DT_POSITION,COM);
LCD_WRITE(0b00001101,COM);
if(ST_OLD!
=START_T)//只有值被修改才写入EEPROM
EEPROM_WRITE(0,START_T);
//写入启动风扇值,在EEPROM的地址0
if(DT_OLD!
=DELTA_T)
EEPROM_WRITE(1,DELTA_T);
//写入温度控制的回差值,在EEPROM的地址1
}
}
//字符型LCD模块初始化
voidLCD_CSH(void)
{DELAY(20);
LCD_WRITE_4(0b0011,COM);
DELAY
(1);
DELAY_US(10);
LCD_WRITE_4(0b0010,COM);
LCD_WRITE(0b00101000,COM);
LCD_WRITE(0b00001100,COM);
LCD_WRITE(0b00000110,COM);
//写R1的低四位,FLAG为寄存器选择
voidLCD_WRITE_4(charR1,charFLAG)
{LCD_RW=0;
LCD_RS=FLAG;
PORTD&
=0xF0;
LCD_E=1;
R1=R1&
0X0F;
PORTD|=R1;
LCD_E=0;
LCD_RS=0;
=0b11110000;
//
voidLCD_WRITE(charR1,charFLAG)
{charR2;
R2=R1&
0xF0;
R2=R2>
>
4;
LCD_WRITE_4(R2,FLAG);
0x0F;
//IIC发送数R并等待发送完成,收到从机的应答信号
voidIIC_SEND(charR)
{
SSPBUF=R;
//发送
while(RW==1);
//在主控模式下判断发送是否完成
while(SSPIF==0);
//等待发送完成
while(ACKSTAT==1);
//等待从机发送信号应答
//IIC初始化
voidIIC_CSH(void)
TRISC&
=0b00011100;
SSPCON=0b00101000;
//同步串口使能,主控方式
SMP=0;
//使能告诉模式(400kHz)的压摆率控制
SSPADD=4;
//主控模式为波特率值,每位时间T=(SSPADD+1)/Tcy=5uS
//读TC74的温度值
signedcharREAD_T(void)
signedcharR1;
//INTCON=0b00000000;
//关闭GIE、PEIE中断
SEN=1;
//开始条件
while(SEN==1);
//检测开始条件是否完成
IIC_SEND(TC74_ADD<
<
1);
//送地址(写)
IIC_SEND(RTR);
//写RTR指令(写)
RSEN=1;
//重新开始条件
while(RSEN==1);
//等待
IIC_SEND((TC74_ADD<
1)+1);
//发送TC74地址(读)
RCEN=1;
//接收使能
while(RCEN==1);
R1=SSPBUF;
//接收数据
PEN=1;
//停止位
while(PEN==1);
return(R1);
voidDISP_MENU(void)
{chari;
LCD_WRITE(LINE1,COM);
//回到行首
for(i=0;
i<
16;
i++)
LCD_WRITE(AA[i],DAT);
voidDISP_ST_DT(void)
{LCD_WRITE(0b00001100,COM);
//不闪
NOP();
LCD_WRITE(LINE2,COM);
//第二行第0个字符
BCD(START_T);
//将要显示的启动风扇温度值作BCD转换
LCD_WRITE('
S'
DAT);
//在当前位置显示字符‘S’
t'
//在当前位置显示字符‘t’
='
//在当前位置显示字符‘=’
LCD_WRITE(BW+0x30,DAT);
//显示百位
LCD_WRITE(SW+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC 单片机 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)