八路电压巡检仪1602
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计总结
设计项目:八路电压巡检仪1602 班级
姓名
一·摘要:
基于单片机AT89C51带时钟的八路电压巡检系统,是一种经济实用的八通道巡回检测系统,该系统原理很简单,结构典型,成本低廉,适用于需要多点测量的场合,广泛用于工业生产和人们日常生活中,并显示出了巨大的经济可靠优越性。
八路电压巡检是以ADC0808芯片为核心实现的,适用于需要进行多测量点巡回检测的系统,可巡回检测多路测量信号,各通道可同时输入不同的分度号,采用最新无跳线技术,只需要设定仪表内部参数,即可将仪表从一种输入信号改为另一种输入信号。
二·设计要求:
通过proteus软件制作一个电压巡检仪,具体要求如下:(IO 口自定义)
1.开机后单片机依次对8路通道进行扫描,测量八路相应数值
2.测量电压为直流电压,范围在0~5V之间
3.要求测量分辨率在最小为0.01V
4.显示模版要求采用1602显示,先是如1—3.45
三·各个模块的展示:
1.单片机AT89C51:
D7D6D5D4D3D2D1D0XTAL2
18
XTAL1
19
ALE 30EA
31
PSEN 29RST
9
P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78
P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD
17
P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1
AT89C51
2. 1602液晶显示:
R S R W E N D 7
14
D 613D 512D 411D 310D 29D 18D 07
E 6
R W 5R S 4V S S 1V D D 2V E E
3
LCD1
LM016L
1602液晶显示
3.八路模拟量采集:
I N 1I N 2
I N 3I N 4I N 5
I N 6
I N 7
I N 8
2%
RV2
1k
68%RV3
1k
25%RV4
1k
10%
RV5
1k
72%
RV6
1k
85%
RV7
1k
97%RV8
1k
8%
RV9
1k
八路模拟量采集
4.模数转换器0808:
CLOCK ST EOC D0D1D2D3D4D5D6D7
OE
A B C ST IN1IN2IN3IN4IN5IN6IN7IN8OUT121ADD B 24ADD A 25ADD C 23VREF(+)12VREF(-)16
IN31IN42IN53IN64IN75START 6OUT58EOC 7OE
9
CLOCK 10OUT220OUT714OUT615OUT8
17
OUT418OUT319IN228IN127IN026ALE 22U2
ADC0808
模数转换器0808
四·设计全图:
R S R W E N CLOCK ST
EOC
D0D1D2D3D4D5D6D7
OE
A B C
CLOCK ST EOC OE
A B C ST D7D6D5D4D3D2D1D0RS R W EN
IN1IN2IN3IN4IN5IN6IN7IN8I N 1
I N 2
I N 3
I N 4
I N 5I N 6
I N 7
I N 8
XTAL2
18
XTAL1
19
ALE 30EA
31
PSEN 29RST
9
P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD7
32P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78
P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD
17
P3.6/WR 16P3.5/T115P2.7/A15
28
P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1
AT89C51
D 7
14
D 613D 512D 411D 310D 29D 18D 07E
6
R W 5R S 4V S S 1V D D 2V E E
3
LCD1
LM016L
23456789
1
RP1
RESPACK-8
50%
RV1
1k
OUT121ADD B 24ADD A 25ADD C 23VREF(+)12VREF(-)16
IN31IN42IN53IN64IN7
5
START
6OUT58EOC
7OE
9CLOCK 10OUT220OUT714OUT615OUT8
17OUT418OUT319IN228IN127IN026ALE 22U2
ADC0808
2%
RV2
1k
68%
RV3
1k
25%
RV4
1k
10%
RV5
1k
72%
RV6
1k
85%
RV7
1k
97%
RV8
1k
8%
RV9
1k
模数转换器0808
1602液晶显示八路模拟量采集
五·设计程序:
#include <reg52.h>
typedef unsigned char uint8; typedef unsigned int uint16; sbit RS=P2^0;//定义液晶RS 端 sbit RW=P2^1;//定义液晶RW 端 sbit EN=P2^2;//定义液晶EN 端 sbit BUSY=P0^7;//定义忙标志位
sbit CLOCK=P3^3;//为0809提供时钟脉冲 sbit ST=P3^4;//AD 开始转换信号 sbit EOC=P3^5;//转换结束信号 sbit OE=P3^6;//转换数据输出信号 sbit a =P3^0; //通道号选择 sbit b =P3^1;
sbit c =P3^2;
uint8 code word1[]={"The V oltage is:"};//字符串
uint8 disbuf[3];//设置显示缓冲区
uint16 count,getdat;
uint8 i=0,j=1;
void delay1ms(uint16 z)//延时函数
{
uint16 x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void wait()//等待繁忙标志
{
P0=0xff;
do
{
RS = 0;
RW = 1;
EN = 0;
EN = 1;
}while (BUSY == 1);
EN = 0;
}
void write_dat(uint8 dat)//写数据函数
{
wait();
EN = 0;
P0 = dat;
RS = 1;
RW = 0;
EN = 1;
EN = 0;
}
void write_com(uint8 com)//写命令函数
{
wait();
EN = 0;
P0 = com;
RS = 0;
RW = 0;
EN = 1;
EN = 0;
}
void write_string(uint8 addr_start, uint8 *p )//写字符串函数
{
write_com(addr_start);
while (*p != '\0')
{
write_dat(*p++);
}
}
void LCD1602_init()
{
write_com(0x38); // 设置16*2显示,5*7点阵,8位数据接口write_com(0x0C); // 设置显示器开、光标开、光标允许闪烁write_com(0x06); // 设置文字不动,光标自动右移
write_com(0x01); // 清屏
}
void timer0_init()//定时器初始化
{
TMOD= 0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
ET0=1;
EA=1;
TR0=1;
}
void channel() //通道选择
{
switch(j)
{
case 1: c=0;b=0;a=0; i=0;break;
case 2: c=0;b=0;a=1; i=1;break;
case 3: c=0;b=1;a=0; i=2;break;
case 4: c=0;b=1;a=1; i=3;break;
case 5: c=1;b=0;a=0; i=4;break;
case 6: c=1;b=0;a=1; i=5;break;
case 7: c=1;b=1;a=0; i=6;break;
case 8: c=1;b=1;a=1; i=7;break;
default: break;
}
}
void display()
{
write_com(0xc0);
write_dat(i+48);
delay1ms(2);
write_com(0xc1);
write_dat('-');
delay1ms(2);
write_com(0xc2);
write_dat(disbuf[0]+48);
delay1ms(2);
write_com(0xc3);
write_dat('.');
delay1ms(2);
write_com(0xc4);
write_dat(disbuf[1]+48);
delay1ms(2);
write_com(0xc5);
write_dat(disbuf[2]+48);
delay1ms(2);
write_com(0xc6);
write_dat('V');
}
void main()
{
timer0_init();
LCD1602_init();//1602液晶的初始化
write_string(0x80,word1);//第一行字符串显示
ST=0;
OE=0;
ST=1;
ST=0;
while(1)
{
channel();//调用通道选择函数
if(EOC==1)//转换结束
{
OE=1;
getdat=P1;
OE=0;
getdat=5.0/255*getdat*100;//基准电压除以256乘以转换得到的数据再乘以100(扩大一百倍)
disbuf[0]=getdat/100;
disbuf[1]=(getdat%100)/10;
disbuf[2]=getdat%10;
ST=1;
ST=0;
}
display();//调用显示函数
}
}
void timer0() interrupt 1 //中断函数
{
TH0=(65536-500)/256;
TL0=(65536-500)%256;
count++;
CLOCK=~CLOCK;
if(count==2000)//1S时间到
{
count=0;
j++;
if(j==9)
{
j=1;
}
}
}
六·心得体会:
随着电子技术的发展,特别是随着大规模集成电路的产生,,给人们的生活带来了根本性的变化。
随着社会的发展,单片机应用范围越来越广泛。
老师给我们这次考试不是笔试,而是真正的上机答辩,能够真正的去了解单片机的各个方面,让自己更加的去努力。
在最后的几周里,老师给我们布置了八道题,在以前的课堂上,真的是挺枯燥的,因为自己都是在课堂上听取老师讲的内容,很多的时候都不会明白,如今这次的考试,让我们去努力的去寻求其中的真正意思。
尽管最后还会有不少的困难,相信都会慢慢的解决。
这也让我了解以前我的许多问题:上课不够认真,很多老师讲解的内容都不太明白;以前对于一些小问题不会太过在意,结果会成为致命的错误;而且,以前做事情也太过粗心。
让我明白了做什么事都不会那么容易,,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。
通过这次单片机实习,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。
在大学总是觉得时间过的好快,在期末考试的这一个月里,感触蛮多的,失败并不要紧,最重要的是自己不会后悔自己的走过的路,道路上让自己感触很深的并不是很多,希望自己能够在今后的道路上勇敢的走下去。
再次感谢老师的辅导以及同学的帮助,是他们让我有了一个更好的认识,无论是学习还是生活,生活是实在的,要踏实走路。
课程设计时间虽然很短,但我学习了很多的东西,使我眼界打开,感受颇深。