ImageVerifierCode 换一换
格式:DOCX , 页数:32 ,大小:548.73KB ,
资源ID:28956100      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28956100.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数字电压表课程设计书.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数字电压表课程设计书.docx

1、数字电压表课程设计书 单片机课程设计姓 名 王嘉波 学 号 1206062135 年级专业 自动化 所在院系 电气工程与自动化学院 指导教师 关健生 提交日期 2015 年 1月11 日 单片机原理及应用课程设计任务书学年学期:2014-2015第1学期专业班级:12级自动化1班指导教师:关键生 设计时间:第17周学时周数:每班/周一、设计目的课程设计是单片机课程教学的最后一个环节,是对学生进行全面的系统的训练,让学生把学过的比较零碎的知识系统化,真正的能够把学过的知识落到实处,能够开发简单的系统,也进一步激发了学生再深一步学习的热情,进一步掌握和利用C语言进行单片机程序设计的能力,熟练掌握键

2、盘、显示、A/D输入输出,I2C总线,温度传感器等知识点。二、设计任务及要求本课程设计的题目设计内容自选,学生可以根据平时的观察,了解单片机实验的应用系统,弄清其结构和功能,结合单片机课程及其相关的知识,充分发挥自身的想象力和创造力,自行选定设计项目,但总体应达到以下要求:1、用89C51CPU,12M时钟,常规的上电和手动复位电路 2、包括34矩阵键盘3、LCD显示显示器及接口4、一路蜂鸣器输出5至少有2路输入信号,可以是模拟量或数字量三、设计时间进度安排时间内容周一一、布置设计内容和要求1、 实习内容介绍、实习安排、实习纪律、注意事项2、 根据所选题的要求,进行总体设计,确定程序总体框架周

3、二、三(2天)二、系统设计1) 利用单片机实验箱,进行AD微调, AD微调的结果在LCD上显示,2)在LCD上有上下限值,通过矩阵键盘来设置。3)若AD微调的值超过上限或是下限则蜂鸣器发出声音。周四(1天)三、系统调试1)矩阵键盘加防抖程序测试2)AD两路输入分别调试最大值和最小值,观察系统的变化3)蜂鸣器要在上下限超出时分别发出不同的声音。周五(1天)四、测试完整程序与报告上交1、要求功能完整,结果符合设计要求,并进行程序验收。(答辩)2、完成实习报告的编写,并打印上交报告。四、报告书写格式1、课程设计任务书2、设计项目简介A/D转换A/D转换3、电路原理图1、STC89C51功能简图2、蜂

4、鸣器矩阵键盘LCDAD-DA转化实体液晶屏电路图4、系统功能描述系统可以通过AD-DA模块进行采样,通过液晶屏显示出来,并对采样的数据与之前设定的上下限做比较,且如果采样的两路值的任何一路大于或小于设定的上限或下限,蜂鸣器会发出报警的声音。5、程序框图LCD初始化: 检查LCD状态: 写指令到LCD: 写数据到LCD: 键盘扫描: 判断键盘是否有键按下 AD转换值比较:I2C启动: I2C终止: I2C接收: I2C发送: 六、程序清单:#include #include #define uint unsigned int#define uchar unsigned char#define _

5、Nop() _nop_()void KeyScan(); void Dispaly(uchar k); sbit P13=P13; /键盘sbit P12=P12;sbit P11=P11;sbit rs=P26; /lcdsbit rw=P25;sbit E=P27; sbit scl=P21; /i2csbit sda=P20;sbit bee=P23; bit ack; /*应答标志位*/uchar i2c_Buffer4; /数据缓冲uint Voltage=0,0,0,0; uchar table=U1: . ;uchar table2=U2: . ;uchar LCD_table=

6、U3: . V ; uchar LCD_table1=U4: . V ; uchar key,temp, kmax,kmin,kmax1,kmin1, kk, t, y=0; void delay(uint ms) uint i,j; for (j=0;jms;j+) for (i=0;i120;i+); void delayus(uint us) uint i,j; for (j=0;jus;j+) for (i=0;i12;i+); bit LCD_Busy_Check() /忙指令 bit Result; rs=0; rw=1; E=1; delayus(4); Result=(bit)

7、(P0&0x80); E=0; return Result; void write_command(uchar command) /写命令 while(LCD_Busy_Check() ) ; rs=0; rw=0; P0=command; E=1; E=0; void write_data(uchar data0) /写数据 while(LCD_Busy_Check() ) ; rs=1; rw=0; P0=data0; E=1; E=0; void LCD_Set_Position(uchar pos) /放置位置 write_command(pos | 0x80); void LCD_D

8、isplay_A_Line(uchar Line_Addr,uchar s) uchar i; LCD_Set_Position(Line_Addr); for(i=0;i16;i+) write_data(si); void LCD_Set_Position1(uchar pos) write_command(pos | 0xc0); void LCD_Display_A_Line1(uchar Line_Addr,uchar s) uchar i; LCD_Set_Position1(Line_Addr); for(i=0;i16;i+) write_data(si); void i2c_

9、start()/起始 sda=1; /*发送起始条件的数据信号*/ _Nop(); scl=1; _Nop(); /*起始条件建立时间大于4.7us,延时*/ _Nop(); _Nop(); _Nop(); _Nop(); sda=0; /*发送起始信号*/ _Nop(); /* 起始条件锁定时间大于4s*/ _Nop(); _Nop(); _Nop(); _Nop(); scl=0; /*钳住I2C总线,准备发送或接收数据 */ _Nop(); _Nop(); void i2c_stop()/终止 sda=0; /*发送结束条件的数据信号*/ _Nop(); /*发送结束条件的时钟信号*/

10、scl=1; /*结束条件建立时间大于4s*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); sda=1; /*发送I2C总线结束信号*/ _Nop(); _Nop(); _Nop(); _Nop(); void i2c_ack(bit a)/应答 if(a=0)sda=0; /*在此发出应答或非应答信号 */ else sda=1; _Nop(); _Nop(); _Nop(); scl=1; _Nop(); _Nop(); /*时钟低电平周期大于4s*/ _Nop(); _Nop(); _Nop(); scl=0; /*清时钟线,钳住I2C总线以便继续接收

11、*/ _Nop(); _Nop(); void i2c_write(uchar c)/写数据 unsigned char BitCnt; for(BitCnt=0;BitCnt8;BitCnt+) /*要传送的数据长度为8位*/ if(cBitCnt)&0x80)sda=1; /*判断发送位*/ else sda=0; _Nop(); scl=1; /*置时钟线为高,通知被控器开始接收数据位*/ _Nop(); _Nop(); /*保证时钟高电平周期大于4s*/ _Nop(); _Nop(); _Nop(); scl=0; _Nop(); _Nop(); sda=1; /*8位发送完后释放数据

12、线,准备接收应答位*/ _Nop(); _Nop(); scl=1; _Nop(); _Nop(); _Nop(); if(sda=1)ack=0; else ack=1; /*判断是否接收到应答信号*/ scl=0; _Nop(); _Nop(); uchar i2c_read()/读数据 uchar retc, BitCnt; retc=0; sda=1; /*置数据线为输入方式*/ for(BitCnt=0;BitCnt8;BitCnt+) _Nop(); scl=0; /*置时钟线为低,准备接收数据位*/ _Nop(); _Nop(); /*时钟低电平周期大于4.7s*/ _Nop()

13、; _Nop(); _Nop(); scl=1; /*置时钟线为高使数据线上数据有效*/ _Nop(); _Nop(); retc=retc1; if(sda=1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */ _Nop(); _Nop(); scl=0; _Nop(); _Nop(); return(retc); void ADC_PCF8591(uchar CtrlByte) /连续读入4路通道ad转换存入 i2c_Buffer uchar i,j; i2c_start(); i2c_write(0x90); /写 if(ack=0)return; i2c_wri

14、te(CtrlByte); if(ack=0)return; i2c_start(); i2c_write(0x91); /读 if(ack=0)return; i2c_read();/ 空读数据 i2c_ack(j); for(i=0;ikmax) temp=kmin;kmin=kmax;kmax=temp; if(aakmax ) bee=!bee; delayus(1); if(aakmin ) bee=!bee; delayus(100); void main() uchar i; bee=1; delay(15); /lcd初始化 write_command(0x38); /设置8位

15、格式,2行,5x7 delay(5); write_command(0x38); delay(5); write_command(0x38); delay(5); write_command(0x0e); delay(5); write_command(0x06); delay(5); / write_command(0x01); / delay(5);/ write_command(0x08); / delay(5); for (i=0;isizeof(table)-1;i+) write_data(tablei); delay(1); write_command(0xc0+0x01); /

16、换行 delay(5); for (i=0;isizeof(table2)-1;i+) write_data(table2i); delay(1); while(1) while(kk!=100) KeyScan(); ADC_PCF8591(0x04); Convert_To_Voltage(i2c_Buffer0); /第一个通道 com_(i2c_Buffer0); LCD_table3=Voltage2; LCD_table5=Voltage1; LCD_table6=Voltage0; Convert_To_Voltage(i2c_Buffer2); /第二通道 com_(i2c_B

17、uffer2); LCD_table13=Voltage2; LCD_table15=Voltage1; LCD_table16=Voltage0; LCD_Display_A_Line(0x08,LCD_table); LCD_Display_A_Line1(0x08,LCD_table1); void KeyScan() /键盘扫描程序 kk=0; P1=0xFF; P11=0; delay(1); temp=P1; temp&=0xF0; if(temp !=0xF0) switch(temp) case 0xe0:key=0;break; case 0xd0: key=1;break;

18、 case 0xb0: key=2;break; case 0x70: key=3;break; Dispaly(key); P1=0xFF; P12=0; delay(10); temp=P1; temp&=0xF0; if(temp !=0xF0) switch(temp) case 0xe0: key=4;break; case 0xd0: key=5;break; case 0xb0: key=6;break; case 0x70: key=7;break; if(key=7) kk=100; Dispaly(key); P1=0xFF; P13=0; delay(10); temp=

19、P1; temp&=0xF0; if(temp !=0xF0) switch(temp) case 0xe0: key=8;break; case 0xd0: key=9;break; case 0xb0: key=10;break; case 0x70: key=11;break; Dispaly(key); void Dispaly(uchar k) if(k=10) write_command(0x80+0x04); delay(1); y=2; if(k=11) write_command(0x80+0x06); delay(1); y=3; if(k=8) write_command

20、(0xc0+0x04); delay(1); y=1; if(k=9) write_command(0xc0+0x06); delay(1); y=4; if(k7) write_data(k+0x30);delay(200); if(y=1)kmin=k*51; if(y=2)kmax=k*51; if(y=3)kmax1=k/10*51; if(y=4)kmin1=k/10*51; kmax=kmax+kmax1; kmin=kmin+kmin1; 七、收获与体会:通过为期一周的单片机课程设计,我从中学到了很多。首先,通过该课程设计我们对单片机的应用有了进一步的了解,知道把课堂的理论知识结

21、合起来,加以设计,就能初步将设计方案的大纲列出来。其次,在起初开始设计的时候,有点无从入手,最后在关老师的循循善诱下逐渐开始尝试着入手。一开始写键盘的程序就遇到了问题,经过无数次尝试后终得到解决了。而在随后的其他程序编程中也是问题不断,通过对理论知识的学习和不断的尝试,最后也完成了本次”数字电压表”的设计。最后,谈谈本次课设的感受:虽然期间困难很多,但收获也不少,看似复杂的问题只要多加学习,多花时间钻研,总是会得到解决的;在设计中原理和各芯片的结构都非常重要,可以帮我们更好的理解它的工作原理,进而帮助我们更好地设计程序框图;本课程设计提高了我们的独立思考能力和实验实践操作能力,同时也让我们对单片机有了更多的兴趣。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1