51单片机最小系统Word文件下载.docx
- 文档编号:20227521
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:21
- 大小:118.17KB
51单片机最小系统Word文件下载.docx
《51单片机最小系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《51单片机最小系统Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
等加到上述电路中,成为小系统
三:
实训任务.
1)认识MCS-51的ROM及片外RAM空间:
认识51系列单片机的程序存储器(ROM)的空间范围;
汇编指令编码在ROM中存储形式;
掌握指令编码和指令编码所在地址的概念;
了解51系列单片机的程序存储器(ROM)固定地址的用途。
认识51系列单片机的片外数据存储器(片外RAM)的地址空间范围;
了解51系列单片机的片外数据存储器的用途;
重点掌握片内片外访问存储器的指令。
(2)认识MCS-51片内RAM空间:
认识51系列单片机片内随机存储器(片内RAM)的空间范围;
认识51系列单片机片内随机存储器的区域划分;
掌握字节地址和位地址的概念;
了解R0~R7寄存器与字节地址的关系。
重点掌握MCS-51系列单片机四个口的用法的位操作。
(3)MCS-51汇编语言设计(编码转换):
用MCS-51汇编指令进行程序设计。
将四位BCD码化为十六位二进制数。
(或将四位十六进制数转化为BCD码)。
要求:
在PC机上调试,程序可正确运行并上交源程序清单及程序说明。
(4)键盘输入电路设计/动态显示电路设计:
在实训过程中要求设计按键输入电路、设计显示电路,并画出电路图并编写按键输入子程序。
重点掌握硬件电路的设计及通过编程对电路的控制。
(5)单片机最小系统设计:
单片机最小系统的设计是单片机应用系统设计及开发的基础,通过单片机最小系统设计,使学生对所学的单片机原理及应用课程有更深的理解。
提供电路图和程序清单。
重点掌握硬件电路的设计及过程控制。
(6)基于单片机的应用系统设计:
设计出实现某控制目的的应用系统是本实训课的最终实训的结果。
实训要求中包括单片机最小系统的设计,按键输入电路设计,显示电路的设计,及应用系统的软件编程。
四:
最小系统的构成
1、时钟和时钟电路
单片机内部具有一个高增益反相放大器,用于构成振荡器。
通常在引脚XTALl和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,系统时钟电路结构如图
2、复位和复位电路
单片机小系统采用上电自动复位和手动按键复位两种方式实现系统的复位操作。
上电复位要求接通电源后,自动实现复位操作。
手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。
复位电路结构如图3所示。
上电自动复位通过电容C3充电来实现。
手动按键复位是通过按键将电阻R2与VCC接通来实现。
3、键盘和键盘电路
.4、显示电路
系统设置了6个LED数码管,单片机提供段码信号,低电平有效,输出端通过限流电阻与数码管的段码数据线相连,用来送出LED数码管的段码数据信号。
单片机提供位选信号,当某位输出低电平时,与此相连的开关三极管导通,对应的数码管点亮,使用三极管用来增强信号的驱动能力
1、USB下载电路与USB接口端电路
①USB下载电路
②USB接口电路
DA与AD转换电路
DA转换就是数模转换,指为把数字信号转换为信息基本相同的模拟信号而设计的处理过程;
AD转换就是模数转换,就是把模拟信号转换成数字信号而设计的处理过程。
①DA转换电路
②AD转换电路
五:
程序(见附页)
六:
心得体会
经过一周的实训,我们对单片机最小系统有了更深的认识,认识到理论与实践的区别,对课本的知识点有了进一步的梳理,我们认识到自身在实际操作和动手能力方面的不足,虽然整个实习过程充满了波澜和不确定性,但是我们还是按时的完成的任务。
这次的实训是我们整个学期学习知识的一次总结,我们认识到各个学科之间的联系,同时还练习了我们的实际动手能力,编程能力,以及团队协作能力,对我们今后的发展有很大的帮助。
这次的实训对我们也是一个很大的挑战,时间紧,而且我们对所学的知识掌握的也不是很牢靠,所以这次的报告难免会出现很多瑕疵,希望老师能给予批评和指导。
附页
#include<
reg52.h>
intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
uinttemp,tempH,tempL;
ucharaa=0,xianshi=0,a=0,flag=0,num=0,flag_get=0;
uchardofly[]={0xed,0x48,0xe6,0x6e,0x4b,0x2f,0xaf,0x68,0xef,0x6f,0xeb,0x8f,0xa5,0xce,0xa7,0xa3};
//ucharwei[]={0xfb,0xf7,0xef,0xdf};
ucharstr[4]={0xed,0xed,0xed,0xed},m=0xed,n=0,b=0,x1,x2,x3,x4;
//矩阵变量
sbitdula=P2^6;
sbitwela=P2^7;
sbitDQ=P2^2;
//定义DQ引脚为P2.2
sbitkey1=P3^4;
//定义IO口
sbitkey2=P3^5;
sbitkey3=P3^6;
sbitkey4=P3^7;
sbitled=P2^5;
//LED锁存
//延时函数
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
/*------------------矩阵按键-----------------------*/
ucharkeycan()//键盘扫描函数
ucharcord_h,cord_l;
//行列值中间变量
P3=0x0f;
//行线输出全为0
cord_h=P3&
0x0f;
//读入列线值
if(cord_h!
=0x0f)//先检测有无按键按下
{
delay(100);
//去抖
=0x0f)
P3=cord_h|0xf0;
//输出当前列线值
cord_l=P3&
0xf0;
//读入行线值
P3=0x0f;
while(P3!
=0x0f);
//松手检测
switch(cord_h+cord_l)
case0x77:
m=dofly[0];
n++;
break;
//0按下相应的键显示相对应的码值
case0x7b:
m=dofly[1];
//1
case0x7d:
m=dofly[2];
//2
case0x7e:
m=dofly[3];
//3
case0xb7:
m=dofly[4];
//4
case0xbb:
m=dofly[5];
//5
case0xbd:
m=dofly[6];
//6
case0xbe:
m=dofly[7];
//7
case0xd7:
m=dofly[8];
//8
case0xdb:
m=dofly[9];
//9
case0xdd:
m=dofly[10];
//a
case0xde:
m=dofly[11];
//b
case0xe7:
m=dofly[12];
//c
case0xeb:
m=dofly[13];
//d
case0xed:
m=dofly[14];
//e
case0xee:
m=dofly[15];
//f
}
}
return(n);
/****************************数码管显示***********************************/
voiddisplay(void)
uchark;
if(xianshi==1)
b=k%4;
str[b]=m;
k=keycan();
switch(b)
case0:
//左边第一位每间隔十次扫描
x1++;
break;
case1:
//左边第二位每间隔十次扫描
x2++;
case2:
//左边第三位每间隔十次扫描
x3++;
case3:
//左边第四位每间隔十次扫描
x4++;
default:
if(x1>
=20||x2>
=20||x3>
=20||x4>
=20)
x1=0;
x2=0;
x3=0;
x4=0;
if(x1<
=10)
{
wela=1;
P0=0xfb;
wela=0;
P0=0xff;
dula=1;
P0=str[1];
dula=0;
delay(5);
//点亮第一位数码管
if(x2<
wela=1;
P0=0xf7;
P0=str[2];
//点亮第二位数码管
if(x3<
P0=0xef;
P0=str[3];
//点亮第三位数码管
if(x4<
P0=0xdf;
P0=str[0];
//点亮第四位数码管
if(xianshi!
=1)
}
/*********************************************/
voidkey()//独立按键
P3=0xff;
if(key1==0)//按键扫描
{
delay(5);
//消抖
if(key1==0)
{
xianshi=1;
}
}
if(key2==0)
if(key2==0)
xianshi=2;
if(key3==0)
if(key3==0)
xianshi=3;
a=0;
if(key4==0)
if(key4==0)
xianshi=4;
voidzuo()
led=1;
switch(a)
case0:
P1=0xfe;
case1:
P1=0xfd;
case2:
P1=0xfb;
case3:
P1=0xf7;
case4:
P1=0xef;
case5:
P1=0xdf;
case6:
P1=0xbf;
case7:
P1=0x7f;
voidyou()
/******************************************************************/
/*延时函数*/
voiddelays(unsignedinti)//延时函数
while(i--);
/*初始化*/
voidInit_DS18B20(void)
unsignedcharx=0;
DQ=1;
//DQ复位
delays(8);
//稍做延时
DQ=0;
//单片机将DQ拉低
delays(80);
//精确延时大于480us
//拉高总线
delays(10);
x=DQ;
//稍做延时后如果x=0则初始化成功x=1则初始化失败
delays(5);
/*读一个字节*/
unsignedcharReadOneChar(void)
unsignedchari=0;
unsignedchardat=0;
for(i=8;
i>
i--)
//给脉冲信号
dat>
>
=1;
if(DQ)
dat|=0x80;
return(dat);
/*写一个字节*/
voidWriteOneChar(unsignedchardat)
unsignedchari=0;
for(i=8;
i>
i--)
DQ=dat&
0x01;
delays(5);
/*读取温度*/
unsignedintReadTemperature(void)
unsignedchara=0;
unsignedintb=0;
unsignedintt=0;
Init_DS18B20();
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转换
delays(200);
//跳过读序号列号的操作
WriteOneChar(0xBE);
//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();
//低位
b=ReadOneChar();
//高位
b<
<
=8;
t=a+b;
return(t);
voidclose()//关闭数码管
dula=1;
P0=0xff;
dula=0;
wela=0;
voiddisplay1(void)
close();
P1=0xff;
if(flag_get==1)
temp=ReadTemperature();
else
{temp=temp;
tempH=temp>
4;
tempL=temp&
0x0F;
tempL=tempL*6/10;
//小数近似处理
P0=dofly[(tempH%100)/10];
P0=dofly[(tempH%100)%10];
P0=dofly[tempL];
P0=0xa5;
voidmain()
//P0=0x00;
TMOD|=0x01;
//定时器设置
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
IE=0x82;
TR0=1;
while
(1)
key();
if(xianshi==1)//矩阵
{
led=1;
led=0;
if(flag==1)
flag=0;
close();
display();
elseif(xianshi==2)//温度传感器
display1();
}
elseif(xianshi==3)
zuo();
//流水灯左移
elseif(xianshi==4)
close();
you();
//流水灯右移
else{
P1=0;
voidtimer0()interrupt1
aa++;
if(aa==10)
aa=0;
a++;
if(a>
8)a=0;
num++;
if(num==25)
{num=0;
flag_get=1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 最小 系统