《PIC 单片机》 课程设计
学生姓名: 邱荣华 学 号: 011100225 专业班级: 电气工程与自动化2011级2班 指导教师: 江和
2014年6月13日
1. 课程设计题目和要求
课程设计的性质和目的
《PIC 单片机课程设计》是电气工程及其自动化专业及相近专业的一门重要的专业实践课,本课程在《PIC 单片机》课程的基础上,通过硬件设计与软件编程与调试的实践,进一步掌握PIC 单片机的应用方法,熟练PIC 单片机的C 程序的编写与调试,是毕业设计前的一次重要的实践,为今后走上工作岗位打下坚实的单片机应用基础。
要达到的目标:
1. 熟悉MPLAB IDE和PROTUES 的使用。
2. 熟练掌握PIC16F887单片机的编程技巧,加深对理论教学内容的理解与掌握。 3. 通过自主选题、编程、调试到完成任务,从而提高分析和解决问题的能力,培养自主创新能力。 1.2课程设计内容和要求
设计一个具有完整功能、有一定工作量与一定难度的单片机应用线路,并绘制能用于仿真的proteus 线路图,编制相应的单片机c 语言,分别在proteus 仿真界面和实物板上调试运行正确。最后用实物进行运行演示,并写出符合规范的课程设计报告。
2. 设计方案
2.1利用PIC16F887单片机设计一个万年历,通过IIC 通信将DS1307时钟芯片中的时间用LCD 液晶屏显示。同时,该设计还兼具温度显示功能,可以通过键盘设置当前时间、日期。 2.2 硬件框图:
根据所要实现的预期功能,硬件必须要有最小系统模块、LCD 显示模块、时钟模块、温度模块、按键模块等
2.3 protues仿真图的绘制:
初步了解此次课程设计所用的开发板,并根据所选课题,进一步了解该课题
用到的相应模块。在protues
中找到相信模块中的元件,绘制好仿真图。
2.4最小系统
最小系统包括16F887单片机、复位模块、4M 外部晶振、排针等部件组成如下最基本电路,其中芯片供电的引脚略去。本课设板所用的单片机为PIC16F887,是877A 的升级,其主要参数与887A 类似。
2.5 LCD显示模块
如图所示,为了节省I/O口,采用4位接线法,RD 口的低四位和LCD 的高4
位连接,RD7用于背光显示(RD7=1),RD4、RD5、RD6用于读写和使能控制. 上电
后要延时15ms 后,才能进行初始。
编写LCD 初始化程序、写4位数据/命令子程序、写8位数据/命令子程序、显示整行子程序、读LCD 子程序、忙时检测子程序。
定义常数字符数组,在开机后显示”qiuronghua 011100225” 等字样
2.6 时钟和温度模块
选用始终芯片DS1307、温度芯片TC74,皆通过IIC 和单片机通信,时钟芯片带备用3V 电池,电阻RA4和RA5设置为数字电阻。DS1307 是实时时钟芯片,它提供秒、分、时、日、月、、年和星期等数据,并能自动计算闰年至2100年。通常时钟芯片是要接备用电池,当主电源掉电时,备用电源为DS1307 提供维持电源,此电源只供DS1307 使用,此时时钟仍正常运行,时钟晶振是典型的32.768kHz 。
始终和温度模块的实现首先要进行正确的IIC 初始化: void IIC_CSH()
时钟程序要通过编写和调用始终读写子程序实现:
void write_DS1307(char addr,char data) void READ_DS1307(char addr,char n)
从时钟芯片读出的是BCD 码,需要进行转换才可以送入LCD 显示。
至于温度模块是比较简单的,设置好好就只需要定时从里面读数显示即可。显示温度需要注意当其值为负数时候需要进行取补码再显示,同时显示负号。
2.7按键模块
采用普通按键实现时间的修改、设定,mod 键进入时间设置,time_set实现位置(秒、分、时,日,月,年)的选择,其他两个按键是加减功能。
部分检测消抖程序:
if(mod==0) {
delaynms(30);//消抖 if(mod==0) {
while(!mod);//等待按键释放 M++; if(M==3)
{ M=0;flag=0;f=0;
}
} }
由于星期几和日期有对应关系,所以只需要调整日期,就可改变星期几。 相关程序:
void GregorianDay(void) {
int leapsToDate; int day1;
int MonthOffset[]= { 0,31,59,90,120,151,181,212,243,273,304,334 }; if(year==0) {if(month
day1 = MonthOffset[month - 1] + day; else
day1= MonthOffset[month - 1] + day+1; } else
{leapsToDate = year / 4 ; if((year % 4 == 0) && (month > 2)) day1=1; else day1=0;
day1 += year*365 + leapsToDate+1+ MonthOffset[month - 1] + day; }
片
}
week = (day1+5) % 7;
write_DS1307(3, dec_bcd(week)); //转换为BCD 码后,将秒写入芯
2.8程序流程图
3调试
程序编译成功后,选择调试工具为protues 仿真,观察仿真结果并根据仿真中出现的问题对程序进行进一步的修改。 调试成功后出现的效果:
3.1仿真调试出现的问题
1、程序出现类似 ";" expected、no identifier in declaration等错误。
处理:此类错误一般是由于大括号、封号漏写或者多写,也可能是在中文环境下的符号。仔细检查出错程序位置附近,检查封号、大括号的数量和格式。 2、出现function declared implicit int、undefined identifier "N"等错误。
处理:函数未声明、变量为定义所引起的错误,在相应的地方添加函数声明,变量定义。
3.2烧写程序及硬件调试
将程序烧写至picket3烧写器中,进行硬件调试。
出现的问题:
1. 无法显示时间和温度,IIC 通信停止。
解决办法:TC74仿真和实物的地址不一样,只需把地址1001101改为1001000 2. 按键调整时光标没有和仿真一样闪动
解决办法:由于程序刷新太快,人眼无法分辨,所以只需在按键后面加50ms 的延时即可。
3. 不能掉电保护,每次脱机或者复位都会进行时钟初始化
解决办法:DS1307初始化前先进行判断秒的最高位是否为1,为1则进行初始化
4心得体会
通过本次的课程设计任务,我掌握学会了MPLAB IDE,PROTUES仿真软件的使用基础。单片机是现在科技研究的潮流,各种电子产品都可以见到单片机的身影。而本课设正是帮助我把课堂上所学习到的理论,运用到了实际中,是我受益匪浅。 在此次课程设计初期,本来想拷贝一份程序过来进行修改,经过一些挣扎后,最后还是决定通过自己编写。对于一个单片机初学者,对于课堂所学的知识还只有个模糊的认识,再加之课程设计在课程结束一段时间才进行选题,一些编程知识有些淡忘,所以只好重新复习了课本。在编写过程中遇到了不少问题,就之前提到的配置位问题,由于疏漏,配置位设置错误,导致做了6个小时的无用功在查程序。或者是因为大大小小的失误,都耗费了很多的时间。这也让我明白了,作为一个工科学生,做事要严谨认真,虽然都是小问题,但恰恰是细节的问题决定一件事情的最终走向。随着编程的继续,我的查错能力也慢慢有了提升。
总之,本次课程设计让我受益匪浅,让我战胜自己的惰性,提高了分析解决问题的能力,也提高了自己的逻辑能力,当然,更关键的是让我明白,不注意细节性问题会付出很大的代价。
《PIC 单片机》 课程设计
学生姓名: 邱荣华 学 号: 011100225 专业班级: 电气工程与自动化2011级2班 指导教师: 江和
2014年6月13日
1. 课程设计题目和要求
课程设计的性质和目的
《PIC 单片机课程设计》是电气工程及其自动化专业及相近专业的一门重要的专业实践课,本课程在《PIC 单片机》课程的基础上,通过硬件设计与软件编程与调试的实践,进一步掌握PIC 单片机的应用方法,熟练PIC 单片机的C 程序的编写与调试,是毕业设计前的一次重要的实践,为今后走上工作岗位打下坚实的单片机应用基础。
要达到的目标:
1. 熟悉MPLAB IDE和PROTUES 的使用。
2. 熟练掌握PIC16F887单片机的编程技巧,加深对理论教学内容的理解与掌握。 3. 通过自主选题、编程、调试到完成任务,从而提高分析和解决问题的能力,培养自主创新能力。 1.2课程设计内容和要求
设计一个具有完整功能、有一定工作量与一定难度的单片机应用线路,并绘制能用于仿真的proteus 线路图,编制相应的单片机c 语言,分别在proteus 仿真界面和实物板上调试运行正确。最后用实物进行运行演示,并写出符合规范的课程设计报告。
2. 设计方案
2.1利用PIC16F887单片机设计一个万年历,通过IIC 通信将DS1307时钟芯片中的时间用LCD 液晶屏显示。同时,该设计还兼具温度显示功能,可以通过键盘设置当前时间、日期。 2.2 硬件框图:
根据所要实现的预期功能,硬件必须要有最小系统模块、LCD 显示模块、时钟模块、温度模块、按键模块等
2.3 protues仿真图的绘制:
初步了解此次课程设计所用的开发板,并根据所选课题,进一步了解该课题
用到的相应模块。在protues
中找到相信模块中的元件,绘制好仿真图。
2.4最小系统
最小系统包括16F887单片机、复位模块、4M 外部晶振、排针等部件组成如下最基本电路,其中芯片供电的引脚略去。本课设板所用的单片机为PIC16F887,是877A 的升级,其主要参数与887A 类似。
2.5 LCD显示模块
如图所示,为了节省I/O口,采用4位接线法,RD 口的低四位和LCD 的高4
位连接,RD7用于背光显示(RD7=1),RD4、RD5、RD6用于读写和使能控制. 上电
后要延时15ms 后,才能进行初始。
编写LCD 初始化程序、写4位数据/命令子程序、写8位数据/命令子程序、显示整行子程序、读LCD 子程序、忙时检测子程序。
定义常数字符数组,在开机后显示”qiuronghua 011100225” 等字样
2.6 时钟和温度模块
选用始终芯片DS1307、温度芯片TC74,皆通过IIC 和单片机通信,时钟芯片带备用3V 电池,电阻RA4和RA5设置为数字电阻。DS1307 是实时时钟芯片,它提供秒、分、时、日、月、、年和星期等数据,并能自动计算闰年至2100年。通常时钟芯片是要接备用电池,当主电源掉电时,备用电源为DS1307 提供维持电源,此电源只供DS1307 使用,此时时钟仍正常运行,时钟晶振是典型的32.768kHz 。
始终和温度模块的实现首先要进行正确的IIC 初始化: void IIC_CSH()
时钟程序要通过编写和调用始终读写子程序实现:
void write_DS1307(char addr,char data) void READ_DS1307(char addr,char n)
从时钟芯片读出的是BCD 码,需要进行转换才可以送入LCD 显示。
至于温度模块是比较简单的,设置好好就只需要定时从里面读数显示即可。显示温度需要注意当其值为负数时候需要进行取补码再显示,同时显示负号。
2.7按键模块
采用普通按键实现时间的修改、设定,mod 键进入时间设置,time_set实现位置(秒、分、时,日,月,年)的选择,其他两个按键是加减功能。
部分检测消抖程序:
if(mod==0) {
delaynms(30);//消抖 if(mod==0) {
while(!mod);//等待按键释放 M++; if(M==3)
{ M=0;flag=0;f=0;
}
} }
由于星期几和日期有对应关系,所以只需要调整日期,就可改变星期几。 相关程序:
void GregorianDay(void) {
int leapsToDate; int day1;
int MonthOffset[]= { 0,31,59,90,120,151,181,212,243,273,304,334 }; if(year==0) {if(month
day1 = MonthOffset[month - 1] + day; else
day1= MonthOffset[month - 1] + day+1; } else
{leapsToDate = year / 4 ; if((year % 4 == 0) && (month > 2)) day1=1; else day1=0;
day1 += year*365 + leapsToDate+1+ MonthOffset[month - 1] + day; }
片
}
week = (day1+5) % 7;
write_DS1307(3, dec_bcd(week)); //转换为BCD 码后,将秒写入芯
2.8程序流程图
3调试
程序编译成功后,选择调试工具为protues 仿真,观察仿真结果并根据仿真中出现的问题对程序进行进一步的修改。 调试成功后出现的效果:
3.1仿真调试出现的问题
1、程序出现类似 ";" expected、no identifier in declaration等错误。
处理:此类错误一般是由于大括号、封号漏写或者多写,也可能是在中文环境下的符号。仔细检查出错程序位置附近,检查封号、大括号的数量和格式。 2、出现function declared implicit int、undefined identifier "N"等错误。
处理:函数未声明、变量为定义所引起的错误,在相应的地方添加函数声明,变量定义。
3.2烧写程序及硬件调试
将程序烧写至picket3烧写器中,进行硬件调试。
出现的问题:
1. 无法显示时间和温度,IIC 通信停止。
解决办法:TC74仿真和实物的地址不一样,只需把地址1001101改为1001000 2. 按键调整时光标没有和仿真一样闪动
解决办法:由于程序刷新太快,人眼无法分辨,所以只需在按键后面加50ms 的延时即可。
3. 不能掉电保护,每次脱机或者复位都会进行时钟初始化
解决办法:DS1307初始化前先进行判断秒的最高位是否为1,为1则进行初始化
4心得体会
通过本次的课程设计任务,我掌握学会了MPLAB IDE,PROTUES仿真软件的使用基础。单片机是现在科技研究的潮流,各种电子产品都可以见到单片机的身影。而本课设正是帮助我把课堂上所学习到的理论,运用到了实际中,是我受益匪浅。 在此次课程设计初期,本来想拷贝一份程序过来进行修改,经过一些挣扎后,最后还是决定通过自己编写。对于一个单片机初学者,对于课堂所学的知识还只有个模糊的认识,再加之课程设计在课程结束一段时间才进行选题,一些编程知识有些淡忘,所以只好重新复习了课本。在编写过程中遇到了不少问题,就之前提到的配置位问题,由于疏漏,配置位设置错误,导致做了6个小时的无用功在查程序。或者是因为大大小小的失误,都耗费了很多的时间。这也让我明白了,作为一个工科学生,做事要严谨认真,虽然都是小问题,但恰恰是细节的问题决定一件事情的最终走向。随着编程的继续,我的查错能力也慢慢有了提升。
总之,本次课程设计让我受益匪浅,让我战胜自己的惰性,提高了分析解决问题的能力,也提高了自己的逻辑能力,当然,更关键的是让我明白,不注意细节性问题会付出很大的代价。