课程设计多通道数字电压表设计_第1页
课程设计多通道数字电压表设计_第2页
课程设计多通道数字电压表设计_第3页
课程设计多通道数字电压表设计_第4页
课程设计多通道数字电压表设计_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

长沙学院长沙学院单片机课程设计说明书题目多通道数字电压表设计系(部)电子与通信工程系专业(班级)通信4班姓名曾鹏学号2009043417指导教师王新辉、谢明华、刘辉、马凌云起止日期2012年5月21日-6月1日《单片机原理及应用》课程设计任务书系(部):电信系专业:2009级通信工程指导教师:王新辉、谢明华、刘辉、马凌云课题名称多通道数字电压表设计设计内容及要求课题要求:1、用单片机AT89S51与ADC0808设计数字电压表,2、在12864液晶显示器上,用4位数字显示测量电压值,显示显示本人的姓名、班级和学号等信息。3、能够较准确地测量0—5V之间的直流电压,其测量最小分辨率为0.02V。4、轮流采样八路模拟信号,采样结果同时显示在12864上。设计工作量1、汇编或C51语言程序设计;2、程序调试,在Proteus上进行仿真;3、提交一份完整的课程设计说明书,包括封面,中文摘要,目录,正文(正文主要包括:设计原理、程序设计、程序分析、仿真分析、调试过程,调试结果等部分),参考文献、设计总结等。进度安排起止日期(或时间量)设计内容(或预期目标)备注第一天课题介绍,答疑,收集材料,C51介绍第二天设计方案论证,练习编写C51程序第三天~第六天程序设计第六天~第八天程序调试、仿真第九天~第十天系统测试并编写设计说明书教研室意见年月日系(部)主管领导意见年月日长沙学院课程设计鉴定表姓名曾鹏学号2009043417专业通信工程班级通信四班设计题目多通道数字电压表设计指导教师王新辉、谢明华、刘辉、马凌云指导教师意见:评定等级:教师签名:日期:答辩小组意见:评定等级:答辩小组长签名:日期:教研室意见:教研室主任签名:日期:系(部)意见:系主任签名:日期:说明课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;目录一.设计原理……………………… (1)设计背景:……………………… (2)原理展示:……………………… 二.元件介绍:……………………… 三.程序展示……………………… (1)主程序: ……………………… (2)AD转换程序:…………………… (3)LCD12864显示程序:…………… 四.仿真分析……………………… 五.总结体会 ……………………… 六.参考文献 ……………………… 七.参考程序 ……………………… 一.设计原理设计背景:数字电压表(DigitalVoltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字电压表,由精度高、抗干扰能力强,可扩展性强、集成方便。目前,由各种单片A/D转换器构成的数字电压表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。与此同时,由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。下文将重点介绍单片A/D转换器以及由它们构成的基于单片机的数字电压表的工作原理。原理展示:8路数字电压表主要利用A/D转换器,其过程为如下:先用A/D转换器对各路电压值进行采样,得到相应的数字量,再按数字量与模拟量成比例关系运算得到相应的模拟电压值,然后把模拟值通过数码管显示出来。设计时假设待测的输入电压为8路,电压值的范围为0——5v,要求能在LCD12864液晶屏2v。2V(5/255)。ADC0808具有8路模拟量输入端口,通过3位地址输入端能从8路中选择一路进行转换。如每隔一段时间依次轮流改变3位地址输入端的地址,就能依次对8路输入电压进行测量。LCD12864液晶屏显示采用软件译码动态显示。通过按键选择可8路循环显示,也可以单路循环。单路显示可通过按键选择所要显示的通道数。二.元件介绍:ADC0808ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。ADC0808是ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。内部结构ADC0808是CMOS单片型逐次逼近式A/D转换器,它有8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器。引脚功能(外部特性)ADC0808芯片有28条引脚,采用双列直插式封装,如右图所示。各引脚功能如下:1~5和26~28(IN0~IN7):8路模拟量输入端。8、14、15和17~21:8位数字量输出端。22(ALE):地址锁存允许信号,输入,高电平有效。6(START):A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。7(EOC):A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。9(OE):数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。10(CLK):97.htm"时钟脉冲输入端。要求时钟频率不高于640KHZ。12(VREF(+))和16(VREF(-)):参考电压输入端11(Vcc):主电源输入端。13(GND):地。23~25(ADDA、ADDB、ADDC):3位地址输入线,用于选通8路模拟输入中的一路极限参数电源电压(Vcc):6.5V控制端输入电压:-0.3V~15V其它输入和输出端电压:-0.3V~Vcc+0.3V贮存温度:-65℃~+150℃功耗(T=+25℃):875mW引线焊接温度:①气相焊接(60s):215℃;②红外焊接(15s):220℃抗静电强度:400V输出端注意out7为最低位-out0为最高位,out7-out0分别接单片机的P0.0到P0.7端。LCD1286412864是128*64点阵液晶模块的点阵数简称,业界约定俗成的简称LCD12864的驱动LCD12864在市面上主要分为两种,一种是采用st7920控制器的,它一般带有中文字库字模,价格略高一点。另一种是采用KS0108控制器,它只是点阵模式,不带字库。字符型和点阵型,字符型即内带中文字库的有PSB串并选择引脚。点阵型的只能做并行用,我们这次试验的要求就是点阵型,这决定了12864驱动的选择只能是并口的。LCD12864模块的20个引脚定义如下:1。Vss

逻辑电源地

2。VDD逻辑电源正5v

3。V0LCD驱动电压

4。RS数据/指令选择:高电平为数据,低电平为指令

5。R/W读/写选择:高电平为读数据,低电平为写数据

6。E读写使能,高电平有效,下降沿锁定数据

7。DB0数据输入输出引脚

8。DB1数据输入输出引脚

9。DB2数据输入输出引脚

10。DB3数据输入输出引脚

11。DB4数据输入输出引脚

12。DB5数据输入输出引脚

13。DB6数据输入输出引脚

14。DB7数据输入输出引脚

15。CS1片选择号,低电平时选择前64列

16。CS2片选择号,低电平时选择后64列

17。RET复位信号,低电平有效。

18。VEE输出-15v电源给V0提供驱动电源

19。A背光电源LED正极

20。K背光电源LED负极具体电路图如下:三.程序展示://**<程序名>:数字电压表 //**<功能>:使用LCD显示被检测电压,精度为0.05V,范围是0~5V。 //**<作者>:曾鹏 //**<完成时间>:20012年5月31日 //头文件及宏定义#include"includes.h"#include<LCD12864.h>#include<reg51.h>#defineTIME0H0x3C#defineTIME0L0xB0//*全局变量 *//*把电压显示在LCD上//显示第n路电压voidvShowVoltage(unsignedcharn,unsignedintuiNumber){ unsignedcharx,y; y=n/3*2; x=n%3*5; LCD_ShowNum(x,y,uiNumber/100,1); LCD_ShowChar(x+1,y,'.'); LCD_ShowNum(x+2,y,uiNumber%100,2); }//*主函数* voidmain(){ //unsignedintval0,val1; LCD_Init(); LCD_ClearScreen(); //显示通信四班曾鹏 LCD_ShowChinese(0,6,0); //通信四班 LCD_ShowChinese(1,6,1); LCD_ShowChinese(2,6,2); LCD_ShowChinese(3,6,3); LCD_ShowChinese(4,6,4);//曾鹏 LCD_ShowChinese(5,6,5); LCD_ShowString(12,4,"(V)");//电压单位(V) LCD_ShowNum(12,6,34,2); //学号3417 LCD_ShowNum(14,6,17,2); while(1) { vShowVoltage(0,uiADTransform(0)); vShowVoltage(1,uiADTransform(1)); vShowVoltage(2,uiADTransform(2)); vShowVoltage(3,uiADTransform(3)); vShowVoltage(4,uiADTransform(4)); vShowVoltage(5,uiADTransform(5)); vShowVoltage(6,uiADTransform(6)); vShowVoltage(7,uiADTransform(7)); }}//AD转换函数#include<reg51.h>sbitSTART=P3^4; //ATART,ALE接口。0->1->0:启动AD转换。sbitEOC=P3^3; //转换完毕由0变1.#defineOUTPORTP2//AD转换函数,返回转换结果。//转换结果是3位数,小数点在百位与十位之间。unsignedintuiADTransform(unsignedcharadd){ unsignedintuiResult; P1=add; START=1; //启动AD转换。 START=0; while(EOC==0); //等待转换结束。 uiResult=OUTPORT; //出入转换结果。 uiResult=(100*uiResult)/51; //处理运算结果。 START=1; //关闭AD转换。 START=0; returnuiResult;}//LCD12864显示程序(含字库和并口驱动)#include<reg51.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedchar#defineDATAP0//LCD12864数据线sbitRS=P3^5;//数据\指令选择sbitRW=P3^6;//读\写选择sbitEN=P3^7;//读\写使能sbitcs1=P3^0;//片选1sbitcs2=P3^1;//片选2 constunsignedcharcodeFout8x16[96][16]={ //!0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//"#0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//$%0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//&'0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//()0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//*+0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//,-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//./0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,//010x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//230x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//450x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//670x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//890x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//:;0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//<=0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//>?0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//@A0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//BC0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//DE0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//FG?0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//HI0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//JK0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//LM0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//NO0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//PQ0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//RS0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//TU0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//VW0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//XY0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Z[0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//\]0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//^_0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//`a0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//bc0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//de0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//fg0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//hi0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//jk0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//lm0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//no0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//pq0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//rs0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//tu?0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//vw0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//xy0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//z{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//|}0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//~0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};unsignedcharcodeFoutChinese[][32]={//"通",10x40,0x42,0x44,0xCC,0x00,0x00,0xF1,0x91,0x95,0xF9,0x95,0x93,0xF9,0x10,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0xBF,0x84,0x84,0xBF,0x94,0xA4,0x9F,0xC0,0x40,0x00,//"信",20x80,0x40,0x20,0xF8,0x07,0x24,0x24,0x24,0x25,0x26,0x24,0x24,0xB4,0x26,0x04,0x00,0x00,0x00,0x00,0xFF,0x00,0x01,0xFD,0x45,0x45,0x45,0x45,0x45,0xFD,0x01,0x00,0x00,//"四",30x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,0x00,0x7F,0x20,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00,//"班",40x84,0x84,0xFC,0x84,0x06,0xF4,0x00,0xFF,0x00,0x84,0x84,0xFC,0x84,0x86,0x04,0x00,0x20,0x60,0x3F,0x10,0x92,0x41,0x38,0x07,0x40,0x40,0x40,0x7F,0x40,0x60,0x40,0x00,//"曾",5 0x00,0x00,0xF0,0x11,0x52,0x14,0x10,0xF0,0x10,0x14,0x52,0x11,0xF8,0x10,0x00,0x00,0x00,0x00,0x01,0x01,0xFD,0x55,0x55,0x55,0x55,0x55,0xFF,0x05,0x01,0x00,0x00,0x00,//"鹏",6 0x00,0xFE,0x22,0xFE,0x00,0xFE,0x22,0xFE,0x00,0xFC,0x06,0x55,0x84,0x7E,0x04,0x00,0x40,0x3F,0x02,0x3F,0x40,0x3F,0x42,0x7F,0x10,0x13,0x12,0x12,0x5A,0x92,0x7E,0x00};字模取法截图/*延时程序*/voiddelay(uintz) { uinti,j; for(i=0;i<z;i++) for(j=0;j<110;j++);}/*状态检查,LCD是否忙*/voidCheckState() {uchardat;//状态信息(判断是否忙)RS=0;//数据\指令选择,D/I(RS)=“L”,表示DB7∽DB0为显示指令数据RW=1;//R/W=“H”,E=“H”数据被读到DB7∽DB0do{DATA=0x00;EN=1; //EN下降源 _nop_();//一个时钟延时 dat=DATA;EN=0;dat=0x80&dat;//仅当第7位为0时才可操作(判别busy信号)}while(!(dat==0x00));}/*写命令到LCD中*/voidSendCommandToLCD(ucharcom){CheckState();//状态检查,LCD是否忙RS=0; //向LCD发送命令。RS=0写指令,RS=1写数据RW=0;//R/W=“L”,E=“H→L”数据被写到IR或DRDATA=com; //com:命令EN=1;//EN下降源_nop_();_nop_();EN=0;}/*设置页0xb8是页的首地址*/voidSetLine(ucharpage) {page=0xb8|page;//10111xxx0<=page<=7设定页地址--X0-7,8行为一页64/8=8,共8页SendCommandToLCD(page);}/*设定显示开始行,0xc0是行的首地址*/voidSetStartLine(ucharstartline) {startline=0xc0|startline;//11000000SendCommandToLCD(startline);//设置从哪行开始:0--63,一般从0行开始显示}/*设定列地址--Y0-63,0x40是列的首地址*/voidSetColumn(ucharcolumn) {column=column&0x3f;//column最大值为64,越出0=<column<=63column=0x40|column;//01xxxxxxSendCommandToLCD(column);}/*开关显示,0x3f是开显示,0x3e是关显示*/voidSetOnOff(ucharonoff) { onoff=0x3e|onoff;//0011111x,onoff只能为0或者1 SendCommandToLCD(onoff);}/*写显示数据*/voidWriteByte(uchardat) {CheckState();//状态检查,LCD是否忙RS=1;//RS=0写指令,RS=1写数据RW=0;////R/W=“L”,E=“H→L”数据被写到IR或DRDATA=dat;//dat:显示数据EN=1;//EN下降源_nop_();_nop_();EN=0;}/*选择屏幕screen:0-全屏,1-左屏,2-右屏*/voidSelectScreen(ucharscreen) { switch(screen){case0:cs1=0;//全屏_nop_();_nop_();_nop_();cs2=0;_nop_();_nop_();_nop_();break;case1:cs1=0;//左屏_nop_();_nop_();_nop_();cs2=1;_nop_();_nop_();_nop_();break;case2:cs1=1;//右屏_nop_();_nop_();_nop_();cs2=0;_nop_();_nop_();_nop_();break;}}/*清屏*/voidLCD_ClearScreen() { uchari,j;SelectScreen(0); for(i=0;i<8;i++) //控制页数0-7,共8页 {SetLine(i); SetColumn(0);for(j=0;j<64;j++) //控制列数0-63,共64列 {WriteByte(0x00);//写点内容,列地址自动加1}} }/*初始化LCD*/voidLCD_Init() { CheckState(); SelectScreen(0); SetOnOff(0);//关显示 SelectScreen(0); SetOnOff(1);//开显示 SelectScreen(0); LCD_ClearScreen();//清屏 SetStartLine(0);//开始行:0}//显示8*8点阵//lin:行(0-7),column:列(0-127)//address:字模区首地址voidShow8x8(ucharlin,ucharcolumn,uchar*address){ uchari; if(column<64) { SelectScreen(1); } else { SelectScreen(2); column-=64; } SetLine(lin); SetColumn(column); for(i=0;i<8;i++) { if(column+i<64) { WriteByte(*(address+i)); } else { SelectScreen(2); SetLine(lin); SetColumn(column-64+i); WriteByte(*(address+i)); } }}//显示中文,chi为中文的号码单位x:16y:8voidLCD_ShowChinese(unsignedcharx,unsignedchary,unsignedcharchi){ unsignedchari; x*=16; if(x<64) { SelectScreen(1); } else { SelectScreen(2); x-=64; } SetLine(y); SetColumn(x); for(i=0;i<16;i++) { WriteByte(FoutChinese[chi][i]); } SetLine(y+1); SetColumn(x); for(i=0;i<16;i++) { WriteByte(FoutChinese[chi][i+16]); } }voidLCD_ShowChar(unsignedcharx,unsignedchary,unsignedcharchr){ x*=8; chr-=32; Show8x8(y,x,Fout8x16[chr]); Show8x8(y+1,x,Fout8x16[chr]+8);}voidLCD_ShowString(unsignedcharx,unsignedchary,unsignedchar*str){ while(*str!='\0'){LCD_ShowChar(x,y,*str);x+=1;str++;}}voidLCD_ShowNum(unsignedcharx,unsignedchary,unsignedintnum,unsignedcharwei)//wei数字占的位数{ unsignedchari,j=0; unsignedcharn[5]; if(wei>5)wei=5; n[0]=num/10000; n[1]=num%10000/1000; n[2]=num%1000/100; n[3]=num%100/10; n[4]=num%10; for(i=5-wei;i<5;i++) { LCD_ShowChar(x,y,n[i]+'0'); x++; }}四.仿真分析ADC0808,AT89C51,LCD12864等重要模块的功能实现,已经在元件介绍和程序注释中解释了,现在主要简析仿真图把这些功能的实现。如下图所示:总的硬件电路图显示屏: 由于本人技术水平有限,未能作出开场跳转,翻页显示等效果,如图所示,显示屏上显示的是8路电压最后一排是我的班级姓名和学号。 开始程序仿真时,拨动下图所示电压表(这只是其中一路)对应的电压就会变化,0~5V之间,电压以0.05V的变化量变化。8路电压表的AD转换采样和控制是通过3个ADD控制的。ADD控制 五.设计心得两周的单片机课程设计终于结束了,虽然很忙碌、很疲劳,但是收获很大。我几乎每天都专注辛劳到2、3点,唤回了我对单片机原理与应用这门课程的重新的认识,对单片机程序的努力追求,从瞎琢磨,东改改西换换让我学会了改写程序为己所用的目标。在理论学习的过程中我只是学到了关于单片机编程的简单知识,只能设计一些简单程序,本次课程设计让我随意挥洒,颇有收获。通过认真考虑,进行整体构思,我将理论付诸了实践。在做本次大作业的过程中,我感触最深的当数在各大网站查找资料。为了在有限的时间内,完成设计,并让自己的设计更加完善,更加符合标准,对于属于“非程序员”的我,找到一个可供自己参考的设计是不可少的,哈哈,终于找到一个类似的程序。我们是在作设计,但我们不是艺术家;他们可以抛开实际,尽情在幻想的世界里翱翔,而我们是“工程师”,一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,无法升级为设计。在这次课程设计作业的过程中由于在设计方面我没有经验,理论基础知识掌握得不牢固,在设计中难免会出现这样那样的问题,如:在显示数值时可能会出现误差,显示精度不够准确。由于程序是改写的,LCD12864显示频对于我来说就像一座艰巨的大山,找字库,试字码各种困难,在几个白天夜晚的鏖战之下逐步解决了。这些都暴露出了我知识的欠缺和经验的不足。对于我来说,收获最大的是方法和能力;那些分析和解决问题的能力。在整个课程设计的过程中,我发现我对单片机知识的掌握十分欠缺,有些知识都出现了脱节。总体来说,我觉得像课程设计这种类型的作业对我们的帮助还是很大的,它需要我们将学过的相关知识系统地联系起来,从中暴露出自身的不足,以待改进!

本次的课程设计,培养了我对单片机原理与应用的理解,提升了实践应用的能力;在设计的过程中还培养了我获取信息,知识融合的能力。

但是由于水平有限,难免会有错误,还望老师批评指正。(感谢王新辉老师的大力指导,感谢马凌云老师与谢明华老师的提点,当然这与刘辉老师平日的教导息息相关)六.参考文献—北京:电子工业出版社,2006.5ISBN7-121-02461-6;2.单片机C51程序设计教材与实验/祁伟等编著。—北京:北京航空航天大学出版社,2006.1ISBN7-81077-736-X;3.单片机微型计算机技术/刘国荣等编著。—北京:机械工业出版社.2000.1;4.单片机原理与应用/曾屹等编著。—长沙:中南大学出版社.2009.5(高等院校培养应用型人才电子技术类课程规划教。七.参考程序//**<程序名>:数字电压表 **//**<功能>:使用LCD显示被检测电压,精度为0.05V,范围是0~5V。 **//**<版本说明>:这是第2版,使用LCD显示。 **//**<作者>:程沛 **//**<完成时间>:2007年8月8日 **//**<联系方式>:superyongzhe@163 **//* *头文件及宏定义* *//* #include"includes.h"#defineTIME0H0x3C#defineTIME0L0xB0 *//* *全局变量**//* *unsignedcharuc_Clock=0; //定时器0中断计数bitb_DATransform=0;//把电压显示在LCD上voidvShowVoltage(unsignedintuiNumber){ unsignedcharucaNumber[3],ucCount; if(uiNumber>999) uiNumber=999; ucaNumber[0]=uiNumber/100; //把计算数字的每个位存入数组。 ucaNumber[1]=(uiNumber-100*(int)ucaNumber[0])/10; ucaNumber[2]=uiNumber-100*(int)ucaNumber[0]-10*ucaNumber[1]; for(ucCount=0;ucCount<3;ucCount++) { vShowOneChar(ucaNumber[ucCount]+48); //从首位到末位逐一输出。 if(ucCount==0) vShowOneChar('.'); }}//* *主函数**voidmain(){//<<<设置定时器0>>> TMOD=0x01; //定时器0,模式1。 TH0=TIME0H; TL0=TIME0L; TR0=1; //启动定时器。 ET0=1; //开定时器中断。 EA=1; //开总中断 vdInitialize(); vWriteCMD(0x84); //写入显示起始地址(第二行第一个位置) vShowChar("Voltage:"); vWriteCMD(0xC9); vShowChar("(V)"); while(1) { if(b_DATransform==1) { b_DATransform=0; vWriteCMD(0xC4); vShowVoltage(uiADTransform()); } }}//<<<<定时器0中断函数>>>>voidTime0()interrupt1{ if(uc_Clock==0) { uc_Clock=5; b_DATransform=1; } else uc_Clock--; TH0=TIME0H; //恢复定时器0。 TL0=TIME0L;}//* *********SMC1602驱动程序******** *//<<<<<<<<头文件及宏定义>>>>>>>#include"SMC1602.h"//<<<<把1个命令写入LCD>>>>>>>>voidvWriteCMD(unsignedcharucCommand) { vDelay(); //先延时。 LCDE=1; //然后把LCD改为写入命令状态。 LCDRS=0; LCDRW=0; LCDPORT=ucCommand; //再输出命令。 LCDE=0; //最后执行命令。}//<<<<<<<<<把1个数据写入LCD>>>>>>>>voidvWriteData(unsignedcharucData) { vDelay(); //先延时。 LCDE=1; //然后把LCD改为写入数据状态。 LCDRS=1; LCDRW=0; LCDPORT=ucData; //再输出数据。 LCDE=0; //最后显示数据。}voidvShowOneChar(unsignedcharucChar){ switch(ucChar) { case'':vWriteData(0x20);break; case'!':vWriteData(0x21);break; case'"':vWriteData(0x22);break; case'#':vWriteData(0x23);break; case'$':vWriteData(0x24);break; case'%':vWriteData(0x25);break; case'&':vWriteData(0x26);break; case'>':vWriteData(0x27);break; case'(':vWriteData(0x28);break; case')':vWriteData(0x29);break; case'*':vWriteData(0x20);break; case'+':vWriteData(0x2A);break; case'-':vWriteData(0x2D);break; case'/':vWriteData(0x2F);break; case'=':vWriteData(0x3D);break; case'<':vWriteData(0x3E);break; case'?':vWriteData(0x3F);break; case'.':vWriteData(0x2E);break; case':':vWriteData(0x3A);break; case'0':vWriteData(0x30);break; case'1':vWriteData(0x31);break; case'2':vWriteData(0x32);break; case'3':vWriteData(0x33);break; case'4':vWriteData(0x34);break; case'5':vWriteData(0x35);break; case'6':vWriteData(0x36);break; case'7':vWriteData(0x37);break; case'8':vWriteData(0x38);break; case'9':vWriteData(0x39);break; case'A':vWriteData(0x41);break; case'B':vWriteData(0x42);break; case'C':vWriteData(0x43);break; case'D':vWriteData(0x44);break; case'E':vWriteData(0x45);break; case'F':vWriteData(0x46);break; case'G':vWriteData(0x47);break; case'H':vWriteData(0x48);break; case'I':vWriteData(0x49);break; case'J':vWriteData(0x4A);break; case'K':vWriteData(0x4B);break; case'L':vWriteData(0x4C);break; case'M':vWriteData(0x4D);break; case'N':vWriteData(0x4E);break; case'O':vWriteData(0x4F);break; case'P':vWriteData(0x50);break; case'Q':vWriteData(0x51);break; case'R':vWriteData(0x52);break; case'S':vWriteData(0x53);break; case'T':vWriteData(0x54);break; case'U':vWriteData(0x55);break; case'V':vWriteData(0x56);break; case'W':vWriteData(0x57);break; case'X':vWriteData(0x58);

温馨提示

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

评论

0/150

提交评论