单片机课程设计.doc_第1页
单片机课程设计.doc_第2页
单片机课程设计.doc_第3页
单片机课程设计.doc_第4页
单片机课程设计.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机原理及其技术课程设计报告课程设计题目:单片机原理及其应用课程设计指导老师: 班级: 07电气一班 学号: 200706* 姓名: 日期:2010.6.102010.6.18单片机原理及应用课程设计任务书学年学期:2009-2010第2学期专业班级:07级电气A,B指导教师: 设计时间:第15、16周学时周数:每班/周一、设计目的课程设计是单片机课程教学的最后一个环节,是对学生进行全面的系统的训练,让学生把学过的比较零碎的知识系统化,真正的能够把学过的知识落到实处,能够开发简单的系统,也进一步激发了学生再深一步学习的热情,进一步掌握和利用C语言进行单片机程序设计的能力,熟练掌握键盘、显示、A/D输入输出,I2C总线等知识点。二、设计任务及要求本课程设计的题目设计内容自选,学生可以根据平时的观察,了解单片机实验的应用系统,弄清其结构和功能,结合单片机课程及其相关的知识,充分发挥自身的想象国和创造力,自行选定设计项目,但总体应达到以下要求:1、用89C51CPU,12M时钟,常规的上电和手动复位电路 2、包括34矩阵键盘3、LCD显示显示器及接口4、一路蜂鸣器输出5至少有2路输入信号,可以是模拟量或数字量三、设计时间进度安排时间内容6月7日(1天) 一、布置设计内容和要求1、 实习内容介绍、实习安排、实习纪律、注意事项2、 根据所选题的要求,进行总体设计,确定程序总体框架6月8-9日(2天)二、系统设计1) 利用单片机实验箱,进行AD微调, AD微调的结果在LCD上显示,2)在LCD上有上下限值,通过矩阵键盘来设置。3)若AD微调的值超过上限或是下限则蜂鸣器发出声音.6月10日(1天)三、系统调试1)矩阵键盘加防抖程序测试2)AD两路输入分别调试最大值和最小值,观察系统的变化3)蜂鸣器要在上下限超出时分别发出不同的声音。6月11日(1天)四、测试完整程序与报告上交1、要求功能完整,结果符合设计要求,并进行程序验收。(答辩)2、完成实习报告的编写,并打印上交报告。四、报告书写格式1、课程设计任务书2、设计项目简介3、电路原理图STC89C52键盘输入模块LCD液晶显示屏显示蜂鸣器复位电路1、STC89C52单片机2、内部接线图3、蜂鸣器矩阵键盘LCDAD-DA转化实体液晶屏电路图4、系统功能描述系统可以通过AD-DA模块进行采样,通过液晶屏显示出来,并对采样的数据与之前设定的上下限做比较,且如果采样的两路值的任何一路大于或小于设定的上限或下限,蜂鸣器会发出报警的声音。5、程序框图6、程序清单/* * 矩阵键盘1602液晶显示最大最小值 * 数模转换AD/DA显示当前值 * 比较当前值与最大最小值 * 超出范围则蜂鸣器报警 * */#include#include#define uint unsigned int#define uchar unsigned char#define nop(); _nop_();_nop_();_nop_();_nop_(); /* 定义空指令 */sbit BEE=P15;sbit SCL=P20;sbit SDA=P21;sbit RW=P25;sbit RS=P26;sbit EN=P27;uchar keyno;/键盘扫描缓冲器uchar key;/键盘号码uchar keybuf;/键盘号码缓冲器uchar ascii=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43; /ASCII数字表 0 1 2 3 4 5 6 7 8 9 A B C/*/* */* 延时子程序 */* */*/void delay(uchar mm) uchar ti,tj; for(ti=0;timm;ti+) for(tj=0;tj120;tj+);/*/* */*检查LCD忙状态 */*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据 */* */*/bit lcdbusy() bit result; P0=0xff; RS=0; RW=1; EN=1; nop(); result=(bit)(P0&0x80); EN=0; return(result);/*/* */*写指令数据到LCD */*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */* */*/void lcdwcmd(uchar cmd) while(lcdbusy(); RS=0; RW=0; EN=0; P0=cmd; nop(); EN=1; nop(); EN=0;/*/* */*写显示数据到LCD */*RS=H,RW=L,E=高脉冲,D0-D7=数据 */* */*/void lcdwdat(uchar dat) while(lcdbusy(); RS=1; RW=0; EN=0; P0=dat; nop(); EN=1; nop(); EN=0;/*/* */* LCD初始化设定 */* */*/void lcdinit() delay(150); lcdwcmd(0x38); /16*2显示,5*7点阵,8位数据 delay(50); lcdwcmd(0x38); /*显示模式设置*/ delay(50); lcdwcmd(0x0e); /*开显示,显示光标,光标不闪烁*/ delay(50); lcdwcmd(0x06); /*读写后,地址和指针都加一*/ delay(50); lcdwcmd(0x01); /*数据指针清零,所有显示清零*/ delay(50); /*此部分为I2C总线的驱动程序*/ /* 起动总线函数函数原型: void Start_I2c();功能: 启动I2C总线,即发送I2C起始条件.*/void i2cstart() /I2C总线启动子程序 SDA=1; _nop_(); /*起始条件建立时间大于4.7us,延时*/ SCL=1; nop(); SDA=0; nop(); /* 起始条件锁定时间大于4s*/ SCL=0; /*钳住I2C总线,准备发送或接收数据 */ _nop_(); _nop_(); /* 结束总线函数函数原型: void Stop_I2c();功能: 结束I2C总线,即发送I2C结束条件.*/void i2cstop() /I2C总线停止子程序 SDA=0; _nop_(); SCL=1; nop(); SDA=1; nop(); /* 字节数据发送函数函数原型: void SendByte(UCHAR c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。*/void i2cbsend(uchar ib) /I2C发送字节子程序 uchar isi; for(isi=0;isi8;isi+) /*判断是否接收到应答信号*/ if(ibisi)&0x80)=0x80) SDA=1; /*8位发送完后释放数据线,准备接收应答位*/ else SDA=0; _nop_(); SCL=1; nop(); SCL=0; /* 字节数据接收函数 *函数原型: UCHAR RcvByte(); *功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),* 发完后请用应答函数应答从机。 */uchar i2cbrece() /I2C接受字节子程序 uchar iri; uchar ir=0; for(iri=0;iri8;iri+) SDA=1; SCL=1; ir=ir4)|0xf0); switch(keyno) case 1:key=key+0;break; case 2:key=key+1;break; case 4:key=key+2;break; case 8:key=key+3;break; goto loop; while(P1!=0xf0) keybuf=key; uchar ad(uchar add,uchar road) /AD转换子程序 uchar ad; i2cstart(); do i2cbsend(add); while(i2crack(); do i2cbsend(road); while(i2crack(); i2cstop(); i2cstart(); do i2cbsend(add+1); while(i2crack(); ad=i2cbrece(); i2csack(); i2cstop(); lcdwdat(asciiad/100); lcdwdat(asciiad%100/10); lcdwdat(asciiad%10); return(ad);/3位数输入uchar input() uchar x; keyscan(); lcdwdat(asciikeybuf); x=keybuf*100; keyscan(); lcdwdat(asciikeybuf); x=x+keybuf*10; keyscan(); lcdwdat(asciikeybuf); x=x+keybuf; return(x);/蜂鸣器报警void fmq(uchar mus,uchar t) uchar lon; for(lon=0;lontop) fmq(0x50,0xA0); if(nowdow) fmq(0x50,0x30);/*/* */* 设定显示位置 */* */*/void lcd_pos(uchar pos) lcdwcmd(pos | 0x80); /数据指针=80+地址变量/*/* */* 主程序 */* */*/void main() int m=0; uchar max,min,ad0,ad1; P0=0xFF; /置P0口 P1=0xFF; /置P1口 lcdinit(); lcdwcmd(0x80); /*首行首地址*/ lcdwdat(0x54); /*显示TOP*/ lcdwdat(0x4f); lcdwdat(0x50); lcdwdat(0x3a); lcdwcmd(0x88); /*显示DOW*/ lcdwdat(0x44); lcdwdat(0x4f); lcdwdat(0x57); lcdwdat(0x3a); lcdwcmd(0xc0); /*第二行首地址*/ lcdwdat(0x41); /*显示AD0*/ lcdwdat(0x44); lcdwdat(0x30); lcdwdat(0x3a); lcdwcmd(0xc8); /*显示AD1*/ lcdwdat(0x41); lcdwdat(0x44); lcdwdat(0x31); lcdwdat(0x3a); lcdwcmd(0x84); max=input(); lcdwcmd(0x8c); min=input(); while(1) lcdwcmd(0xc4); ad0=ad(0x90,0x41); cmp(max,min,ad0); lcdwcmd(0xcc); ad1=ad(0x90,0x40); cmp(max,min,ad1); 汇编版/* * 矩阵键盘1602液晶显示最大最小值 * 数模转换AD/DA显示当前值 * 比较当前值与最大最小值 * 超出范围则蜂鸣器报警 * */ SCL EQU P2.0 SDA EQU P2.1 RS EQU P2.6 RW EQU P2.5 E EQU P2.7/*/* */* LCD初始化设定 */* */*/ ORG 0050HMAIN:MOV R0,#20H MOV SP,#60H LCALL YS5MS ;LCD初始化 LCALL YS5MS LCALL YS5MS MOV A,#38H LCALL WCMD_NBUSY LCALL YS5MS MOV A,#38H LCALL WCMD_NBUSY LCALL YS5MS MOV A,#0EH LCALL WCMD_CBUSY MOV A,#06H LCALL YS5MS LCALL WCMD_CBUSY MOV A,#01H LCALL YS5MS LCALL WCMD_CBUSY LCALL XSBG MOV A,#84H LCALL WCMD_CBUSY MOV R3,#03H LCALL KEY MOV A,#8DH LCALL WCMD_CBUSY MOV R3,#03H LCALL KEY LCALL CCMAX MOV A,#0C4H LCALL WCMD_CBUSY MOV A,#0CDH LCALL WCMD_CBUSYAD0: ;AD发送字节 LCALL START_I2CCF1:MOV R5,#90H LCALL SENDBYTE LCALL JCACK JB F0,CF1CF2:MOV R5,#40H LCALL SENDBYTE LCALL JCACK JB F0,CF2 LCALL STOP_I2C LCALL START_I2CCF3:MOV R5,#91H LCALL SENDBYTE LCALL JCACK JB F0,CF3 LCALL RECEBYTE LCALL FSACK LCALL STOP_I2C MOV B,#100 MOV A,R4 MOV 30H,A DIV AB MOV R2,A LCALL XSSJ MOV A,B MOV B,#10 DIV AB MOV R2,A LCALL XSSJ MOV R2,B LCALL XSSJ MOV A,#0C4H LCALL WCMD_CBUSY LCALL BJ LJMP AD1AD1: ;AD发送字节 LCALL START_I2CCF4:MOV R5,#90H LCALL SENDBYTE LCALL JCACK JB F0,CF4CF5:MOV R5,#41H LCALL SENDBYTE LCALL JCACK JB F0,CF5 LCALL STOP_I2C LCALL START_I2CCF6:MOV R5,#91H LCALL SENDBYTE LCALL JCACK JB F0,CF6 LCALL RECEBYTE LCALL FSACK LCALL STOP_I2C MOV B,#100 MOV A,R4 MOV 30H,A DIV AB MOV R2,A LCALL XSSJ MOV A,B MOV B,#10 DIV AB MOV R2,A LCALL XSSJ MOV R2,B LCALL XSSJ MOV A,#0CDH LCALL WCMD_CBUSY LCALL BJ LJMP AD0 /*此部分为I2C总线的驱动程序*/ /* 起动总线函数 函数原型: void Start_I2c();功能: 启动I2C总线,即发送I2C起始条件.*/START_I2C: ;I2C总线启动 SETB SDA NOP /*起始条件建立时间大于4.7us,延时*/ SETB SCL LCALL YS5US CLR SDA LCALL YS5US CLR SCL NOP NOP RET STOP_I2C: ;I2C总线停止 CLR SDA NOP SETB SCL LCALL YS5US SETB SDA LCALL YS5US RETSENDBYTE: ;发送字节子程序 PUSH A MOV R3,#08H MOV A,R5FXW:RLC A MOV SDA,C SETB SCL LCALL YS5US CLR SCL DJNZ R3,FXW POP A RETRECEBYTE: ;接受字节子程序 PUSH A MOV R3,#08HSXW:SETB SDA SETB SCL MOV C,SDA MOV A,R4 RLC A MOV R4,A CLR SCL DJNZ R3,SXW POP A RETJCACK: ;应答位检查子程序 SETB SDA SETB SCL CLR F0 MOV C,SDA JNC JCW SETB F0JCW:CLR SCL RETFSACK: ;发送应答位子程序 SETB SDA LCALL YS5US SETB SCL LCALL YS5US CLR SCL NOP RETXSSJ:MOV DPTR,#TAB ;用LCD显示数据 MOV A,R2 MOVC A,A+DPTR LCALL WDATA RETXSBG:MOV A,#80H ;用LCD显示表格 LCALL WCMD_CBUSY ;显示TOP MOV A,#54H LCALL WDATA MOV A,#4fH LCALL WDATA MOV A,#50H LCALL WDATA MOV A,#3AH LCALL WDATA MOV A,#89H ;显示DOW LCALL WCMD_CBUSY MOV A,#44H LCALL WDATA MOV A,#4fH LCALL WDATA MOV A,#57H LCALL WDATA MOV A,#3AH LCALL WDATA MOV A,#0C0H ;显示AD0 LCALL WCMD_CBUSY MOV A,#41H LCALL WDATA MOV A,#44H LCALL WDATA MOV A,#30H LCALL WDATA MOV A,#3AH LCALL WDATA MOV A,#0C9H ;显示AD1 LCALL WCMD_CBUSY MOV A,#41H LCALL WDATA MOV A,#44H LCALL WDATA MOV A,#31H LCALL WDATA MOV A,#3AH LCALL WDATA RET KEY:LCALL SFAX ;键盘扫描 JNZ QRAX LCALL YS5MS LJMP KEYQRAX:LCALL YS5MS LCALL YS5MS LCALL SFAX JNZ AX LJMP KEY AX:MOV P1,#0FH ;行线为高,列线为低 MOV A,P1 ANL A,#0FH JB 0E1H,L0 MOV R7,#00H LJMP JJ L0:JB 0E2H,L1 MOV R7,#04H LJMP JJ L1:JB 0E3H,SFAX MOV R7,#08H JJ:MOV P1,#0F0H ;行线为低,列线为高 MOV A,P1 ANL A,#0F0H SWAP A JB 0E0H,L2 MOV R1,#00H LJMP QDHM L2:JB 0E1H,L3 MOV R1,#01H LJMP QDHM L3:JB 0E2H,L4 MOV R1,#02H LJMP QDHM L4:JB 0E3H,SFAX MOV R1,#03HQDHM:MOV A,R7 ADD A,R1 PUSH A MSK:LCALL YS5MS LCALL SFAX JNZ MSK POP A MOV R0,A INC R0 MOV R2,A LCALL XSSJ DJNZ R3,KEYSFAX:MOV P1,#0F0H MOV A,P1 ORL A,#0FH CPL A RETCBUSY:PUSH A ;检查忙状态子程序 MOV P0,#0FFH CLR RS SETB RW SETB E BUSY:NOP JB P0.7,BUSY CLR E POP A RETWCMD_CBUSY: LCALL CBUSY ;写指令子程序WCMD_NBUSY: CLR RS CLR RW MOV P0,A SETB E LCALL YS5US CLR E RETWDATA:LCALL CBUSY ;写数据子程序 SETB RS CLR RW MOV P0,A SETB E LCALL YS5US CLR E RETCCMAX:MOV A,R0 ;存储上限 SUBB A,#06H MOV R0,A MOV A,R0 INC R0 MOV B

温馨提示

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

评论

0/150

提交评论