重庆邮电大学自动化电气与工程类 工程实训实验报告单片机最小系统实验报告.docx
《重庆邮电大学自动化电气与工程类 工程实训实验报告单片机最小系统实验报告.docx》由会员分享,可在线阅读,更多相关《重庆邮电大学自动化电气与工程类 工程实训实验报告单片机最小系统实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
![重庆邮电大学自动化电气与工程类 工程实训实验报告单片机最小系统实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/23/706124d8-46b6-432a-a87c-2509738a6c5b/706124d8-46b6-432a-a87c-2509738a6c5b1.gif)
重庆邮电大学自动化电气与工程类工程实训实验报告单片机最小系统实验报告
自动化电气与工程类
工程实训实验报告
——单片机最小系统实验报告
基于PROTEUS仿真平台的51系列单片机
最小系统的设计、应用实验
一、实验目的和性能指标
1、实验目的
学习掌握PROTEUS仿真软件的基本使用,熟悉KEIL软件的使用。
并且对单片机最小系统进行仿真设计,实现1.在电路上实现秒表计时、暂停、清零功能。
2.同时实现计时器功能,显示时、分、秒,能够修改时、分、秒。
3.用单片机及外围接口电路实现对键盘的扫描,并用八位数码管显示结果。
2、性能指标
秒表计时要求能精确至0.01秒,计时器要求能循环显示,格式为时—分—秒,并能实现时间的调整,包括时间的增加和减小,对键盘的扫描实现4*4矩阵键盘的扫描,并能循环显示。
二、硬件系统设计
STC89c51单片机的硬件资源包含:
一个8位CPU、振荡器和时钟电路、至少128字节的内部数据存储器,可寻址外部程序存储器和数据存储器个64k字节,21个特殊功能寄存器,4个并行I/O接口,2个16位定时/计数器,至少5个中断源,提供两级中断优先级,可实现两级中断服务程序嵌套。
具有有位寻址功能,有较强的布尔处理能力。
各功能单元(包括IO端口和定时器/计数器等)都由特殊功能寄存器(SFR)集中管理。
中央处理器、ROM、RAM、定时/计数器和I/O口等,各个功能由内部的总线连接起来,从而实现数据通信。
单片机最小系统主要由电源、复位、振荡电路以及扩展部分等部分组成。
1、单片机最小系统
单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。
主控芯片选取AT89C52芯片,因其具有良好的性能及稳定性,价格便宜应用方便。
晶振选取12MHz,晶振旁电容选取30pF。
采用按键复位电路,电阻分别选取10KΩ,电容选取10μF。
2、键盘接口电路
共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行采用端口P3.0~P3.3,四列采用端口P3.4~P3.7,通过8个端口的的高低电平完成对矩阵键盘的控制和扫描。
通过对16个按键进行编码,从而得到键盘的口地址,我们就可以得到是哪个键按下,从而完成键盘的功能。
3、数码管显示电路
采用八位一体的数码管对计算数据和结果进行显示,这里选取共阴极数码管,使用P0口对数码管进行段选控制,用P2口对数码管进行位选控制,方便实现动态显示的效果。
三、系统设计方案
按照系统设计的功能的要求,初步确定设计系统由单片机主控模块、八位数码管显示模块、键扫描接口电路共三个主要模块组成。
主控芯片使用AT89C52单片机,键盘电路采用4*4矩阵键盘电路,并附有三位功能选择键模块,显示模块采用八位一体共阴极数码管。
51系列单片机定时器的结构及工作原理:
组成:
两个16位的定时器T0和T1,以及他们的工作方式寄存器TMOD和控制寄存器TCON等组成。
内部通过总线与CPU相连。
定时器T0和T1各由两个8位特殊功能寄存器TH0、TL0、TH1、TL1构成。
工作方式寄存器TMOD:
用于设置定时器的工作模式和工作方式;控制寄存器TCON:
用于启动和停止定时器的计数,并控制定时器的状态;单片机复位时,两个寄存器的所有位都被清0。
四、软件仿真
单片机最小系统电路图如图
五、程序
#include
#defineucharunsignedchar
#defineuintunsignedshortint
sbitp14=P1^4;
sbitp15=P1^5;
sbitp16=P1^6;
sbitp17=P1^7;
ucharcodetable1[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0,0x40};//定义显示段码
ucharnum,temp;
shortintx1=0,x2=0;
ucharoperateFlag=0,a=1,b=1,c=1,d=1,e=1,f=1,g=1,h=1;
bitresult=0,keyDown=0,affirm=0;
uchartime=0,seconds=0,minutes=0,hours=0,choice=0;
voiddelay(uchark)//定义延时函数
{
uchari,j;
for(i=k;i>0;i--)
for(j=124;j>0;j--);
}
voidTIME0_INT()//初始化定时器0
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
a=b=d=e=g=h=0;
c=f=16;
EA=1;
ET0=1;
TR0=1;
}
voidtimer0()interrupt1//定时器中断0服务函数
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
time++;
}
voidAllInitial()//每种功能的初始化
{
if(choice==0||affirm==0)
{
a=h=16;
b=c=g=f=16;
d=0;
e=choice;
EA=0;
}
elseif(choice==1&&affirm==1)
{
h=g=f=e=0;
a=b=c=d=16;
time=seconds=minutes=hours=0;
}
elseif(choice==2&&affirm==1)
{
time=seconds=minutes=hours=0;
c=f=17;
EA=1;
}
elseif(choice==3&&affirm==1)
{
a=b=c=d=e=f=g=16;
h=num=0;
EA=0;
}
}
charkeyscan()
{
keyDown=0;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
num=1;
break;
case0xde:
num=2;
break;
case0xbe:
num=3;
break;
case0x7e:
operateFlag=0x01;
break;
}
while(temp!
=0xf0)//判断按键是否松开
{
temp=P3;
temp=temp&0xf0;
}
keyDown=1;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
num=4;
break;
case0xdd:
num=5;
break;
case0xbd:
num=6;
break;
case0x7d:
operateFlag=0x02;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
keyDown=1;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xeb:
num=7;
break;
case0xdb:
num=8;
break;
case0xbb:
num=9;
break;
case0x7b:
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
keyDown=1;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xe7:
num=0;
break;
case0xd7:
num=0;
break;
case0xb7:
break;
case0x77:
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
keyDown=1;
}
}
returnnum;
}
voidsmg(uchara,ucharb,
ucharc,uchard,uchare,
ucharf,ucharg,ucharh)
{
P0=0;
P2=0xfe;
P0=table1[a];
delay
(1);
P2=0xff;
P0=0;
P2=0xfd;
P0=table1[b];
delay
(1);
P2=0xff;
P0=0;
P2=0xfb;
P0=table1[c];
delay
(1);
P2=0xff;
P0=0;
P2=0xf7;
P0=table1[d];
delay
(1);
P2=0xff;
P0=0;
P2=0xef;
P0=table1[e];
delay
(1);
P2=0xff;
P0=0;
P2=0xdf;
P0=table1[f];
delay
(1);
P2=0xff;
P0=0;
P2=0xbf;
P0=table1[g];
delay
(1);
P2=0xff;
P0=0;
P2=0x7f;
P0=table1[h];
delay
(1);
P2=0xff;
}
voidjishu(ucharnum1)
{
if(h==0&g==16)
{h=num1;}
elseif(g==16)
{
g=h;
h=num1;
}
elseif(f==16)
{
f=g;
g=h;
h=num1;
}
elseif(e==16)
{
e=f;
f=g;
g=h;
h=num1;
}
elseif(d==16)
{
d=e;
e=f;
f=g;
g=h;
h=num1;
}
elseif(c==16)
{
c=d;
d=e;
e=f;
f=g;
g=h;
h=num1;
}
elseif(b==16)
{
b=c;
c=d;
d=e;
e=f;
f=g;
g=h;
h=num1;
}
elseif(a==16)
{
a=b;b=c;c=d;d=e;e=f;f=g;g=h;
h=num1;
}
else
{
a=b;b=c;c=d;d=e;e=f;f=g;g=h;
h=num1;
}
}
voidcalculator()
{
num=keyscan();
if(keyDown==1)
{
jishu(num);
num=0;
}
smg(a,b,c,d,e,f,g,h);
}
//*******秒表程序**********
voidmbcs()
{
num=keyscan();
if(keyDown==1)
{
if(operateFlag==0x01)
{EA=!
EA;}
if(operateFlag==0x02)
time=seconds=minutes=0;
}
if(time>=100)
{
time=0;
++seconds;
if(seconds==60)
{
seconds=0;
++minutes;
if(minutes==60)
{
minutes=0;
}
}
}
h=time%10;
g=time/10;
f=seconds%10;
e=seconds/10;
a=b=c=d=16;
smg(a,b,c,d,e,f,g,h);
}
//********时钟程序**********
voidszcs()
{
num=keyscan();
if(keyDown==1)
{
if(num==1)
++hours;
elseif(num==4)
--hours;
elseif(num==2)
++minutes;
elseif(num==5)
--minutes;
elseif(num==3)
++seconds;
elseif(num==6)
--seconds;
num=0;
}
if(time==100)
{
seconds++;
time=0;
}//增长溢出
if(seconds==60)
{
minutes++;
seconds=0;
if(minutes==60)
{
++hours;
minutes=0;
if(hours>=24)
hours=minutes=seconds=0;
}
}
if(minutes==60)
{
++hours;
minutes=0;
if(hours>=24)
hours=minutes=seconds=0;
}
if(hours>=24)
hours=minutes=seconds=0;
//消减溢出
if(seconds==255)
{seconds=59;--minutes;}
if(minutes==255)
{minutes=59;--hours;}
if(hours==255)
{hours=minutes=seconds=0;}
a=hours/10;
b=hours%10;
d=minutes/10;
e=minutes%10;
g=seconds/10;
h=seconds%10;
smg(a,b,c,d,e,f,g,h);
}
voidsingal(intwei,intduan,inttimeSpan)
{
P0=0;
P2=wei;
P0=duan;
delay(timeSpan);
P2=0xff;
}
voidmainKey()
//扫描按键的功能变化
{
if(p14==0)
{
delay(5);
if(p14==0)
{
choice=1;
e=choice;
}
while(!
p14);
}
elseif(p15==0)
{
delay(5);
if(p15==0)
{
choice=2;
e=choice;
}
while(!
p15);
}
elseif(p16==0)
{
delay(5);
if(p16==0)
{
choice=3;
e=choice;
}
while(!
p16);
}
if(p17==0)
{
delay(5);
if(p17==0&&choice!
=0)
{
affirm=!
affirm;
AllInitial();
}
while(!
p17);
}
smg(a,b,c,d,e,f,g,h);
}
voidmain()
{
TIME0_INT();
EA=0;
AllInitial();
while
(1)//主循环
{
mainKey();
if(affirm==1)
{
switch(choice)
{
case1:
mbcs();break;
case2:
szcs();break;
case3:
calculator();break;
}
}
}
}
软件设计好后,在KEIL上面进行编译,把编译得到的hex文件加载到Proteus里面进行仿真,得到Proteus仿真电路图如图。
时钟
秒表
清零
键盘选择
六实验心得
通过本次单片机最小系统的设计、应用实验的学习,收获颇丰,对单片机最小系统有了一定的认识和了解。
基本掌握了利用Protus软件仿真电路的方法。
并为电路编写程序,实现一定的功能。
巩固了单片机课上所学的知识,而且也学到了很多在书本上所没有学到过的知识,使我懂得了理论与实际相结合是很重要的,在今后的学习实践中,要加强知识与实践相结合的运用。