第一篇:单片机最小系统实训报告
单片机最小系统实训报告
一、实训目的
1、掌握并理解单片机最小系统的原理及制作, 牢记最小系统中各元器件 的参数及各元器的作用./
2、掌握单片机芯片内部的组成及存储机构。
3、理解常用指令的功能和使用方法。
4、掌握单片机的中断源,中断控制寄存器,中断响应过程,定时/计数器的电路结构、功能我使用方法,定时器/计数控制寄存器.5、复习利用Keil51软件对程序进行编译。
6、用protel软件绘制“单片机最小系统”电路,并用测试程序进行仿真。
7、会根据实际功能,正确选择单片机功能接线,编制正确程序。对实验结果能做出不分析我解释,能学出符合规格的实验报告。
二、实训工具
1、点偏激测试平台:PC机,串口线,并口线,单片机开发板
2、软件:keil51测试软件,protel仿真软件,DXP2004软件。
三、实训要求
通过实训,学生应达到以下经济方面的要求:
素质要求
1、以积极认真的态度对待本次实训,遵章守纪、团结协作。
2、善于发现数字电路中存在的问题、分析问题、解决问题,努力培养独立工作能力。
能力要求
1、模拟电路的理论知识
2、脉冲与数字电路的理念知识
3、通过模拟、数字电路实验有一定的动手能力
4、能熟练的制作单片机最小系统
5、嫩熟练的编写8951单片机汇编程序
6、能够熟练的运用仿真软件对单片机最小系统仿真
四、实训内容
1、掌握并理解“单片机最小系统”的原理及制作,牢记最小系统中各元器件的参数及格元器件的作用。
2、用keil51测试元件编写8951单片机汇编程序
3、用peotel软件绘制“单片机最小系统”单路原理图。
4、运用仿真软件对单片机最小系统进行仿真。五.实训基本步骤
1、用peotel乳酸钠几十年绘制“单片机最小系统”单路原理图。
2、根据原理图生成pcb图、GB文件。钻孔文件
3、绘制印刷电路板。
4、根据原理图焊接元件,生成单片机开发板。
5、用keil51软件编写单片机最小系统测试程序。
6、用仿真软件绘制单片机最小系统原理图,测试测量程序。
7、把测试程序拷贝到单片机里进行实物测试。
8、观察测试结果。
六、51单片机C编语言程序测试 测试程序流水灯1: //用定时器做流水灯测试 //为定时显示做准备
//P1-0-----PF1.3
L0-----L3 #include
#define unit unsigned int #define unchar unsigned char
sbit L0 = P1^0;sbit L1 = P1^1;sbit L2 = P1^2;sbit L3 = P1^3;
unsigned char data BUFFER[1]={0};
void main(void){ P2=0X0F;
EA=1;IT0=1;ET0=1;TMOD=0X01;TH0=-5000/256;TL0=-5000%256;TR0=1;
while(1){
};} //定时器0中断服务程序// void timer0(void)interrupt 1 using 1 { TH0=-5000/256;TL0=-5000%256;BUFFER[0]=BUFFER[0]+1;if(BUFFER[0]==100)
{
L3=!L3;
L2=!L2;
L1=!L1;
L0=!L0;
} } 测试程序流水灯2:
//此程序为了做花样流水灯的
//采用了C的宏定义 X 可以实现一改全改 #include
#define X 16 //
unsigned int time=0;
unsigned int a[X]={
0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,0X18,0X24,0X42,0X81,0X42,0X24,0X18,0X00,void main(void){ P1=0X0f;EA=1;IT0=1;ET0=1;TMOD=0X01;TH0=9000/256;TL0=9000%256;TR0=1;
while(1){
P1=a[time];};} //定时器0中断服务程序// void timer0(void)interrupt 1 using 1 { TH0=9000/256;TL0=9000%256;
time++;if(time==X)time=0;
} //此程序来测试数码管
//P0.0--P0.7
A B C D E F G dp //P2.0--P2.7
C0M0--------C0M8 #include
#define unit unsigned int #define unchar unsigned char
unsigned char data BUFFER[1]={0};unsigned char X=0;//共阳极码表数码管
unsigned char leddata[]={
0xC0, //“0”
0xF9, //“1”
0xA4, //“2”
};
0xB0, //“3”
0x99, //“4”
0x92, //“5”
0x82, //“6”
0xF8, //“7”
0x80, //“8”
0x90, //“9”
0x88, //“A”
0x83, //“B”
0xC6, //“C”
0xA1, //“D”
0x86, //“E”
0x8E, //“F”
0x89, //“H”
0xC7, //“L”
0xC8, //“n”
0xC1, //“u”
0x8C, //“P”
0xA3, //“o”
0xBF, //“-”
0xFF, //熄灭
0xFF //自定义
};
unsigned char com[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};void Delay(unsigned char cnt){ while(cnt--);} void xian_shi(unsigned char cp){ unsigned char i;unsigned int z=cp;for(i=0;i<8;i++)
{
P0=leddata[z%10];
P2=com[i];
Delay(200);
z=z/10;
} } void main(void){
P0=0X00;P2=0Xff;EX0=1;IT0=1;EA=1;
while(1){
xian_shi(X);};} //定时器0中断服务程序// void timer0(void)interrupt 1 using 1 { X++;if(X==25){
X=0;} } 此程序测试键盘
//P3.0---P3.3
L0-------L3 //从左到有显示为 0 1 2 3
P3.4/ //上///
5 6 7
P3.5/ //到///
9 A B
P3.6/ //下///
C D E F
P3.7/ //P3.4--=P3.7
H0----H3 #include
#define uchar unsigned char #define uint unsigned int
unsigned char led_data[]={
0xC0, //“0”
0xF9, //“1”
0xA4, //“2”
0xB0, //“3”
0x99, //“4”
0x92, //“5”
0x82, //“6”
0xF8, //“7”
0x80, //“8”
0x90, //“9”
0x88, //“A”
0x83, //“B”
0xC6, //“C”
0xA1, //“D”
0x86, //“E”
0x8E, //“F”
0x89, //“H”
0xC7, //“L”
0xC8, //“n”
0xC1, //“u”
0x8C, //“P”
0xA3, //“o”
0xBF, //“-”
0xFF, //熄灭
0xFF //自定义
};
void delay(uint i)
{ while(i--);}
uchar keyscan(void)// { uchar cord_h,cord_l;//行列值中间变量
P3=0x0f;
//行线输出全为0 cord_h=P3&0x0f;
//读入列线值
if(cord_h!=0x0f)
//先检测有无按键按下
{
delay(100);
//去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f;//读入列线值
P3=cord_h|0xf0;//输出当前列线值
cord_l=P3&0xf0;//读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}
return 0xFF;}
void main()
{ uchar key;P2=0xbb;
//1数码管亮 按相应的按键,会显示按键上的字符
while(1){ key=keyscan();//调用键盘扫描,switch(key){
case 0xEE:P0=led_data[0];break;//0 按下相应的键显示相对应的码值
case 0xED:P0=led_data[1];break;//1
case 0xEB:P0=led_data[2];break;//2
case 0xE7:P0=led_data[3];break;//3
case 0xDE:P0=led_data[4];break;//4
case 0xDD:P0=led_data[5];break;//5
case 0xDB:P0=led_data[6];break;//6
case 0xD7:P0=led_data[7];break;//7
case 0xBE:P0=led_data[8];break;//8
case 0xBD:P0=led_data[9];break;//9
case 0xBB:P0=led_data[10];break;//a
case 0xB7:P0=led_data[11];break;//b
case 0x7E:P0=led_data[12];break;//c
case 0x7D:P0=led_data[13];break;//d
case 0x7B:P0=led_data[14];break;//e
case 0x77:P0=led_data[15];break;//f } } } //此程序用来测试中断键盘P3.2 INT0 //下跳沿触发 // #include
#define unit unsigned int #define unchar unsigned char
sbit L0=P1^0;sbit L1=P1^1;sbit L2=P1^2;sbit L3=P1^3;
unsigned int times=0;
void delay(unsigned int cp)
{
unsigned int i=cp;
while(i--);
}
unsigned char leddata[]={
0xC0, //“0”
0xF9, //“1”
0xA4, //“2”
0xB0, //“3”
0x99, //“4”
0x92, //“5”
0x82, //“6”
0xF8, //“7”
0x80, //“8”
0x90, //“9”
0x88, //“A”
0x83, //“B”
0xC6, //“C”
0xA1, //“D”
0x86, //“E”
0x8E, //“F”
0x89, //“H”
0xC7, //“L”
0xC8, //“n”
0xC1, //“u”
0x8C, //“P”
0xA3, //“o”
0xBF, //“-”
0xFF, //熄灭
0xFF //自定义
};
unsigned char com[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};
void xian_shi(unsigned char cp){
unsigned char i;unsigned int z=cp;for(i=0;i<8;i++)
{
P0=leddata[z%10];
P2=com[i];
delay(200);
z=z/10;
} }
void main(void){ P1=0Xdd;EX0=1;IT0=1;EA=1;
while(1){
xian_shi(times);};}
//INT0低电平中断服务程序// void intersvr0(void)interrupt 0 using 1 {
L0=!L0;
L1=!L1;
L2=!L2;
L3=!L3;
times ++;}
//最简单的24小时显示 #include
#define unit unsigned int #define unchar unsigned char
unsigned char data BUFFER[1]={0};unsigned char time[3]={0};
unsigned char leddata[]={
0xC0, //“0”
0xF9, //“1”
0xA4, //“2”
0xB0, //“3”
0x99, //“4”
0x92, //“5”
0x82, //“6”
0xF8, //“7”
0x80, //“8”
0x90, //“9”
0x88, //“A”
0x83, //“B”
0xC6, //“C”
0xA1, //“D”
0x86, //“E”
0x8E, //“F”
0x89, //“H”
0xC7, //“L”
0xC8, //“n”
0xC1, //“u”
0x8C, //“P”
0xA3, //“o”
0xBF, //“-”
0xFF, //熄灭
0xFF //自定义
};
unsigned char com[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};void Delay(unsigned char cnt){ while(cnt--);} void xian_shi(void){ unsigned char i;unsigned int SS=time[0]+100*time[1]+10000*time[2];for(i=0;i<6;i++)
{
P0=leddata[SS%10];
P2=com[i];
Delay(200);
SS=SS/10;
} } void main(void){ P0=0X00;P2=0Xff;EA=1;IT0=1;ET0=1;TMOD=0X01;TH0=0xec;TL0=0x78;
TR0=1;
while(1){
xian_shi();};} //定时器0中断服务程序// void timer0(void)interrupt 1 using 1 { TH0=0xec;TL0=0x78;
BUFFER[0]=BUFFER[0]+1;if(BUFFER[0]==100){
time[0]++;
BUFFER[0]=0;
if(time[0]==60)
{
time[0]=0;
time[1]++;
if(time[1]==60)
{
time[1]=0;
if(time[1]==60)
{
time[1]=0;
time[2]++;
if(time[2]==24)
}
}
}
time[2]=0;
} }
七、实训心得
高职高专教育培养的是技术应用型人才,学校为了陪养我们的创新精神和工程实践能力,提高我们的综合素质,我们进行实训,在实践中相互学习和进步。通过实践我们更清楚的认识了我们所学习专业在实践中的运用。也感觉到理论和实践的差距。
八、附件
单片机最小系统生成原理图
第二篇:单片机最小系统实验总结
STC89C51单片机最小系统板开发实验总结 实验小组成员:陆叙旺 张爱华 温小静
总的要求:设计并制作STC89C51单片机最小系统板。提供单片机最基本的运行环境并具备ISP下载程序的功能。由于该板将来拟用作参赛设计的核心板,所以要求该板的设计具备使用灵活、方便,并采用模块化设计使该板能与将来的整个系统很好的连接。同时应具备很好的可维修与可维护性。具体要求:
[1] [2] [3] [4] [5] [6] 提供合适的电源接口并具备电源指示灯 应具有上电复位和手动复位功能 支持最大40MHz的运行频率
具有RS232接口,可连接电脑下载程序
八位流水灯,用于测试最小系统板是否工作正常 应引出单片机的所有输入输出引脚
考虑的问题:
[1] [2] [3] [4] [5] [6] [7] 如何做到模块化? 是否需要复位按键? 是否要编程座?
系统晶振插座:可更换升级晶振。是否需要EA跳线?
考虑是否需要电源开关,以及采用哪种开关最好? 其它
实验设计过程: 原理图设计:
(1)单片机CPU部分:采用STC89C51芯片,封装DIP-40。40个引脚,用40个排针引出,40脚接VCC,20脚接GND,VCC与GND之间用一小电容(可以用104)耦合。(去耦电容的主要功能就是提供一个局部的直流电源给有源器件,以减少开关噪声在板上的传播和将噪声引导到地。)P0,P1,P2,P3做IO接口。9脚接RST(复位电路)。18,19脚接晶振,(这次实验用晶振为40M)。31脚接EA。
(2)电源供电部分:直接用排针引入电源给单片机供电,另外一种电源输入就是加一个稳压块7805,正电源端接一个二极管,保护电路,防止上电时正负反接。经过稳压后串一个电阻(几百欧)引出一个发光二极管。做为电源指示灯。问题出现在,如果是5V供电,经过7805
稳压后,得到的电源并不够5V了,只有3V多,所以,如果是选用经过稳压后的电源供电,那么输入就要有7V。(3)晶振部分:采用40M晶振,电容可以采用30P(可以用更小点的电容,小点的电容理论上效果会好点)。在封装电路的时候,晶振部分加了一个晶振插座,这样,可以更换升级晶振。
(4)复位电路部分:电复位和手动复位,电复位就是接一个1U的电容,手动复位就是接一个开关,这个开关选用点触开关比较方便。
(5)EA电位选择部分:单片机的9脚(EA)。采用了排针引出,与电源的正负两端一起用三列排针引出,实验用到时,用两个孔的插帽做EA跳线。
(6)RS232接口,电脑下载程序部分:下载程序接口用DB9,电平转换采用MAX232芯片。DB9的2,3脚接到MAX232的7(T2OUT),8(R2IN)脚,5脚接地。MAX232的9(R2OUT),10(T2IN)分别接到单片机上的P3^0(RXD)和P3^1(TXD)脚。MAX232的1,3脚,4,5脚,6,15脚,2,16脚,都串接一个电容,这些电容的大小最好都是1U,当然,也可以采用其他的小电容,例如:104。15接地,16接VCC,加一个去耦电容104。(7)LED试验灯部分:8个发光二极管,正端接到P2端,负端接330欧的排阻,当P2口输出高电位时,发光二极管亮,地电位时,发光二极管熄灭。(8)总电路图如下:
PCB图设计:电源线,地线,做得相对大点,排线时,考虑到信号干扰,线与线之间的距离要适当。特别是电源与地线不要靠太近,输入输出排版尽量合理。输入输出接口放到板子比较好接,好调的地方。尽量避免跳线,主干部分(CPU)最好排在板子中间。调试过程:
焊接好板子,做出来的实物图,接上电源,烧写一个流水等程序进去,可以看到8个发光二极管闪亮。
实际做板遇到的问题;在做板中,出现的问题主要集中在RS232接口,电脑下载程序部分和电源部分。刚开始用RS232的13脚和14脚接DB9的2,3脚。11脚和12脚接到单片机的P3^0脚和P3^1脚,调试过程中,程序下载不进去,进过检查,其它部分电路都没有错。后来又用跳线按照上述讲的接。结果程序可以下载进去了。电源部分:采用7805稳压,效果不是很好,带来了不少麻烦。所以,后面干脆把7805也去掉,如果是用我们自己做的电源供电,稳定性已经很好了,没必要i再次稳压。现在我们基本都是用自己做的直流稳压电源。所以,这里可以去掉稳压块电路。
想做一块好的板子,封装一定要对口,不对口的话就接不上去,或者接上去了也不好看。原理图尽量要做得清晰好看,PCB图尽量用手工布线,布线的时候不要布得太绕了。线是追求最短。做板的时候最好买一些好的材料做,效果会更好,比如说,铜板,电容。
想做一块好的板子,就以我们现在的水平。不要追求速度。能按时完成就好。以后再慢慢提高。遇到不懂的,希望大家一起讨论。
******2***101112******9101112***819201
19876543212019******42526272829303******6543212019******2121212121212***89
第三篇:单片机实训报告范文
四川电子机械职业技术学院
单片机原理及应用
实 训报告1
班级:应电14.2班 姓名:刘华利 学号:140302058 指导教师:向兵
四川电子机械职业技术学院
摘要:
《单片机应用系统设计项目化教程》这本书根据教育部新的教学改革要求和企业岗位技能需求,以高技能应用型人才专业能力培养为目标,结合作者多年的教学经验与课程改革成果进行编写。全书通过6个典型项目任务,着重介绍单片机基本原理及应用系统的设计方法与技巧,包括流水灯控制系统设计、简易数字时钟设计、数字电压表设计、低频信号发生器设计、数据存储及回放系统设计和窗帘智能控制系统设计等。本书采用“理实一体、项目化教学”模式进行内容编排,将单片机原理及应用系统设计的相关知识点融入项目中进行讲解,易教易学,效果良好。
目录
摘要········································ 2 目录········································ 2 实训名称···································· 3 实训地点···································· 3 实训时间···································· 3 实训目的···································· 3 实训项目···································· 3 项目1·······································3 项目2·······································4 项目3·······································5 项目4·······································6 实训总结····································· 7
四川电子机械职业技术学院
实训名称:单片机原理及应用 实训地点:行政楼523 实训时间:2016.6.27—6.30 实训目的:1、2、3、4、5、6、7、掌握结构化程序设计的基本方法,基本掌握面向对象程序设计的基本思路和方法。
掌握C的基本概念和基础知识。
通过训练能够读懂较为复杂的C语言源程序并具备基本C语言程序设计的能力。
熟练掌握各种常用类的定义继承文件的应用,为更好的理解面向对象打下更好的基础。
掌握面向对象的基本原理,提高学生综合程序设计的能力。
培养自己独立解决问题,找资料的能力。同学之间相互帮助、相互交流、相互合作的团队精神。
通过实训检查自己学习上的不足,达到熟练掌握C语言的基本知识和技能。
实训项目: 项目1 点亮一个LED,每隔一定时间循环熄灭、点亮…
设计思路:端口送高电平,led熄灭,延时1s,端口送低电平,led点亮,延时1s,就这样一直循环。
程序
#include
L2 = 1;
while(Ms--)
DelayMs(1000);
{
L2 = 0;
for(i = 0;i < 114;i+
DelayMs(1000);+);} } }
四川电子机械职业技术学院
原理图
项目2 点亮一个LED,让它每隔一定时间循环左移(课使用delay函数进行延时)
设计思路:在项目1的的基础上,用dalay函数进行延时,用<<来表示左移,添加一个左移的函数。通俗一点的讲的话,就如天天天同一些人排队领东西,领完了返回队位继续排(当然一只是这几个人排)。
程序
#include } while(1){ for(i=0;i<7;i++){ delay(100); LED=(LED<<1)|0x01;P3=LED;} } 四川电子机械职业技术学院 原理图 项目3 将任务二中delay延时改用定时器延时,且延时一秒 设计思路:在项目2的的基础上,用定时器来进行延时,首先设置定时器工作方式 也就是TMOD,在设置TH0/1,TL0/1的初值,也就是定时时间的设置,然后设置中断允许,并开中断。用中断来控制。 程序 #include { TH0=(65536-50000)/256;TL0=(65536-50000)%256;j++;if(j==5){ j=0; P1=~(0x01< if(++i==8)i=0; } } 四川电子机械职业技术学院 原理图 项目4 四位数码管并排显示,从左到右依次为分、秒十位、秒各位、0.1秒,相当于移动可计时9分59.9秒,使用一个按键,当按键第一次按下,启动秒表,第二次按下,停止,第三次按下,清零。(数码管可选共阴极、共阳极,至于对应数字的段选可参考教材) 设计思路:用delay函数来进行延时,用内部中断来控制T1,用外部中断来实现计数、暂停、清零这三个功能。 程序 #include uintx,y; for(x=100;x>0;x--) for(y=z;y>0;y--);} void dihplay(){ P1=0xfd; 四川电子机械职业技术学院 P0=Tab[xiao%10]; delay(1); } void display(){ P1=0xfb;P0=Tab[miao/10];delay(1); P1=0xfe;P0=Tab[miao%10];dp=0;delay(1);} void dimplay(){ P1=0xf7;P0=Tab[fen%10];dp=0;delay(1);} void main(){ EA = 1;EX0 = 1;IT0 = 1; ET0=1;TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=0;xiao=0;miao=0;fen=0; while(1) { display();delay(1);dimplay();delay(1);dihplay();delay(1); } } void timer0()interrupt 1 { xiao++; if(xiao==10) { xiao=0;miao++; if(miao==59) { miao=0; fen++; if(fen==10) { fen=0; } } } } void ex0_int0()interrupt 0 { swnum++;if(swnum == 1){ TR0= 1;} if(swnum == 2){ TR0 = 0;} if(swnum == 3){ xiao = 0; miao = 0; fen = 0; swnum=0;} } 四川电子机械职业技术学院 原理图 实训总结: 通过今次单片机实训,使我对单片机的认识有了更深刻的理解。系统以51单片机为核心部件,利用C语言编程,通过对led灯控制到用数码管实现秒表功能、中断控制功能,能实现本设计题目的基本要求和发挥部分。由于时间有限和本身知识水平的限制,本系统还存在一些不够完善的地方,要作为实际应用还有一些具体细节问题需要解决。 踉踉跄跄地忙碌了一周,我的程序终于编译成功。当看着自己的程序,自己成天相伴的系统能够健康的运行,真是莫大的幸福和欣慰。我相信其中的酸甜苦辣最终都会化为甜美的甘泉。 但在这次实训中同时使我对C语言有了更深的认识。当我第一次接触C语言就感觉很难,特别是今次实训要用到C语言,尽管困难重重,可我们还是克服了。这次的实训使培养了我们严肃认真的做事作风,增强了我们之间的团队合作能力,使我们认识到了团队合作精神的重要性。 这次实训的经历也会使我终身受益,我感受到这次实训是要真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破。希望这次的经历能让我在以后学习中激励我继续进步。 单片机原理及应用 实训报告 班级: 学号: 姓名: 指导教师: 实训总成绩: 一、节日彩灯设计 题目:8位逻辑电平模块上的LED小灯从左向右呈现“鞭甩”的实验现象,状态间隔为0.25秒;按键1开始,按键2结束。 原理图 程序代码: #include 单片机原理及应用实训报告 管及驱动电路的连接,从而构成一个完整的硬件电路。然后通过对单片机的ROM进行编程,实现对彩灯闪烁的控制。 二、定时器实现流水灯 题目:利用定时器/计数器T0产生2秒钟的定时,每当2秒定时到来时,更换指示灯点亮,依次循环点亮。 原理图 程序代码 #include 50000)% 256;TH0 =(65536 单片机原理及应用实训报告 程序代码 #include 单片机原理及应用实训报告 实训总结 通过本次单片机实训使得我更深层次的学习单片机原理与应用技术这门专业课程,同时对KEIL软件进行复习。这次实训是我看到了我最薄弱的一点那就是编程,对于编程有很大的困难。对以往学习过的编程知识没有好好掌握,特别是编程这方便的知识很薄弱。学习过的知识在实际应用中仿佛是冰山一角,完全不够用,需要通过查阅很多资料才能解决到碰到的相关问题。而且实训中出现的问题都是实际应用出比较典型的问题。这次实训还让我深刻的体会了结构化程序设计的优势,让我懂得当我们要进行一个复杂的程序设计时应该先将其分解为多个不同的功能模块再分别编程实现,这样做不仅降低了编程的难度,也容易让编程者思路更加清晰,避免出现不必要的错误。在做仿真时,仿真图正确也不一定就是说明一定正确。 目录 一 方案设计说明:............................................................................................2 二 硬件设计说明:............................................................................................4 (一)电路图:..........................................................................................4(二)单片机AT89S51的I/O口分配使用情况........................................4 (三)元器件的参数及规格:....................................................................5 三 软件设计说明:............................................................................................6 (一)软件设计思路及流程图:................................................................6 (二)程序的总体框架结构说明:............................................................8 (三)重要程序段的功能,作用及思路简介:........................................8 四 制作调试说明:..........................................................................................13 (一)程序调试过程:..............................................................................13 (二)硬件调试:......................................................................................13 五 电路实拍:.....................................................................................................14 六 总结心得体会:..........................................................................................15 七 参考文献:.....................................................................................................16 一 方案设计说明: 设计方案之前,得先分解设计任务。本次的设计任务是篮球记分牌,据常识,篮球记分牌应有分别给两队加分,减分,能交换显示分数。在进行设计之前,应自己提出几个问题,待问题回答之后。基本功、的设计方案就出来了。在设计之前我提出了一下几个问题: a:硬件部分如何控制给A对B对加分,场地交换的时候又是如何实现分数显示交换的?应该如何连接硬件,在硬件上设置控制端,控制端与单片机各引脚之间的连。 b:单片机只有一个CPU,如何实现即要扫描按键,又要显示比分。数码管工作的本质是将要显示的数据的字型码送给他,如何采集到变化的分数送给数码管。用查表吗? c:加分与倒计时在程序中最本质的东西是什么,如何用程序来说明这样的事件,各事件之间又是如何联系的。 虽然这些问题看似很普通,似乎在设计过程中都要面对这样的问题,何不事先就解决这些问题呢,在逐一回答这些问题的同时,该任务的设计方案已见雏形。以下就是该方案的详细内容以及我问题的答案。 系统原理图如下图一所示: LED数码显示管外部按键AT89S51驱动电路 3 二 硬件设计说明: (一)电路图: (二)单片机AT89S51的I/O口分配使用情况 图中P3.0,P3.1,P3.2,P3.3分别是加一分、加两分、加三分、减一分。P3.4与P3.5口是外部中断,其中断服务程序的功能是实现比分交换的切换显示和加分减分切换。电路中选择共阳极的数码管,可以省去输入端的驱动电路,使电路更简洁。P0口作为字形码的输出口,与数码管的八只管教相连。 (三)元器件的参数及规格: 主要元器件有单片机芯片AT89S51,共阳极数码管,9012PNP三极管。其中单片机承载程序,实现电路功能,三极管起开关及驱动数码管显示作用。数码管显示比分。 三 软件设计说明: 程序的总体思路是主程序一直在扫描按键,比分显示,比分交换,加减分队伍切换都在中断服务程序中完成。其具体内容如下所示。 (一)软件设计思路及流程图: 中断程序流程图(如:图一) 程序初始化,给存储器赋初值按键扫描程序,扫描到由按键控制的中断就执行其对应程序外部中断1,加减外部中断0,A、B分队伍切换中断程序两队比分切换图一 按键扫描程序流程图(如:图二)按键扫描入口,检测软件标志位F0,为1调用分数显示程序程序,为0调用加减分切换程序,同时扫描按键是扫描P3.0,并去抖,是否有键按下加一分否是扫描P3.1,并去抖,是否有键按下加两分否是扫描P3.2,并去抖,是否有键按下加三分否是扫描P3.3,并去抖,是否有按键按下减一分否按键扫描程序结束图二 分数显示程序流程图(如:图三) 将A对B对的分数首先进行BCD码转换,再保存到相对应的寄存器中把各分数分别赋给寄存器A,查表送往要显示的数码管由P2口的位状态控制子程序调用结束,返回主程序,RET 图三 其中时间显示的子程序流程图与分数的大同小异,此处就不再一一列出。 (二)程序的总体框架结构说明: 程序包含按键扫描程序,不断地扫描按键,一旦有控制中断的按键按下,就执行中断程序,交换比分。中断服务程序,INT_0交换A对与B对的总分,INT_1改变软件标志位就可以切换加减分队伍,同时扫描按键。 (三)重要程序段的功能,作用及思路简介: 按键扫描程序是本程序中最重要的程序段,其连接了所有的子程序,子程序的调用都是在其中完成。下面就对该程序段的功能,作用及编写思路做详细说明。各部分关键程序 按键控制程序 org 0060h ajcx: jnb p3.0,s0 jnb p3.1,s1 jnb p3.2,s2 jnb p3.3,s3 jnb p3.4,s4 jnb p3.5,sz5 ljmp ajcx sz5: ljmp s5 s0: lcall del jb p3.0,s01 ljmp ajcx s01: jnb p1.0,s02 mov a,30h inc a mov 30h,a ljmp tzcx s02: mov a,31h inc a mov 31h,a ljmp tzcx s1: lcall del jb p3.1,s11 ljmp ajcx s11: jnb p1.0,s12 mov a,30h add a,#02h mov 30h,a ljmp tzcx s12: mov a,31h add a,#02h mov 31h,a ljmp tzcx s2: lcall del jb p3.2,s21 ljmp ajcx s21: jnb p1.0,s22 mov a,30h add a,#03h mov 30h,a ljmp tzcx s22: mov a,31h add a,#03h mov 31h,a ljmp tzcx s3: lcall del jb p3.3,s31 ljmp ajcx s31: jnb p1.0,s32 mov a,30h dec a mov 30h,a ljmp tzcx s32: mov a,31h dec a mov 31h,a ljmp tzcx s4: lcall del jb p3.4,s41 ljmp ajcx s41: push 30h push 31h pop 30h pop 31h lcall jscx ljmp ajcx s5: lcall del jb p3.5,s51 ljmp ajcx s51: cpl p1.0 cpl p1.1 ljmp ajcx 加分程序: org 0120h tzcx: lcall jscx ljmp ajcx org 0130h del: mov tl1,#00h mov th1,#0bh setb tr1 jnb tf1,$ mov tl1,#00h mov th1,#0bh clr tf1 ret 加减分队伍切换程序: org 0150h dscx: mov th0,#0fch mov tl0,#18h mov a,r2 rl a mov r2,a cjne r2,#11h,d1 mov r1,#32h lcall jscx reti d1: cjne r2,#22h,d2 mov r1,#33h lcall jscx reti d2: cjne r2,#44h,d3 mov r1,#34h lcall jscx reti d3: mov r1,#35h lcall jscx reti 比分切换程序: org 0190h jscx: mov a,30h mov b,#0ah div ab mov 33h,b mov 32h,a mov a,31h mov b,#0ah div ab mov 35h,b mov 34h,a mov p2,r2 mov dptr,#tab mov a,@r1 movc a,@a+dptr mov p0,a ret org 0220h tab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h db 80h,90h end 12 四 制作调试说明: (一)程序调试过程: 程序调试我花了两天的时间,此程序虽然不复杂,由于我平时学习的不够深入,也没用心学。对于我这样的基础来说调试过程真的很痛苦。刚开始调试时程序有两处让我感觉很乱,按键扫描程序中的中断程序如何调用。当寄存A对或B对的分数累加到99的时候,就清零,但还没有累加到99的时候,程序应该跳往何处执行,我最初的是跳了继续累加。在仿真中的现象就是分数一直显示99,加不了。我真的是太大意了,调试的时候不踏实。 (二)硬件调试: 此次的硬件焊接很成功,电路布局很清晰,虽然在调试时也发现错误,但用万用表很容易就检测出来了,其中有几根线的皮包线熔了,肉眼看不到。重新整理电路后,功能明显成功。至此,本次的单片机课程设计圆满结束。 五 电路实拍: 电路板正面: 电路板背面: 六 总结心得体会: 通过这一次的单片机实训,让我对单片机这一门知识有了更深的认识,更锻炼了我独立解决问题独立思考的能力,在电路设计和程序设计的过程中我们遇到了很多问题和困难,但通过大家的讨论和老师的指点之后,一切的问题都一一被解决,但单片机的学习并不是那么的简单,在最后也是最关键的程序调试的过程中,我们又遇到了很多更难的更棘手的问题,电路焊接完好也会出现诸多类似于不实现功能或是出现混乱显示的情况,真的很让人头疼,但,大家都还是咬牙坚持了下来,最后很多电路虽然依旧还是没能实现功能,但我们努力顽强克服重重困难的精神,是大家有目共睹的,就算是失败了,也依旧是很值得的一次经历.,与此同时,也有很多同学试验成功,看着大家脸上洋溢的笑容,大家无论失败成功都从这次的实训中学到了很多很多的东西 七 参考文献: 胡健 主编 《单片机原理及接口技术》 张大明 主编 《单片机控制实训指导及综合应用实例》李勋、林广艳《单片机微型计算机大学读本》 机械工程出版社 机械工业出版社 北京航空航天大学出版社16第四篇:单片机实训报告
第五篇:单片机实训报告