PIC单片机课程设计.doc

上传人:小** 文档编号:13303986 上传时间:2020-06-14 格式:DOC 页数:21 大小:537.50KB
收藏 版权申诉 举报 下载
PIC单片机课程设计.doc_第1页
第1页 / 共21页
PIC单片机课程设计.doc_第2页
第2页 / 共21页
PIC单片机课程设计.doc_第3页
第3页 / 共21页
资源描述:

《PIC单片机课程设计.doc》由会员分享,可在线阅读,更多相关《PIC单片机课程设计.doc(21页珍藏版)》请在装配图网上搜索。

1、PIC单片机课程设计报告NORTH CHINA UNIVERSITY OF SCIENCE AND TECHNOLOGY单片机课程设计报告学生姓名: 王文帅 学 号: 201214570405 学 院: 信息工程学院 专业班级: 12级电信四班 指导教师: 崔博 2015年06月21 日一、课程设计目的本课程设计是在PIC单片机原理及应用及单片机C语言编程课程的基础上,通过硬件设计、软件编程及仿真调试的实践,进一步掌握PIC单片机的应用方法,熟练掌握PICC C语言程序的编写与调试,是毕业设计前的一次重要实践,为今后走上工作岗位打下坚实的单片机应用基础。二、设计题目及要求2.1 设计题目:基于

2、PIC16F877单片机的多功能电子时钟2.2 功能实现:实时时钟显示,时间可调;实时温度显示,并具有超限报警功能。输出显示采用LCD1602或LED七段数码显示器。2.3 设计要求:自己设计硬件和程序编程,画出完整的电路原理图,用Multisim或Proteus仿真,最终可实现脱机运行。三、设计原理说明3.1 时钟模块DS1307是美国DALLAS公司推出的I2C总线接口实时时钟芯片,它可独立于CPU 工作,不受CPU主晶振及其电容的影响,且计时准确,月累积误差一般小于10秒。芯片还具有主电源掉电情况下的时钟保护电路,DS1307的时钟靠后备电池维持工作,拒绝CPU对其读出和写入访问。同时还

3、具有备用电源自动切换控制电路,因而可在主电源掉电和其它一些恶劣环境场合中保证系统时钟的定时准确性。DS1307具有产生秒、分、时、日、月、年等功能,且具有闰年自动调整功能。同时,DS1307芯片内部还集成有一定容量、具有掉电保护特性的静态RAM,可用于保存一些关键数据。3.2 显示模块如用LCD1602作为显示设备,要求显示屏分两行显示,第一行显示日期(年-月-日)和星期,第二行显示时间(时:分:秒)和温度。显示秒由00一直加到59,分钟数也由00加到59,小时采用24小时制,由00加到23,如此循环显示。3.3 按键模块按键用来作为时间调整。要求至少设计4个按键,按键1作为设置键;按键2、按

4、键3分别为增加、减少键,在设置键按下时,此两个按键方有效;按键4是确定键,在设置键按下时方才有效。3.4 温度采集模块DS18B20是美国DALLAS公司推出的单总线数字温度传感器。DS18B20内部集成了温敏元件、数据转换芯片、存储器芯片和计算机接口芯片等多功能模块。其主要技术特点有:具有独特的单线接口方式;可以通过数据线供电,具有超低功耗工作方式;测温范围为-55125,测温精度为0.5;温度转换精度912位可编程,直接将温度转换值以二进制数码的方式串行输出。四、硬件原理图(含原理图、电路仿真图)时间显示:按下温度键temp后显示温度:五、软件设计(含流程图、带注释的程序清单)#inclu

5、de #include#include#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 =

6、 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

7、#define RS RC5#define RW RC6#define E RC7extern unsigned char DateTime;extern char WEEK4= 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_FL

8、AG = 0;const unsigned char tone=108,102,91,86,77,68,61,57;/发声的频率常数void delay18us(unsigned char x)/18us,每次加1,增加9usunsigned char i;for(;x0;x-) for(i=0;i0;x-)for(i=0;i165;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

9、=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 |= (0x014)*10 + (dat&0x0F);/从DS1302指定位置读数据unsigned char read_data(unsigned char addr) unsigned char dat; RST = 1; write_byte_

10、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弱上拉使能TR

11、ISB = 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;i60;i+)for(j=0;j3;j+)speak = 1;delay18us(tonex);speak = 0; /翻转发声delay18us(tonex);void keyscan()unsigned char a ,b ; DateTime0=0; Write_DS1302(0x8E,0x00)

12、; / Write_DS1302(0x80,0x80); / if(RB2=0) /小时+1DateTime2 = DateTime2+1; /第三个元素小时+1if(DateTime2 = 24) DateTime2= 0;/当变为24H时,小时位归零a = DateTime2/10*16+DateTime2%10; /变成16进制数据Write_DS1302(0x84,a); if(RB3=0)DateTime1 = DateTime1+1; /第二个元素分钟+1if(DateTime1 = 60) DateTime1= 0;/当变为60min时,小时位归零b = DateTime1/10

13、*16+DateTime1%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振荡器

14、出于待机状态 /这时需要将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

15、=0; i7; i+) DateTimei = 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_

16、LCD_DAT = cmd;PORT_LCD_CTL = TRIS_LCD_CTL = 0x00;RS = 0;RW = 0;E = 1 ;NOP();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

17、_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); elseif(r = 1) Write_LCD_Command(0xC0 | c);for (i = 0; i 16 & stri!= 0;

18、i+)Write_LCD_Data(stri);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_

19、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必须大于0dox-;while(x);void reset()unsigned char state_DQ=1;while(state_DQ)DQ_OUT();delay15us(64);/延时721u

20、sDQ_IN();delay15us(5);/延时61usif (DQ)state_DQ=1;/若DS18B20无应答,循环检查elsestate_DQ=0;/检测到DS18B20应答低电平信号delay15us(43);/延时490usvoid write_one_byte(unsigned char data)unsigned char i,tmp;for(i=0;i=1;if (tmp)/tmp=1时DQ_OUT();NOP();NOP();DQ_IN();delay15us(5);/延时61uselseDQ_OUT();delay15us(5);/延时61usDQ_IN();NOP()

21、;NOP();unsigned char read_one_byte()unsigned char i,data;for(i=0;i=1;DQ_OUT();NOP();DQ_IN();NOP();NOP();if (DQ=1)data=data|0x80;delay15us(5);/延时61usreturn(data);unsigned int get_temperature()unsigned char tmpA,tmpB;/定义读出RAM的高低位变量reset();write_one_byte(0xcc);/写跳过ROM命令,因为总线上只有一个DS18B20write_one_byte(0

22、x44);/启动DS18B20温度转换命令delay1ms(800);reset();/如果再写命令必须再次复位write_one_byte(0xcc);/写跳过ROM命令,因为总线上只有一个DS18B20write_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 resul

23、ts;display_str(1,10,tmp0); /在指定位置显示百位/负号 display_str(1,11,tmp1); /在指定位置显示十位 display_str(1,12,tmp2); /在指定位置显示个位 display_str(1,13,.); /在指定位置显示小数点位 display_str(1,14,tmp3); /在指定位置显示十分位位 display_str(1,15,0XDF); /在指定位置显示 display_str(1,16,C); /在指定位置显示Cdelay1ms(200);/tmp21. 22 23 25 results=get_temperature(

24、);if(results=0x1000)results=results0xFFFF;results+;tmpB=results/256;tmpA=(unsigned char)results;results=4;tmp0=0x2D;/负号elsetmpB=results/256;/高八位tmpA=(unsigned char)results;/低八位results=4;tmp0=results/100+0x30;/百tmp1=results/10%10+0x30;/十tmp2=results%10+0x30;/个tmpA=4;results=625*tmpA;tmp3=results/1000

25、+0x30; /if (results40) /speak = 0; /song(0); char LCD_disp_buff17;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, DateTime6,DateTim

26、e4,DateTime3,WEEKDateTime5-1); LCD_ShowString(0,0,LCD_disp_buff); sprintf(LCD_disp_buff,%02d:%02d:%02d , DateTime2, DateTime1,DateTime0); LCD_ShowString(1,0,LCD_disp_buff); _delay_ms(100); void compare()if(temper settempe ) /当温度超过35.7度,蜂鸣器便会报警。speak=1;song(1); elsespeak=0; void main () /unsigned cha

27、r i; TRISA0 = TRISA2 = 0; port_init(); LCD_Initialize(); init_DS1302; while(1) pro_key_scan() ;Screen(); compare(); temp (); 六、设计总结通过这次课程设计,使我更加扎实的掌握了单片机方面的知识,再设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,实践出真知,通过亲手制作,使我们掌握的知识不再是纸上谈兵。课程设计是一个重要的教学环节,通过课程设计使我们了解到一些实际与理论之间的差异。通过课程设计不仅可以巩固专业知识,为以后的工作打下了坚实的基础,而其还可以培养和熟练使用资料,运用工具书的能力,把我们所学的课本知识与实践结合起来,起到温故而知新的作用。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。感谢课程设计,他教会了我很多!设计成绩:教师签名:年月日 - 20 -

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!