《基于单片机实现的数字电压表温度计设计.doc》由会员分享,可在线阅读,更多相关《基于单片机实现的数字电压表温度计设计.doc(16页珍藏版)》请在三一办公上搜索。
1、电子信息科学系单片机实验设计报告设计题目: 数字电压表、温度计 专 业: 09通信工程1班 学生姓名: 高诗 指导教师: 徐宏宏 摘 要:本课题主要采用AT89S51芯片和ADC0809芯片来完成一个简易的数字电压表,能够对输入的05V的模拟直流电压进行测量,并通过一个4位一体的7段LED数码管进行显示,测量误差约为0.02V。该电压表的测量电路主要由三个模块组成:A/D转换模块、数据处理模块及显示控制模块。A/D转换主要由芯片ADC0809来完成,它负责把采集到的模拟量转换为相应的数字量再传送到数据处理模块。数据处理则有芯片AT89S51来完成,其负责把ADC0809传送来的数字量经一定的数
2、据处理,产生相应的显示码送到显示模块进行显示;另外它还控制着ADC0809芯片的工作。显示模块主要由7段数码管及相应的驱动芯片(74HC245)组成,显示测量到的电压值。关键词:简易数字电压表、ADC0809、AT89S51。 目 录一总体设计41.电路设计41.1基础设计41.2分频设计52.程序设计5二系统测试141.测试仪器142.测试过程142.1测试条件142.2测试结果153.结果分析16三设计总结16四参考文献16一 总体设计1. 电路设计1.1基础设计利用单片机上的P0作为液晶的数据口,P0-2作为液晶的控制口线。利用P2口采集0809转换结束后的数据, P34; P33; P
3、32,P17分别作为0809的控制口线OE,EOC,START,ALE, P16; P15; P14;作为0809的c,b,a输入通道选择, P37,P36, P35作为按键控制0809的通道选择。 图11.2分频设计通过对单片机的30引脚ALE输出2MHz的时钟信号4分频,产生500KHz的时钟信号作为0809的制作频率,这里我们采用74LS74实现4分频图22. 程序设计#include #include #includetypedef unsigned int uint;typedef unsigned char uchar; /*/*IO引脚定义*/sbit LCD_RS=P10;/定
4、义引脚sbit LCD_RW=P11;sbit LCD_E=P12;/*宏定义*/#define LCD_Data P0#define Busy 0x80 /用于检测LCD状态字中的Busy标识/*函数声明*/void WriteDataLCD(unsigned char WDLCD);/写数据void WriteCommandLCD(unsigned char WCLCD,BuysC);/写命令unsigned char ReadDataLCD(void);/读数据unsigned char ReadStatusLCD(void);/读状态void LCDInit(void);/初始化voi
5、d DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);/相应坐标显示字节内容void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);/相应坐标开始显示一串内容void Delay5Ms(void);/延时void Delay400Ms(void);/延时/*写数据*/void WriteDataLCD(unsigned char WDLCD) ReadStatusLCD(); /检测忙 LCD_Da
6、ta = WDLCD; LCD_RS = 1; LCD_RW = 0; LCD_E = 0; /若晶振速度太高可以在这后加小的延时 LCD_E = 0; /延时 LCD_E = 1;/*写指令*/void WriteCommandLCD(unsigned char WCLCD,BuysC) /BuysC为0时忽略忙检测 if (BuysC) ReadStatusLCD(); /根据需要检测忙 LCD_Data = WCLCD; LCD_RS = 0; LCD_RW = 0; LCD_E = 0; LCD_E = 0;LCD_E = 1; /*读数据*/unsigned char ReadDat
7、aLCD(void) LCD_RS = 1; LCD_RW = 1; LCD_E = 0; LCD_E = 0; LCD_E = 1; return(LCD_Data);/*读状态*/unsigned char ReadStatusLCD(void) LCD_Data = 0xFF; LCD_RS = 0; LCD_RW = 1; LCD_E = 0; LCD_E = 0; LCD_E = 1; while (LCD_Data & Busy); /检测忙信号 return(LCD_Data);/*初始化*/void LCDInit(void) LCD_Data = 0; WriteComman
8、dLCD(0x38,0); /三次模式设置,不检测忙信号 Delay5Ms(); WriteCommandLCD(0x38,0); Delay5Ms(); WriteCommandLCD(0x38,0); Delay5Ms(); WriteCommandLCD(0x38,1); /显示模式设置,开始要求每次检测忙信号 WriteCommandLCD(0x08,1); /关闭显示 WriteCommandLCD(0x01,1); /显示清屏 WriteCommandLCD(0x06,1); /显示光标移动设置 WriteCommandLCD(0x0C,1); /显示开及光标设置/*按指定位置显示
9、一个字符*/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) Y &= 0x1; X &= 0xF; /限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; /当要显示第二行时地址码+0x40; X |= 0x80; /算出指令码 WriteCommandLCD(X, 0); /这里不检测忙信号,发送地址码 WriteDataLCD(DData);/*按指定位置显示一串字符*/void DisplayListChar(unsigned char X, unsigned char
10、Y, unsigned char code *DData) unsigned char ListLength; ListLength = 0; Y &= 0x1; X &= 0xF; /限制X不能大于15,Y不能大于1 while (DDataListLength=0x20) /若到达字串尾则退出 if (X 0;x-)for(y=100;y0;y-);void lcd_disp()dy=(dy*10000); LCDInit();DisplayListChar(0,0, Voltege :);DisplayOneChar( 0,1,T); DisplayOneChar( 1,1,D); Di
11、splayOneChar( 2,1,td%10+0x30); DisplayOneChar( 9,1,(unsigned long)dy/10000+0x30);DisplayOneChar( 10,1,.); DisplayOneChar( 11,1,(unsigned long)dy/1000%10+0x30);DisplayOneChar( 12,1,(unsigned long)dy/100%10+0x30);DisplayOneChar( 13,1,(unsigned long)dy/10%10+0x30);DisplayOneChar( 14,1,(unsigned long)dy
12、%10+0x30);DisplayOneChar( 15,1,V);void lcd_disp0()dy=(dy*1000000-2400000)*0.091+5000;LCDInit();DisplayListChar(0,0, Tempreture :);DisplayOneChar( 0,1,T); DisplayOneChar( 1,1,D); DisplayOneChar( 2,1,td%10+0x30); / DisplayOneChar( 6,1,(unsigned long)dy/1000000+0x30); if(dy0) DisplayOneChar( 7,1,(unsig
13、ned long)dy/100000%10+0x30); DisplayOneChar( 8,1,(unsigned long)dy/10000%10+0x30); DisplayOneChar( 9,1,(unsigned long)dy/1000%10+0x30);DisplayOneChar( 10,1,.); DisplayOneChar( 11,1,(unsigned long)dy/100%10+0x30);DisplayOneChar( 12,1,(unsigned long)dy/10%10+0x30);/DisplayOneChar( 13,1,(unsigned long)
14、dy%10+0x30);DisplayOneChar( 14,1,0xdf);DisplayOneChar( 15,1,C); void main() date=0; td=0; ALE=0; START=0; OE=0; a=0;b=0;c=0; delay(500); LCDInit(); dy=0000; DisplayListChar(0,0, Tempreture :); while(1) if(S1=0)delay(500);td=td+1;if(td8)td=0; if(S2=0)delay(500);if(td0)td=td-1; if(S3=0)delay(500);td=0
15、; if(td=0)a=0;b=0;c=0; if(td=1)a=1;b=0;c=0;if(td=2)a=0;b=1;c=0;if(td=3)a=1;b=1;c=0;if(td=4)a=0;b=0;c=1;if(td=5)a=1;b=0;c=1;if(td=6)a=0;b=1;c=1;if(td=7)a=1;b=1;c=1; ALE=0;START=0;ALE=1; START=1; ALE=0;START=0; while(EOC=0); OE=0; OE=1; date=adc0809; OE=0; if(td=0)dy=date*4.37/256;lcd_disp0(); if(td=1
16、)dy=date*4.37/256;lcd_disp();if(td=2)dy=date*4.37/256;lcd_disp();if(td=3)dy=date*4.37/256;lcd_disp();if(td=4)dy=date*4.37/256;lcd_disp();if(td=5)dy=date*4.37/256;lcd_disp();if(td=6)dy=date*4.37/256;lcd_disp();if(td=7)dy=date*4.37/256;lcd_disp(); 二 系统测试1. 测试仪器VC890D万用表;单片机2. 测试过程2.1测试条件图32.2测试结果(1)通道
17、0,温度测量图4(2)通道1电压测量通过调节滑动变阻器,改变模拟量的输入,液晶上显示对应的模拟量,实现了模数转化。图53. 结果分析 通过观察实验现象,虽然能整体能正常工作,也能通过按键实现通道的选择,但每次开机后温度与实际室温有较大出入,调整后才能正常工作。三 设计总结设计课程使我们增长了见识,熟悉了一些基础芯片的使用,也了解了CPU处理技术的开发平台。而实际动手操作使我们对本专业的研究领域产生了浓厚的兴趣,将动手制作一件成功且实用的科技作品视为莫大的骄傲,更是对自己能力的肯定。四 参考文献1何桥.单片机原理及应用,2007.122阎石.数字电子设计基础,2006.53杨素行.模拟电子技术基础简明教程。2005.10