资源描述
单片机应用设计课程设计论文
——八路电压循回检测系统
院系:信息工程学院
专业: 通信工程
班级: 0942
姓名: 闫彪
学号: 25
指引教师:
12 月 23日
目录
第一章 绪论 3
1.1 课程设计目及意义 3
1.2 单片机应用及前景 3
第二章 系统总体方案 4
2.1 设计规定 4
2.2 硬件系统设计 4
2.2.1 总体方案设计 4
2.2.2 系统总图如下 4
2.3 元件简介 5
2.3.1 AT89C51 单片机 5
2.3.2 ADC0808数模转换简介 6
2.3.3 74LS595简介 7
第三章 软件编程 9
3.1 仿真程序 9
3.2 仿真成果 11
3.3 测试程序 11
第四章 Proteus和Keil软件简介 15
4.1 Proteus简介 15
4.1.1 Proteus主界面 16
4.1.2 电路仿真 16
4.2 Keil 简介 17
4.2.1 Keil软件简介: 17
4.2.2 Keil 软件用法 18
第五章 总结与展望 21
第六章 道谢 22
参照文献 23
附录— 24
附录二 25
第一章 绪论
1.1 课程设计目及意义
1. 单片机原理及应用是一门专业基本课,是一门实践性很强课程,单片机课程设计规定将所学理论知识通过实践加强理解和结识,提高学生们单片机接口电路设计能力和动手能力。初步掌握简朴单片机应用系统设计、制作、调试办法。提高动手实践能力、提高科学思维能力。
2.使学生具备作为电子与信息技术生产、服务和管理领域工作额高素质,同步具备高档专门技术人才所应具备电子设计自动化基本知识、基本技能。
3.通过单片机控制课程设计,学生可以掌握智能化控制系统及电子产品开发普通过程,其中涉及系统整体设计、硬件电路调试、软件编程调试、成果数据分析等多方面内容。
1.2 单片机应用及前景
单片微型计算机简称单片机,是典型嵌入式微控制器(Microcontroller Unit),惯用英文字母缩写MCU表达单片机,它最早是被用在工业控制领域。单片机由芯片内仅有CPU专用解决器发展而来。最早设计理念是通过将大量外围设备和CPU集成在一种芯片中,使计算机系统更小,更容易集成进复杂而对体积规定严格控制设备当中。单片机比专用解决器更适合应用于嵌入式系统,因而它得到了最多应用。事实上单片机是世界上数量最多计算机。当代人类生活中所用几乎每件电子和机械产品中都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。而个人电脑中也会有为数不少单片机在工作。汽车上普通配备40多部单片机,复杂工业控制系统上甚至也许有数百台单片机在同步工作!单片机数量不但远超过PC机和其她计算总和,甚至比人类数量还要多。
核心词:GSM GS100 AT89C51 Voltage circuit testing 电压巡回检测Single-chip microcomputer 单片机
第二章 系统总体方案
2.1 设计规定
1.用AT89C51与AD0C808构成8路巡回检测系统。
2.采样周期为1秒,即间隔1秒对个通道轮流采集一种数据,每个通道均采用1024个数据。采集数据可存储在外部RAM中,数据存储顺序应于通道号一致
3.A/D转换结束检测方式,可采用延时、查询和中断任意一种方式。
4.数字量由单片机转换成十进制数后送到LED显示屏显示。
2.2 硬件系统设计
2.2.1 总体方案设计
显示屏
数据存储器
单片机
检测系统
2.2.2 系统总图如下
图2-1(系统总图)
2.3 元件简介
2.3.1 AT89C51 单片机
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)低电压,高性能CMOS8位微解决器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器单片机。单片机可擦除只读存储器可以重复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业原则MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMELAT89C51是一种高效微控制器,AT89C2051是它一种精简版本。AT89C单片机为诸多嵌入式控制系统提供了一种灵活性高且价廉方案。
1、 重要特性
l 与MCS-51 兼容
l 4K字节可编程闪烁存储器,寿命:1000写/擦循环,数据保存时间:
l 全静态工作:0Hz-24Hz
l 三级程序存储器锁定
l 128*8位内部RAM
l 32可编程I/O线
l 两个16位定期器/计数器
l 5个中断源
l 可编程串行通道
l 低功耗闲置和掉电模式
l 片内振荡器和时钟电路
图2-2(AD89C51引脚图)
2、管脚阐明
VCC:供电电压。
GND:接地。
P0口:P0口为一种8位漏级开路双向I/O口,每脚可吸取8TTL门电流。当P1口管脚第一次写1时,被定义为高阻输入。P0可以用于外部程序数据存储器,它可以被定义为数据/地址第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必要被拉高。
P1口:P1口是一种内部提供上拉电阻8位双向I/O口,P1口缓冲器能接受输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉缘故。在FLASH编程和校验时,P1口作为第八位地址接受。
P2口:P2口为一种内部上拉电阻8位双向I/O口,P2口缓冲器可接受,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因而作为输入时,P2口管脚被外部拉低,将输出电流。这是由于内部上拉缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址高八位。在给出地址“1”时,它运用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器内容。P2口在FLASH编程和校验时接受高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻双向I/O口,可接受输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉缘故。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期高电平时间。
2.3.2 ADC0808数模转换简介
ADC0808是采样辨别率为8位、以逐次逼近原理进行模/数转换器件。其内部有一种8通道多路开关,它可以依照地址码锁存译码后信号,只选通8路模仿输入信号中一种进行A/D转换。ADC0808是ADC0809简化版本,功能基本相似。普通在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。
图2-3(ADC0808管脚图)
1. 内部构造
ADC0808是CMOS单片型逐次逼近式A/D转换器,它有8路模仿开关、地址锁存与译码器、比较器、8位开关树型A/D转换器。
2.引脚功能
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):时钟脉冲输入端。规定期钟频率不高于640KHZ。
12(VREF(+))和16(VREF(-)):参照电压输入端
11(Vcc):主电源输入端。
13(GND):地。
23~25(ADDA、ADDB、ADDC):3位地址输入线,用于选通8路模仿输入中一路
2.3.3 74LS595简介
图2-4(74LS595管脚图)
引脚功能:
O1~O7(1~7脚): 八路并行输出端,可以直接控制数码管8个段。
QH(9脚):级联输出端,接下一种SER
SER(14脚):串行数据输入端
/SRCLR(10脚):低电平时将移位寄存器数据清零,普通将她接VCC
SRCLK(11脚):上升沿时数据寄存器数据移位,(脉冲宽度普通选微秒级)
RCLK(12脚):上升沿时移位寄存器数据进入数据存储寄存器。
/G(13脚):高电平时禁止输出(高阻态),可以用一引脚控制达到闪烁和熄灭功能,也可直接接低电平。
第三章 软件编程
3.1 仿真程序
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define ad_con P2
#define addata P0
#define disdata P1
#define uchar unsigned char
#define uint unsigned int
uchar number=0x00;
sbit disx=disdata^7;
sbit ALE=P2^3;
sbit START=P2^4;
sbit OE=P2^5;
sbit EOC=P3^7;
sbit KEY1=P3^5;
sbit KEY2=P3^6;
sbit FLAG=PSW^7;
void tongdao()
ucharcode dis_7[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7};
uchar data ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uint data dis[5]={0x00,0x00,0x00,0x00,0x00};
//=延时子函数=//
void tongdao()
{float l;
uchar k,i;
int g;
do{
if(KEY2==0)
{delay(5);
if(KEY2==0)
while(!KEY2);
{number++;if(number==8)number=0;}
}
dis[3]=number;
i=ad_data[number];
l=i*1.0/255*500;
g=l;
dis[0]=g%10;
g=g/10;
dis[1]=g%10;
dis[2]=g/10;
for(k=0;k<4;k++)
{isdata=dis_7[dis[k]];
if(k==2){disx=0;}
P3=scan_con[k];
delay(5);
P3=0xff;}
}while(KEY1==1);
} void scan()
{ float l;
uchar k,n,m,i;
int h,g;
dis[3]=0x00;
for(n=0;n<8;n++)
{ i=ad_data[n];
l=i*1.0/255*500;
g=(int)l;
dis[0]=g%10;
g=g/10;
dis[1]=g%10;
dis[2]=g/10;
for(h=0;h<30;h++)
{for(k=0;k<4;k++)
{ if(KEY2==0)
{tongdao();}
disdata=dis_7[dis[k]];
if(k==2){disx=0;}
P3=scan_con[k];
delay(5);
P3=0xff;}}
dis[3]++;
if(dis[3]==8){dis[3]=0;}
} }
//=AD 转换子函数=//
test()
{uchar m;
uchar s=0x00;
ad_con=s;
for(m=0;m<8;m++)
{ALE=1;
_nop_();_nop_();
ALE=0;
START=1;
_nop_();_nop_();
START=0;
_nop_();_nop_();
_nop_();_nop_();_nop_();
while(EOC==0);
OE=1;
ad_data[m]=addata;
OE=0;
s++;
ad_con=s;}
ad_con=0x00;}
//=主函数=//
main()
{P0=0XFF;
P2=0X00;
P1=0XFF;
P3=0XFF;
while(1)
{test();
scan();}
3.2 仿真成果
图3-1(仿真成果)
3.3 测试程序
1.#include<reg51.h>
unsigned char temp;
unsigned char dispBuffer1[4]={0x00,0x01,0x02,0x03};
unsigned char dispcode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit oclk=P3^2;
//===============//
void delay1ms(unsigned int ms)//延时1毫秒(不够精准)
{unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<120;j++);
}
//==============//
void main()
{
unsigned char w;
TMOD=0x00;
while(1)
{
for (w=4;w<8;w++)
{
SBUF=dispcode[w];
while(TI==0);
// delay1ms(100);
TI=0;
}
oclk=0;
delay1ms(1);
oclk=1;
delay1ms(1);
}
}
2.#include<reg52.h>
#include<intrins.h>
unsigned char temp;
unsigned int tempdata;
unsigned char dispcode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit oclk=P3^2;
unsigned char TempBuffer1[5];
sbit start=P1^0;
sbit oe=P1^1;
sbit clk=P1^2;
sbit ale=P1^3;
sbit eoc=P1^4;
//===============//
void delay1ms(unsigned int ms)//延时1毫秒(不够精准)
{unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<120;j++);
}
//==============//
void adcconver()
{
ale=1;
_nop_();
ale=0;
_nop_();
start=1;
_nop_();
start=0;
_nop_();
while(eoc==0);
oe=1;
temp=P0;
oe=0;
}
//===============// 测量电压最大值为5V
void valconver()
{
TempBuffer1[1]=temp / 51;
TempBuffer1[4]=temp % 51;
tempdata=TempBuffer1[4] * 10;
TempBuffer1[2]=tempdata / 51;
TempBuffer1[4]=tempdata % 51;
tempdata=TempBuffer1[4] * 10;
TempBuffer1[3]=tempdata / 51;
/*TempBuffer1[1]=temp/100;
TempBuffer1[4]=temp%100;
TempBuffer1[2]=TempBuffer1[4]/10;
TempBuffer1[3]=TempBuffer1[4]%10; */
}
//=============//
void main()
{
unsigned char w;
TempBuffer1[0]=0X00;
TMOD=0x02;
TH0=0XFF;
TL0=0XFF;
TR0=1;
ET0=1;
EA=1;
while(1)
{
P2=0X00;
adcconver();
valconver();
for (w=0;w<4;w++)
{
SBUF=dispcode[TempBuffer1[w]];
while(TI==0);
// delay1ms(100);
TI=0;
}
oclk=0;
delay1ms(1);
oclk=1;
delay1ms(1);
}
}
//===============//
void timerupt() interrupt 3
{
clk=~clk;
}
//===/
第四章 Proteus和Keil软件简介
4.1 Proteus简介
Proteus软件是英国Labcenter electronics公司出版EDA工具软件(该软件中华人民共和国总代理为广州风标电子技术有限公司)。它不但具备其他EDA工具软件仿真功能,还能仿真单片机及外围器件。它是当前最佳仿真单片机及外围器件工具。虽然当前国内推广刚起步,但已受到单片机兴趣者、从事单片机教学教师、致力于单片机开发应用科技工作者青睐。Proteus是世界上知名EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品完整设计。是当前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一设计平台,其解决器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,即将增长Cortex和DSP系列解决器,并持续增长其她系列解决器模型。在编译方面,它也支持IAR、Keil和MPLAB等各种编译器
Proteus软件具备其他EDA工具软件(例:multisim)功能。这些功能是: 1.原理布图 2.PCB自动或人工布线 3.SPICE电路仿真 革命性特点 1.互动电路仿真 顾客甚至可以实时采用诸如RAM,ROM,键盘,马达,LED,LCD,AD/DA,某些SPI器件,某些IIC器件。 2.仿真解决器及其外围电路 可以仿真51系列、AVR、PIC、ARM、等惯用主流单片机。还可以直接在基于原理图虚拟原型 上编程,再配合显示及输出,能看到运营后输入输出效果。配合系统配备虚拟逻辑分析仪、示波器等,Proteus建立了完备电子设计开发环境。
4.1.1 Proteus主界面
图4-1(Proteus界面)
选取元件:P按钮
图4-2(查找器件)
4.1.2 电路仿真
1. 打开原理图
图4-3(打开原理图)
2. 在PROTEUS绘制好原理图后,调入已编译好目的代码文献:*.HEX.双击U1
图4-4(添加主程序)
点击运营按钮,运营程序
图4-5(程序运营成果)
4.2 Keil 简介
4.2.1 Keil软件简介:
Keil C51是美国Keil Software公司出品51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、构造性、可读性、可维护性上有明显优势,因而易学易用。Keil提供了涉及C编译器、宏汇编、连接器、库管理和一种功能强大仿真调试器等在内完整开发方案,通过一种集成开发环境(uVision)将这些某些组合在一起。运营Keil软件需要WIN98、NT、WIN、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你不二之选,虽然不使用C语言而仅用汇编语言编程,其以便易用集成强大软件仿真调试工具也会令你事半功
Keil 软件是众多单片机应用开发先进软件之一,它集编辑,编译,仿真于一体,支持汇编,汇编语言和 C 语言程序设计,界面和谐,易学易用。
4.2.2 Keil 软件用法
(1)进入Keil后,屏幕如下图所示。几秒钟后浮现编辑界
图4-6(Keil C51后编辑界面)
(2)新建工程
单击Project菜单,在弹出下拉菜单中选中New Project选项
图4-7(新建工程)
然后选取你要保存途径,输入工程文献名字,例如保存到E盘YB文献夹里,工程文献名字为YB
如下图所示,然后点击保存.
图4-8(项目文献存储位置)
这时会弹出一种对话框,规定你选取单片机型号,你可以依照你使用单片机来选取,keil c51几乎支持所有51核单片机,我这里还是以人们用比较多Atmel 89C51来阐明,如下图所示,选取89C51之后,右边栏是对这个单片机基本阐明,然后点击拟定.
图4-9(选取单片机型号)
完毕上一环节后,屏幕如下图所示
图4-10
到当前为止,咱们还没有编写一句程序,下面开始编写咱们第一种程序。
(2) 添加程序
图4-11(添加C程序)
生成.Hex文献
图4-12
单击拟定
图4-13(编译生成.Hex文献)
再点击编译按钮即可生成.Hex文献
第五章 总结与展望
一方面,在本次课程设计中,我感觉到了设计高兴,并且学到了许多关于单片机知识,在实际安装调试过程中,我遇到了许多困难,当通过教师指引咱们都完毕了本次课设,也通过这次课程设计让我对单片机产生了浓厚兴趣,使我懂得单片机在咱们生活当中是多么重要,尽量把所学到知识用到生活中去。
另一方面,通过本次单片机课程设计,让我收获诸多。我实实在在理解到了单片机是一门应用性和实践性很强学科,并且对单片机最小系统也有了更深层掌握。除此之外,通过这次课程设计我也熟悉了PROTUES软件和Keil软件。
最后,这次课程设计提高了我对综合知识整顿和提纯能力,把所学知识进一步理解和记忆,为后来工作和学习打下基本。在实验过程中,我遇到了诸多问题,人们在一起研究,有时会由于一种问题而争论不休,但当问题解决时候又觉得非常有成就感,似乎把之前所付出辛苦都忘在了脑后。我学会了团结互助,学会了团队力量,也历练了自己,提高了自己自身修养与素质。在实验中也得到了工作经验,相信自己后来可以把每一件事都做好。
第六章 道谢
本次课程设计要感谢罗薇、吉李满教师,从课设开始到结束,教师都始终在指引咱们,咱们在这个过程和中遇到了诸多问题,感谢教师给咱们解说,让咱们真正学到了知识,要不是教师们协助,咱们不也许顺利完毕本次课程设计,再次向罗薇教师、吉李满教师表达感谢!
参照文献
[1] 张毅刚,《单片机原理及应用》,高等教诲出版社,12月;
[2] 李广弟等。单片机基本[M].北京航空航天出版社,.
[3] 王东峰等。单片机C语言应用100例[M].电子工业出版社,.
[4] 陈海宴.51单片机原理及应用[M].北京航空航天大学出版社,.
[5] 李平等.单片机入门与开发[M].机械工业出版社,.
附录—
附录二
所用c语言程序:
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define ad_con P2
#define addata P0
#define disdata P1
#define uchar unsigned char
#define uint unsigned int
uchar number=0x00;
sbit disx=disdata^7;
sbit ALE=P2^3;
sbit START=P2^4;
sbit OE=P2^5;
sbit EOC=P3^7;
sbit KEY1=P3^5;
sbit KEY2=P3^6;
sbit FLAG=PSW^7;
void tongdao()
ucharcode dis_7[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7};
uchar data ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uint data dis[5]={0x00,0x00,0x00,0x00,0x00};
//=延时子函数=//
void tongdao()
{float l;
uchar k,i;
int g;
do{
if(KEY2==0)
{delay(5);
if(KEY2==0)
while(!KEY2);
{number++;if(number==8)number=0;}
}
dis[3]=number;
i=ad_data[number];
l=i*1.0/255*500;
g=l;
dis[0]=g%10;
g=g/10;
dis[1]=g%10;
dis[2]=g/10;
for(k=0;k<4;k++)
{isdata=dis_7[dis[k]];
if(k==2){disx=0;}
P3=scan_con[k];
delay(5);
P3=0xff;}
}while(KEY1==1);
} void scan()
{ float l;
uchar k,n,m,i;
int h,g;
dis[3]=0x00;
for(n=0;n<8;n++)
{ i=ad_data[n];
l=i*1.0/255*500;
g=(int)l;
dis[0]=g%10;
g=g/10;
dis[1]=g%10;
dis[2]=g/10;
for(h=0;h<30;h++)
{for(k=0;k<4;k++)
{ if(KEY2==0)
{tongdao();}
disdata=dis_7[dis[k]];
if(k==2){disx=0;}
P3=scan_con[k];
delay(5);
P3=0xff;}}
dis[3]++;
if(dis[3]==8){dis[3]=0;}
} }
//=AD 转换子函数=//
test()
{uchar m;
uchar s=0x00;
ad_con=s;
for(m=0;m<8;m++)
{ALE=1;
_nop_();_nop_();
ALE=0;
START=1;
_nop_();_nop_();
START=0;
_nop_();_nop_();
_nop_();_nop_();_nop_();
while(EOC==0);
OE=1;
ad_data[m]=addata;
OE=0;
s++;
ad_con=s;}
ad_con=0x00;}
//=主函数=//
main()
{P0=0XFF;
P2=0X00;
P1=0XFF;
P3=0XFF;
while(1)
{test();
scan();}
展开阅读全文