PIC单片机课程设计报告
PIC课程设计报告

《PIC单片机实训》课程设计(或微型直流电机转速控制或交流电压/频率检测)学生姓名:学号:专业班级:指导教师:二○一一年九月二十三日目录(二号字体)一. 课程设计目的 (3)二. 课程设计题目描述和要求 (3)三. 课程设计报告内容 (4)四.课程设计总结 (14)一.课程设计目的《PIC单片机课程设计》是电气工程及其自动化专业及相近专业的一门重要的专业实践课,本课程在《PIC 单片机》课程的基础上,通过硬件设计与软件编程与调试的实践,进一步掌握PIC 单片机的应用方法,熟练PIC 单片机的C 程序的编写与调试,是毕业设计前的一次重要的实践。
二.课程设计题目描述和要求根据附图1~附图5,设计一个具有完整功能、有一定工作量与一定难度的单片机应用线路,并绘制能用于仿真的Proteus 线路图,编制相应的单片机C 语言,分别在Proteus 仿真界面和实物板上调试运行正确。
最后用实物进行运行演示。
本设计内容分为线路设计、绘制Proteus线路图、编程调试几个部分。
1.线路设计本设计采用短路插和杜邦线连接的方式未用部分短路插应拔起,避免与其他硬件部分冲突并节省电源,并避免与电源相关的芯片发热。
电机速度控制:包括电机电压PWM控制、电机速度检测(使用光电遮断器)、电机转速显示(LCD或数码管)、按键(速度整定等)。
2.Proteus 线路图绘制根据所设计的线路图,绘制与之一致的,能用于仿真的Proteus 线路图。
要求所绘的线路图美观、紧凑,参数要与课设板一致。
3.软件编制与调试根据所设计的线路图编制相应的单片机C 程序,要求所编制的程序符合C 语言格式并加上注解。
每编一段即进行编译,有错及时修改,并先在Proteus上仿真,基本正确后再用ICD2仿真,最后应脱机运行。
三.课程设计报告内容1.设计程序#include <pic.h>__CONFIG (0x20F1); //运行用//引脚定义#define LCD_RS RD4 //LCD 寄存器选择数据H/指令L #define LCD_RW RD5 //LCD 读H/L写控制线#define LCD_E RD6 //LCD E 时钟//常数定义#define DAT 1 //LCD写数据时为1#define COM 0 //LCD写命令时为0#define LINE1 0b10000000 //第一行定义#define LINE2 0b11000000//函数声明void interrupt ISR(void);void CSH(void);void LCD_CSH(void);void LCD_BUSY(void);void LCD_WRITE(char,char);void LCD_WRITE_4(char,char);char LCD_READ(void);void DISP_MENU(const char *);void DISP_ST_DT(char);void DISP_ST_DT1(char);void BCD(unsigned int);void DELAY(unsigned int);void DELAY_I(unsigned int);void DELAY_US(char);void PWM(void);//宏定义,清屏#define CLR_LCD() \LCD_WRITE(0b00000001,COM); \DELAY(2)//变量定义const char AA[17]="LINYANJUN2610800";char QW,BW,SW,GW; //无符号字符0--255int START_T,DELTA_T,RZ,RF; //有符号整形,2个字节long T1N; //有符号长整形,4字节signed char KEY_CHANGE,KEY_SET,KEY_INC,KEY_DEC,KEY_T1N;const int BB[8]={2000,800,255,255,255,255,255,255};//PWM初始化void PWM(void){ TRISC1=0;PR2=255; //晶振4MHZ,频率1KHZ,占空比20% CCPR2L=0x32;CCP2CON=0b00101100; //PWM模式,TMR2是其工作时基T2CON=0b00000101;}//LCD模块初始化void LCD_CSH(void){ DELAY(20); //延时20msLCD_WRITE_4(0b0011,COM); //发送控制序列DELAY(10); //延时10msLCD_WRITE_4(0b0011,COM); //发送控制序列DELAY_US(10); //延时100usLCD_WRITE_4(0b0011,COM); //发送控制序列DELAY_US(10); //延时100usLCD_WRITE_4(0b0010,COM); //4位数据格式LCD_BUSY(); //LCD忙检测LCD_WRITE(0b00101000,COM);LCD_WRITE(0b00001100,COM);CLR_LCD();LCD_WRITE(0b00000110,COM);}void CSH(void){ TRISD=0; //D口全为输出TRISB=0b00000111; //B口低三位为输入TRISC=0b00000100; //C口设置ANSEL=0;ANSELH=0b00000000; //数字口WPUB=0b00000111; //887P224设置B口弱上拉使能IOCB=0b00000111;KEY_SET=0;KEY_INC=0;KEY_DEC=0;LCD_CSH(); //LCD初始化OPTION=0b00111111; //INT下降上升沿中断INTCON=0b11011000; //中断控制寄存器//初始化CCP1CON=0; //CCP模块关闭CCP1IF=0; //中断标志位CCP1CON=0b00000110; //捕捉四个上升沿T1CON=0b00110001;TMR1H=TMR1L=0;CCP1IE=1;START_T=BB[0];}//主程序void main(void){signed char R1;unsigned int i;CSH(); //全部的初始化PWM(); //PWM的初始化DISP_MENU(AA); //显示(AA)中的数DELAY(1000); //延时1s看清上行显示的内容CLR_LCD();DISP_ST_DT(START_T);DISP_ST_DT1(DELTA_T);DELAY(100);while(1){ if (KEY_SET==1) //设置按键按1次{ if(KEY_INC==1) //按下加按键{ START_T+=100;if (START_T>=2500){START_T=2500;}KEY_INC=0; //处理结束清0避免重复处理KEY_CHANGE=1; //已经改变设置标志刷新显示}if(KEY_DEC==1) //按下减按键{ START_T-=100;if (START_T<=500){START_T=500;}KEY_DEC=0;KEY_CHANGE=1;}if(KEY_CHANGE==1) //如果有修改{ DISP_ST_DT(START_T);KEY_CHANGE=0;}}if(START_T>DELTA_T){ CCPR2L+=1;DELAY(500);}if(START_T<DELTA_T){ CCPR2L-=1;DELAY(500);}if(KEY_T1N>=1){ DISP_ST_DT1(DELTA_T);DELAY(80);TMR1H=TMR1L=0;T1CON=0b00110001;CCP1IE=1;CCP1CON=0b00000110;KEY_T1N=0;}}}//LCD上的显示void DISP_ST_DT(char ST){ LCD_WRITE(0b00001100,COM); //不闪LCD_WRITE(LINE1+4,COM); //即第1行的第4个字符BCD(START_T);LCD_WRITE('R',DAT); //在当前位置显示字符'R' LCD_WRITE('1',DAT); //在当前位置显示字符'1' LCD_WRITE('=',DAT);LCD_WRITE(QW+0x30,DAT); //显示千位LCD_WRITE(BW+0x30,DAT); //显示百位LCD_WRITE(SW+0x30,DAT); //显示十位LCD_WRITE(GW+0x30,DAT); //显示个位LCD_WRITE('r',DAT); //在当前位置显示字符'r'LCD_WRITE('/',DAT); //在当前位置显示字符'/' LCD_WRITE('n',DAT); //在当前位置显示字符'n'}void DISP_ST_DT1(char DT){BCD(DELTA_T);LCD_WRITE(LINE2+4,COM); //即第2行的第4个字符LCD_WRITE('R',DAT); //在当前位置显示字符'R' LCD_WRITE('2',DAT); //在当前位置显示字符'2' LCD_WRITE('=',DAT); //在当前位置显示字符'=' LCD_WRITE(QW+0x30,DAT); //显示千位LCD_WRITE(BW+0x30,DAT); //显示百位LCD_WRITE(SW+0x30,DAT); //显示十位LCD_WRITE(GW+0x30,DAT); ; //显示个位LCD_WRITE('r',DAT); //在当前位置显示字符'r' LCD_WRITE('/',DAT); //在当前位置显示字符'/' LCD_WRITE('n',DAT); //在当前位置显示字符'n'}void interrupt ISR(void){ if(INTF==1&&RB0==0) //中断标志INTF { DELAY_I(30);KEY_SET+=1;if(KEY_SET>=2){KEY_SET=0;}INTF=0;INTCON=0b11011000;}if(RBIF==1){ DELAY_I(30);if (RB1==0 && KEY_SET==1){ KEY_DEC=1;}if (RB2==0 && KEY_SET==1){ KEY_INC=1;}RBIF=0;}if(CCP1IF==1&&RB0==1&&RB1==1&&RB2==1) //捕捉的中断{ KEY_T1N=1; //捕捉4个下降沿完成T1N=CCPR1H;T1N=T1N<<8;T1N=T1N+CCPR1L;T1N=T1N*8; //4个脉冲,1转的时间CCPR1H=CCPR1L=0;DELTA_T=60000000/T1N;CCP1IE=0;T1CON=0;CCP1CON=0;CCP1IF=0;}}//写R1的高4位,FLAG为寄存器选择void LCD_WRITE_4(char R1,char FLAG){ LCD_RW=0; //写模式LCD_RS=FLAG; //寄存器选择PORTD &= 0b11110000; //RB的数据4位清0LCD_E=1; //使能PORTD |=R1; //送R1的低4位至RB口的高4位NOP();NOP(); //短延时LCD_E=0; //数据送入有效LCD_RS=0;PORTD &= 0b11110000; //RB的数据4位清0 }//写一字节数R1,FLAG为写命令或数据选择,0为写命令,1为写数据void LCD_WRITE(char R1,char FLAG){char R2;LCD_BUSY();R2=R1>>4;LCD_WRITE_4(R2,FLAG);R2=R1 & 0x0F;LCD_WRITE_4(R2,FLAG);}//读LCD状态char LCD_READ(void){ char R1;LCD_RS=0; //寄存器选择LCD_RW=1; //读为1NOP();NOP(); //短延时LCD_E=1; //使能NOP();NOP(); //短延时R1=PORTD;R1=R1<<4; //读数据的高4位给R1高4位R1=R1 & 0xF0;LCD_E=0; //读数据结束NOP();NOP(); //短延时LCD_E=1; //使能NOP();NOP();R1 |= PORTD>>1; //读PORTB的1-4位,R1的高4位不变!LCD_E=0; //读数据结束LCD_RW=0;return (R1);}//检测LCD是否忙void LCD_BUSY(void){ char R1;while(1){ R1=LCD_READ(); //读寄存器if ((R1 & 0x80)==0x00) //最高位为忙标志位break;};}//整屏显示void DISP_MENU(const char *A){char i;CLR_LCD();LCD_WRITE(LINE1,COM); //回到行首for (i=0;i<16;i++)LCD_WRITE(A[i],DAT); //显示16个字符,ASCII码对应的字符}//从R1双字节数转换为十进制数千位-个位: QW,BW,SW,GWvoid BCD(unsigned int R1){ QW=0;BW=0;SW=0;GW=0;while(R1>=1000){R1-=1000;QW++;}while(R1>=100){R1-=100;BW++;}while(R1>=10){R1-=10; SW++;}GW=R1;}//延时(n)msvoid DELAY(unsigned int n){ unsigned int j;char k;for (j=0;j<n;j++)for (k=246;k>0;k--) NOP();}//延时(n)ms,中断专用 void DELAY_I(unsigned int n) { unsigned int j; char k;for (j=0;j<n;j++)for (k=246;k>0;k--) NOP();}//延时(n ×10)us void DELAY_US(char n) { char j; for (j=0;j<n;j++){NOP();NOP();}}2. PROTEUSE 线路接线图D 7D 6D 5D 4D 3D 2D 1D 0ER W R S V S S V D D V E E3.设计说明1.确定期望转速在用PROTEUS 仿真中。
PIC课设报告与PIC程序与仿真图

X X X X 《PIC单片机课程设计》数字钟设计报告学生: x x x学号: ***********专业: *****************班级: ****************指导教师: **********二○一二年 12 月 16 日目录1.课程设计目的 (2)2.课程设计要求 (2)3.课程设计容 (2)4.问题分析 (6)5.设计体会 (6)6.参考书目 (6)7.附:PIC程序与仿真图 (7)1.课程设计目的①进一步熟悉PIC单片机原理与应用;②巩固并提高对这学期PIC单片机知识的学习和应用;③熟悉对PIC16F887的编程;④掌握实验板上的操作和运用;⑤了解数字钟的组成和原理,编写程序并在实验板上运行。
2.课程设计要求1)运用所学的PIC单片机知识,对PIC16F887进行编程,实现数字钟的功能。
2)在软件仿真可行后,下载到实验板上进行演示。
3)在基本功能实现的基础上,可以适当的添加一些附加功能。
4)设计完毕后,总结和整理资料,写成设计报告。
3.课程设计容运用PIC16F887芯片和DS1307时钟芯片,用C语言编程,通过ICD2烧写进芯片,在1602液晶显示屏上实现时间显示、运行的功能称为数字钟。
液晶显示屏显示着年、月、日、时、分、秒、星期。
数字钟有调整时间的功能,通过对按键的操作可以对时间进行调整。
3.1系统功能说明显示屏分两行显示,第一行显示日期:年—月—日、星期,第二行显示格式为时间(时:分:秒)。
显示秒由00一直加到59,分钟由00加到59,小时采用24小时制,由00加到23,星期由1一直加到7,日由01一直加到31,月由01一直加到12,年由2000一直加到2099。
按键操作时,按键S1按下时,数字加;按键S5按下时,数字减;按键S9按下时,位左移;按键S13按下时,位右移。
3.2设计步骤1、先画好仿真图;2、把数字钟分为几个模块,分别完成一个一个模块的编程;3、各个模块程序编写完成后,用仿真图仿真;4、若仿真图可实现,则把各个模块程序下载到实验板上运行;5、各个模块完成后再把各个模块串联起来,进行调试。
PIC单片机原理及应用第三版课程设计

PIC单片机原理及应用第三版课程设计一、前言PIC单片机原理及应用是一门非常重要的课程,它是在电子工程、计算机科学等领域中必须学习的基础课程之一。
本文将介绍PIC单片机的原理和应用,并且将会介绍一份课程设计,希望对读者有所帮助。
二、PIC单片机的原理单片机是一种集成电路,它包含了一些用于控制和处理数据的硬件设备。
PIC单片机是由美国微芯科技公司(Microchip Technology Inc.)生产的,是一种非常流行的单片机,它广泛应用于各种计算机和电子系统中。
PIC单片机的结构包括三个部分:处理器核心、外围设备和存储器。
1. 处理器核心PIC单片机的处理器核心采用RISC(Reduced Instruction Set Computing,精简指令集)结构,该结构在指令的执行速度和效率方面相对较高。
PIC单片机的处理器核心包括了一个15位或33位的存储器指针、一个独立的数据寄存器和一个常量移位器等。
2. 外围设备PIC单片机的外围设备包括了很多种外设,比如通用输入/输出端口(GPIO)、模拟模块、定时器、计数器、USART(通用异步收发传输器)等。
这些外设可以用于很多种不同的应用中。
3. 存储器PIC单片机的存储器包括了程序存储器和数据存储器两种。
程序存储器存储了单片机的指令和程序,而数据存储器可以存储程序中用到的数据。
三、PIC单片机的应用PIC单片机在很多领域都有着广泛的应用,包括电子、工业、计算机等。
1. 电子应用在电子应用领域中,PIC单片机由于体积小、功耗低、成本低等优点,被广泛应用于各种控制系统、智能家居、数字音频处理等方面。
2. 工业应用在工业应用领域中,PIC单片机被用于控制和监控各种工业设备和生产过程。
比如说,一些自动化工厂中的计数器、条码扫描器、工艺控制器等都是由PIC单片机控制的。
3. 计算机应用在计算机应用领域中,PIC单片机和各种其他的硬件设备一起被用于开发各种类型的计算机系统。
PIC单片机实用教程基础篇第二版教学设计 (2)

PIC单片机实用教程基础篇第二版教学设计一、目标通过本教程,学生将会:1.理解单片机的概念2.掌握PIC单片机的基础知识和使用方法3.熟悉PIC单片机的编程语言4.能够使用C编程语言控制单片机进行简单的控制操作二、学习内容及进度安排1. 单片机基础•了解单片机本质•认识处理器架构•熟练掌握单片机的外设及寄存器的使用时间安排:2周2. PIC单片机基础知识•了解PIC单片机芯片的特性和类型•熟悉PIC单片机芯片引脚和内部结构•学习PIC单片机的编程和调试方法时间安排:3周3. PIC单片机的编程语言——C•学习C语言的基础语法•掌握C语言中的控制流、数组和指针等知识点•理解C语言在单片机编程中的应用时间安排:5周4. PIC单片机的应用•学习常用的PIC单片机应用案例•掌握控制外部设备的方法•编程并实现一个简单的单片机控制系统时间安排:4周三、教学方法•针对不同的学习内容采用不同的教学方法,如讲解、演示、实践等•采用案例教学法,将知识点与实际应用相结合进行教学•通过实践项目激发学生的兴趣和学习热情,增加对知识点的理解和掌握程度四、教学评估•通过课堂练习、作业和项目实践等方式进行评估•课堂练习占20%的总评分,作业占30%的总评分,项目实践占50%的总评分•评估标准包括学生的知识掌握、实践能力和综合素质等五、教学资源•本教程采用PIC单片机实用教程基础篇第二版教材•部分实践项目会涉及到外部设备,需要相应的硬件设备支持•可以提供相应的开发环境和编程软件六、教学团队•主讲教师:张XX,工程师,从事单片机嵌入式开发多年,有丰富的实践经验和教学经验•助教:李XX、王XX等,均为一线从业人员,能够提供实用的教学帮助。
pic单片机做课程设计

pic单片机做课程设计一、课程目标知识目标:1. 理解PIC单片机的基本结构、工作原理及功能特点;2. 掌握PIC单片机的编程语言和开发环境;3. 学会使用PIC单片机进行简单的电路设计和控制系统搭建;4. 了解单片机在现实生活中的应用,培养对电子技术的兴趣。
技能目标:1. 能够运用所学的PIC单片机知识,设计并完成具有一定功能的课程项目;2. 培养动手实践能力,学会焊接、调试和排错;3. 提高问题分析能力,能够针对实际问题设计合理的单片机控制系统;4. 增强团队协作能力,学会在项目中进行沟通与分工。
情感态度价值观目标:1. 培养学生对电子技术的热情,激发学习兴趣;2. 培养学生具备良好的学习习惯,积极面对挑战,勇于克服困难;3. 增强学生的创新意识,鼓励他们在课程设计中发挥想象力和创造力;4. 培养学生的环保意识,关注电子垃圾处理和资源节约。
本课程针对高年级学生,结合学科特点和教学要求,注重理论与实践相结合,旨在提高学生的动手能力、创新意识和团队协作能力。
通过课程学习,使学生掌握PIC单片机的相关知识,为今后从事电子技术领域的工作打下基础。
同时,课程目标分解为具体的学习成果,便于教学设计和评估,确保课程实施的有效性。
二、教学内容1. PIC单片机基本结构:介绍PIC单片机的内部结构,包括CPU、存储器、输入输出端口等,参考教材第二章内容;2. PIC单片机工作原理:讲解PIC单片机的工作原理,包括指令执行、中断处理等,参考教材第三章内容;3. 编程语言与开发环境:学习PIC单片机的编程语言(如C语言)及开发环境(如MPLAB),参考教材第四章内容;4. 基本电路设计与控制:教授如何使用PIC单片机设计简单的电路和控制系统,参考教材第五章内容;- 输入输出控制;- 定时器/计数器应用;- 中断处理;5. 应用案例与项目实践:分析PIC单片机在实际应用中的案例,如温度控制系统、智能小车等,参考教材第六章内容;6. 课程项目设计与实施:指导学生进行课程项目设计,要求具备一定功能,并能实际操作,结合教材内容及实际需求进行。
pic单片机课程设计

pic单片机课程设计一、课程目标知识目标:1. 让学生掌握PIC单片机的基本结构、工作原理及功能特点;2. 使学生了解并熟练运用PIC单片机的指令系统,进行简单的程序设计;3. 让学生掌握PIC单片机外围电路的设计方法,并能进行基本的电路搭建。
技能目标:1. 培养学生具备使用PIC单片机进行嵌入式系统开发的能力;2. 培养学生运用编程软件(如MPLAB)进行程序编写、调试的能力;3. 提高学生分析问题、解决问题的能力,使其能够运用所学知识解决实际问题。
情感态度价值观目标:1. 培养学生对电子技术的兴趣,激发其探索精神;2. 培养学生具备良好的团队合作意识,使其在项目实践中互相学习、共同成长;3. 培养学生具备创新意识,鼓励其在课程设计中勇于尝试新方法、新技术。
课程性质:本课程为实践性较强的课程,以项目为导向,注重培养学生的动手能力和实际应用能力。
学生特点:学生具备一定的电子基础和编程基础,对新技术具有好奇心,喜欢动手实践。
教学要求:结合学生特点,课程设计应注重理论与实践相结合,充分调动学生的积极性,引导其主动参与教学活动,提高学生的实际操作能力。
在教学过程中,关注学生的个体差异,因材施教,使每位学生都能在课程中收获成长。
通过课程目标的实现,为学生在后续的嵌入式系统开发领域打下坚实基础。
二、教学内容1. PIC单片机基本原理- 单片机概述、发展历程及分类- PIC单片机的内部结构、工作原理及性能特点2. PIC单片机指令系统与编程- 指令集介绍、指令格式及操作方法- 程序设计基础:顺序结构、分支结构、循环结构- 编程实例分析及练习3. PIC单片机外围电路设计- 常用外围元器件及其功能- 基本电路设计方法:输入/输出接口、模拟/数字转换、定时器/计数器等- 电路搭建与调试技巧4. 嵌入式系统项目实践- 项目分析与需求分析- 系统设计、程序编写及调试- 系统测试与优化5. 教学内容安排与进度- 第一章:PIC单片机基本原理(2课时)- 第二章:PIC单片机指令系统与编程(4课时)- 第三章:PIC单片机外围电路设计(4课时)- 第四章:嵌入式系统项目实践(6课时)教学内容依据课程目标,结合教材章节进行组织,注重理论与实践相结合,使学生能够循序渐进地掌握PIC单片机的相关知识和技能。
pic课程设计

pic课程设计一、课程目标知识目标:1. 学生能理解并掌握课程核心概念,如XXX(此处填写具体学科概念),建立扎实的理论基础。
2. 学生能运用所学知识,分析和解决实际生活中的问题,将理论知识与实际应用相结合。
技能目标:1. 学生通过本课程的学习,培养良好的XXX(此处填写学科相关技能,如实验操作、数据处理等)技能,提高实践操作能力。
2. 学生能够运用所学技能,独立完成课程项目,具备一定的创新意识和团队协作能力。
情感态度价值观目标:1. 学生在学习过程中,培养对学科的兴趣和热情,形成积极向上的学习态度。
2. 学生通过课程学习,认识到所学知识在现实生活中的重要性,增强社会责任感和使命感。
3. 学生在团队合作中,学会尊重他人,培养良好的沟通能力和团队精神。
课程性质:本课程为XXX学科(此处填写具体学科)的示范课,旨在帮助学生巩固基础知识,提高实践能力,培养创新精神和团队协作能力。
学生特点:考虑到学生所在年级的特点,课程设计将注重知识性与趣味性相结合,激发学生的学习兴趣,同时关注学生的个体差异,因材施教。
教学要求:教师应关注学生的实际需求,注重启发式教学,引导学生主动探究,提高课堂互动效果。
同时,注重过程性评价,及时了解学生的学习进度,调整教学策略,确保课程目标的达成。
二、教学内容根据课程目标,本章节教学内容主要包括以下几部分:1. 知识讲解:- 教材章节:XXX(此处填写教材具体章节)- 内容列举:XXX(此处列举具体教学内容,如基本概念、原理、公式等)2. 实践操作:- 教材章节:XXX(此处填写教材具体章节)- 内容列举:XXX(此处列举实践操作相关内容,如实验、案例分析等)3. 知识拓展:- 教材章节:XXX(此处填写教材具体章节)- 内容列举:XXX(此处列举拓展性内容,如学科前沿、跨学科知识等)4. 课程项目:- 教材章节:XXX(此处填写教材具体章节)- 内容列举:XXX(此处列举课程项目相关内容,明确项目目标、任务分配等)教学大纲安排如下:1. 导入新课:通过生活实例或问题,激发学生兴趣,引出本节课的学习内容。
pic课设实验报告

==《PIC单片机》课程设计学生姓名:学号:专业班级:指导教师:二○○12年05 月04 日目录(二号字体)1 设计方案,目的,内容. (1)2.设计的硬件及说明 (1)3.设计的软件及说明 (5)4 实验结果 (6)5小结 (7)一课程设计的目的《PIC 单片机课程设计》是电气工程及其自动化专业及相近专业的一门重要的专业实践课,本课程在《PIC 单片机》课程的基础上,通过硬件设计与软件编程与调试的实践,进一步掌握PIC 单片机的应用方法,熟练PIC 单片机的C 程序的编写与调试,是毕业设计前的一次重要的实践,为今后走上工作岗位打下坚实的单片机应用基础。
二设计内容1 Proteus 线路图绘制根据所设计的线路图,绘制与之一致的,能用于仿真的Proteus 线路图。
要求所绘的线路图美观、紧凑,参数要与课设一致。
2、软件编制与调试根据所设计的线路图制相应的单片机C 程序,要求所制的程序符合C 语言格式并加上注解。
每编一段即进行译,有错及时修改,并先在Proteus 上仿真,基本正确后再用PICkit3 在线调试,最后应脱机运行。
三设计方案1我做的是数字钟及数字温度计:包括按键.LCD.蜂鸣器时钟芯片DS1307和温度传感器TC74。
2功能;此设计可以感测环境的温度,显示当前的时间,及闹钟。
温度与时间都显示在LCD显示屏上。
四硬件设计及说明1复位按键此图用于复位单片机,使其从新执行相应的程序。
12 振荡方式此图是LP.XT.HS的晶体振荡/陶瓷振荡器接线方式,这种方式接线更准。
3时钟芯片DS1307及附属接线时钟芯片DS1307用于产生时间,它提供了秒、分、时、日、年、和星期等数据,能算只瑞年2100年,时钟的晶振是典型的32.768Hz。
(1)其引脚作用如下:2(2)DS1307的读写如下;1写DS1307 的步骤如下:a) 发送启始位;b) 发送DS1307 的7位地址+0 (写),即0b11010000;c) 发送要写入DS1307 的地址,地址见图16,如要修改分,此值为1;d) 发送要写入DS1307 的数,如要把分修改为十进制数37,则此数为0x37;e) 发送停止位;2读DS1307 的步骤如下:a) 发送启始位;b) 发送DS1307 的7位地址+0 (写),即0b11010000;c) 发送要读的DS1307 的起始地址,如要从秒读起,为0;d) 发送停止位;e) 发送重新开始位;f) 发送DS1307 的7位地址+1 (读),即0b11010001;g) 发送读使能位,接收一个数据,单片机发送应答位;h) 发送读使能,接收下一个数据(地址会自动+1),单片机发送应答位,直到读数完成,接收最后一个数时单片机不发送应答位;i) 发送停止位;注意在DS1307仿真的时候七位地址为0b1001101 而实际为0b1001000 ;(3)功能是;提供时间通过pic16F877送入LCD中显示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.目录一、课程设计目的 ............................................................................................................................. - 1 -二、设计题目及要求 ......................................................................................................................... - 1 -2.1 设计题目:.................................................................................................................................. - 1 - 2.2 功能实现:.................................................................................................................................. - 1 -2.3 设计要求:.................................................................................................................................. - 1 -三、设计原理说明 ............................................................................................................................. - 1 -3.1 时钟模块...................................................................................................................................... - 1 - 3.2 显示模块...................................................................................................................................... - 2 - 3.3 按键模块...................................................................................................................................... - 2 -3.4 温度采集模块.............................................................................................................................. - 2 -四、硬件原理图 ................................................................................................................................. - 2 -五、软件设计 ..................................................................................................................................... - 4 -六、设计总结 ................................................................................................................................... - 19 -一、课程设计目的本课程设计是在《PIC单片机原理及应用》及《单片机C语言编程》课程的基础上,通过硬件设计、软件编程及仿真调试的实践,进一步掌握PIC单片机的应用方法,熟练掌握PICC C语言程序的编写与调试,是毕业设计前的一次重要实践,为今后走上工作岗位打下坚实的单片机应用基础。
二、设计题目及要求2.1 设计题目:基于PIC16F877单片机的多功能电子时钟2.2 功能实现:实时时钟显示,时间可调;实时温度显示,并具有超限报警功能。
输出显示采用LCD1602或LED七段数码显示器。
2.3 设计要求:自己设计硬件和程序编程,画出完整的电路原理图,用Multisim或Proteus仿真,最终可实现脱机运行。
三、设计原理说明3.1 时钟模块DS1307是美国DALLAS公司推出的I2C总线接口实时时钟芯片,它可独立于CPU 工作,不受CPU主晶振及其电容的影响,且计时准确,月累积误差一般小于10秒。
芯片还具有主电源掉电情况下的时钟保护电路,DS1307的时钟靠后备电池维持工作,拒绝CPU对其读出和写入访问。
同时还具有备用电源自动切换控制电路,因而可在主电源掉电和其它一些恶劣环境场合中保证系统时钟的定时准确性。
DS1307具有产生秒、分、时、日、月、年等功能,且具有闰年自动调整功能。
同时,DS1307芯片部还集成有一定容量、具有掉电保护特性的静态RAM,可用于保存一些关键数据。
3.2 显示模块如用LCD1602作为显示设备,要求显示屏分两行显示,第一行显示日期(年-月-日)和星期,第二行显示时间(时:分:秒)和温度。
显示秒由00一直加到59,分钟数也由00加到59,小时采用24小时制,由00加到23,如此循环显示。
3.3 按键模块按键用来作为时间调整。
要求至少设计4个按键,按键1作为设置键;按键2、按键3分别为增加、减少键,在设置键按下时,此两个按键方有效;按键4是确定键,在设置键按下时方才有效。
3.4 温度采集模块DS18B20是美国DALLAS公司推出的单总线数字温度传感器。
DS18B20部集成了温敏元件、数据转换芯片、存储器芯片和计算机接口芯片等多功能模块。
其主要技术特点有:具有独特的单线接口方式;可以通过数据线供电,具有超低功耗工作方式;测温围为-55℃~125℃,测温精度为0.5℃;温度转换精度9~12位可编程,直接将温度转换值以二进制数码的方式串行输出。
四、硬件原理图(含原理图、电路仿真图)时间显示:按下温度键temp后显示温度:五、软件设计(含流程图、带注释的程序清单)#include <pic.h>#include<string.h>#include<stdio.h>#define _XTAL_FREQ 1000000UL#define speak RC3#define ON 0#define OFF 1#define DQ RB5//设置数据方向#define DQ_IN() TRISB5 = 1 //输入#define DQ_OUT() TRISB5 =0 //输出//DS1302引脚定义#define IO RA1#define SCLK RA0#define RST RA2//DS1302端口数据读写方向#define SET_IO_RD() TRISA1 = 1#define SET_IO_WR() TRISA1 = 0#define LCD_CLS 0x01#define LCD_HOME 0x02#define LCD_SETMODE 0x04#define LCD_SETVISIBLE 0x08#define LCD_SHIFT 0x10#define LCD_SETFUNCTION 0x20#define LCD_SETCGADDR 0x40#define LCD_SETDDADDR 0x80#define PORT_LCD_DAT PORTD#define PORT_LCD_CTL PORTC#define TRIS_LCD_DAT TRISD#define TRIS_LCD_CTL TRISC#define RS RC5#define RW RC6#define E RC7extern unsigned char DateTime[];extern char WEEK[][4]= {"SUN","MON","TUS","WEN","THU","FRI","SAT"}; //0,1,2,3,4,5,6分别对应周日,周一至周六//所读取的日期时间(秒,分,时,日,月,星期,年)unsigned int temper;unsigned int settempe = 570 ;unsigned char DateTime [7];unsigned char tmp[]="0000";//向DS1302写入一个字节unsigned char RB1_FLAG = 0;const unsigned char tone[]={108,102,91,86,77,68,61,57};//发声的频率常数void delay18us(unsigned char x) //18us,每次加1,增加9us{unsigned char i;for(;x>0;x--){for(i=0;i<1;i++);}}void delay1ms(unsigned int x){unsigned char i;for(;x>0;x--)for(i=0;i<165;i++);}void write_byte_to_DS1302(unsigned char x){unsigned char i; SET_IO_WR();for(i=0x01; i !=0x00; i <<= 1){if (x & i) IO = 1; else IO =0;SCLK = 0; SCLK =1; __delay_us(10);}}//从DS1302读取1字节unsigned char get_byte_form_DS1302(){unsigned char i,dat =0x00; SET_IO_RD();for(i = 0; i < 8; i++){SCLK = 1; SCLK=0;if(IO) dat |= (0x01<<i); __delay_us(10);}return (dat>>4)*10 + (dat&0x0F);}//从DS1302指定位置读数据unsigned char read_data(unsigned char addr){unsigned char dat;RST = 1;write_byte_to_DS1302(addr);dat = get_byte_form_DS1302();RST = 0;return dat;}//向DS1302指定地址写数据void Write_DS1302(unsigned char addr,unsigned char dat){RST = 1;write_byte_to_DS1302(addr);write_byte_to_DS1302(dat);RST = 0;}void port_init(){ADCON1 = 0X06; //RA设置为普通IO口TRISA = 0X00; //端口A设置为输出OPTION = 0X00; //端口B弱上拉使能TRISB = 0xFF;PORTC = 0X00;TRISC = 0X00; //端口C设置为输出PORTD = 0X00;TRISD = 0X00; //端口D设置为输出speak=0;}void song(unsigned char x){unsigned char i,j;for(i=0;i<60;i++){for(j=0;j<3;j++){speak = 1;delay18us(tone[x]);speak = 0; //翻转发声delay18us(tone[x]);}}}void keyscan(){unsigned char a ,b ;DateTime[0]=0;Write_DS1302(0x8E,0x00); //Write_DS1302(0x80,0x80); //if(RB2==0) //小时+1{DateTime[2] = DateTime[2]+1; //第三个元素小时+1if(DateTime[2] == 24) DateTime[2]= 0;//当变为24H时,小时位归零a = DateTime[2]/10*16+DateTime[2]%10; //变成16进制数据Write_DS1302(0x84,a);}if(RB3==0){DateTime[1] = DateTime[1]+1; //第二个元素分钟+1if(DateTime[1] == 60) DateTime[1]= 0;//当变为60min时,小时位归零b = DateTime[1]/10*16+DateTime[1]%10; //变成16进制数据Write_DS1302(0x82,b);}if(RB4==0){song(3);while(RB4 == ON);Write_DS1302(0x80,0x00); // 调整完毕后启动时钟运行Write_DS1302(0x8E,0x00); // 禁止写RB1_FLAG = 0; // 将RB1按下后产生的标志清除}}//DS1302初始化void init_DS1302(){unsigned char second_REG;second_REG = read_data(0x81); //读取秒寄存器当前值//如果高位CH为1,则表示当前DS1302振荡器出于待机状态//这时需要将CH(clock halt flag)位设为0,打开振荡器使时钟运行if ((second_REG & 0x80) == 0x80){Write_DS1302(0x8E,0x00) ; //写控制字节,取消写保护Write_DS1302(0x80,second_REG & 0x7F) ; //0x80地址不变,设高位CH=0 Write_DS1302(0x8E,0x80) ; //加保护}}//读取当前日期void getDateTime(){//Write_DS1302(0x8E,0x00); //允许写操作unsigned char i, addr = 0x81;for (i=0; i<7; i++){DateTime[i] = read_data(addr);addr +=2;}}//********LCD显示子函数***********************////**********结束LCD子函数********************//void LCD_BUSY_WAIT() //忙等待{unsigned char status;TRIS_LCD_DAT = 0xFF;RS = 0; RW = 1;do{E =1; NOP();status = PORT_LCD_DAT;E = 0;}while (status & 0x80);}void Write_LCD_Command(unsigned char cmd) //写LCD命令{TRIS_LCD_DAT = 0x00;PORT_LCD_DAT = cmd;PORT_LCD_CTL = TRIS_LCD_CTL = 0x00;RS = 0;RW = 0;E = 1 ;E = 0 ;LCD_BUSY_WAIT();}void Write_LCD_Data(unsigned char dat) //写LCD寄存器数据{TRIS_LCD_DAT = 0x00;PORT_LCD_DAT = dat;RS = 1;RW = 0;E = 1 ;NOP();E = 0;LCD_BUSY_WAIT();}void LCD_Initialize(){Write_LCD_Command(0x38);__delay_ms(2);Write_LCD_Command(0x01);__delay_ms(2);Write_LCD_Command(0x06);__delay_ms(2);Write_LCD_Command(0x0C);__delay_ms(2);}void LCD_ShowString(unsigned char r, unsigned char c, char *str) {unsigned char i = 0;if(r == 0) Write_LCD_Command(0x80 | c);if(r == 1) Write_LCD_Command(0xC0 | c);for (i = 0; i < 16 && str[i]!= '\0'; i++)Write_LCD_Data(str[i]);}void display_str(unsigned char line,unsigned char location,unsigned char str)//line行,location列,str字符{RS=0;RW=0;E=1;delay1ms(1);if (line==0) //line=0,第一行PORT_LCD_DAT=0x80+location;if (line==1) //line=1,第二行PORT_LCD_DAT=0xC0+location;E=0;LCD_BUSY_WAIT() ;Write_LCD_Data(str);}void Set_LCD_POS(unsigned char r,unsigned char c) //设置显示起始位置{if(r == 0) Write_LCD_Command(0x80 | c); elseif(r == 1) Write_LCD_Command(0xC0 | c);}//********18B20子程序********////包括函数:void Wait_18B20();////void delay15us(unsigned int x) //x必须大于0{{x--;}while(x);}void reset(){unsigned char state_DQ=1;while(state_DQ){DQ_OUT();delay15us(64); //延时721usDQ_IN();delay15us(5); //延时61usif (DQ)state_DQ=1; //若DS18B20无应答,循环检查elsestate_DQ=0; //检测到DS18B20应答低电平信号delay15us(43); //延时490us}}void write_one_byte(unsigned char data){unsigned char i,tmp;for(i=0;i<8;i++){tmp=data&0x01;data>>=1;if (tmp) //tmp=1时{DQ_OUT();NOP();NOP();DQ_IN();delay15us(5); //延时61us }else{DQ_OUT();delay15us(5); //延时61usDQ_IN();NOP();NOP();}}}unsigned char read_one_byte(){unsigned char i,data;for(i=0;i<8;i++){data>>=1;DQ_OUT();NOP();DQ_IN();NOP();NOP();if (DQ==1)data=data|0x80;delay15us(5); //延时61us }return(data);}unsigned int get_temperature(){unsigned char tmpA,tmpB; //定义读出RAM的高低位变量reset();write_one_byte(0xcc); //写跳过ROM命令,因为总线上只有一个DS18B20 write_one_byte(0x44); //启动DS18B20温度转换命令delay1ms(800);reset(); //如果再写命令必须再次复位write_one_byte(0xcc); //写跳过ROM命令,因为总线上只有一个DS18B20 write_one_byte(0xbe); //读部RAM中9字节的容命令tmpA=read_one_byte(); //读部RAM 低八位温度tmpB=read_one_byte(); //读部RAM 高八位温度temper=tmpB*256+tmpA;return(temper);}void temp (){unsigned char tmpB,tmpA;unsigned int results;display_str(1,10,tmp[0]); //在指定位置显示百位/负号display_str(1,11,tmp[1]); //在指定位置显示十位display_str(1,12,tmp[2]); //在指定位置显示个位display_str(1,13,'.'); //在指定位置显示小数点位display_str(1,14,tmp[3]); //在指定位置显示十分位位display_str(1,15,0XDF); //在指定位置显示°display_str(1,16,'C'); //在指定位置显示Cdelay1ms(200); //tmp[21]... 22 23 25results=get_temperature();if(results>=0x1000){results=results^0xFFFF;results++;tmpB=results/256;tmpA=(unsigned char)results;results>>=4;tmp[0]=0x2D; //负号}else{tmpB=results/256; //高八位tmpA=(unsigned char)results; //低八位results>>=4;tmp[0]=results/100+0x30; //百}tmp[1]=results/10%10+0x30; //十tmp[2]=results%10+0x30; //个tmpA<<=4;tmpA>>=4;results=625*tmpA;tmp[3]=results/1000+0x30;//if (results>40)//speak = 0;//song(0);}char LCD_disp_buff[17];void pro_key_scan(){if(RB1 == 1){getDateTime();}if(RB1== 0){song(0);while(RB1 == ON);__delay_ms(10);//if(RB1==0)//{while(! RB1);RB1_FLAG = 1;//}}if (RB1_FLAG == 1) keyscan();}void Screen(){sprintf(LCD_disp_buff,"%02d-%02d-%02d %3s",DateTime[6],DateTime[4],DateTime[3],WEEK[DateTime[5]-1]);LCD_ShowString(0,0,LCD_disp_buff);sprintf(LCD_disp_buff,"%02d:%02d:%02d ",DateTime[2], DateTime[1],DateTime[0]);LCD_ShowString(1,0,LCD_disp_buff);__delay_ms(100);}void compare(){if(temper > settempe ) //当温度超过35.7度,蜂鸣器便会报警。