第一篇:单片机最小系统实验总结
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、掌握并理解单片机最小系统的原理及制作, 牢记最小系统中各元器件 的参数及各元器的作用./
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;
} }
七、实训心得
高职高专教育培养的是技术应用型人才,学校为了陪养我们的创新精神和工程实践能力,提高我们的综合素质,我们进行实训,在实践中相互学习和进步。通过实践我们更清楚的认识了我们所学习专业在实践中的运用。也感觉到理论和实践的差距。
八、附件
单片机最小系统生成原理图
第三篇:CAD课程设计51单片机最小系统报告
目录
第一章、功能要求„„„„„„„„„„„„„„„2 第二章、原理图设计„„„„„„„„„„„„„„3 2.1 元器件的绘制„„„„„„„„„„„„„„„3 2.2 绘制原理图„„„„„„„„„„„„„„„„6 第三章、PCB板的绘制„„„„„„„„„„„„„9 第四章、设计心得与体会 „„„„„„„„„„„10
第一章
功能要求
此次设计是一个51单片机的最小系统,整个系统包括电源电路、AD转换电路、51单片机主控芯片、温度采集电路、串口部分、复位电路等,其中P1口设计了一个4×4的矩阵键盘,P2口和P2口作为段选和片选的地址线,以驱动数码管的静动态显示,P3口就是一个控制口了,有接串口、复位和时钟电路。此电路的设计是想利用18B20这一芯片实现温度的采集,并进行AD转换输出。第二章
原理图的设计
原理图的设计,会影响到后来的PCB板的规划,所以最初的设计就必须最优的设计方案,设计方案的选择、元器件的选择等,是至关重要的环节。
所有的项目的设计,都需要在最初建立一个项目,文件菜单栏中的创建PCB项目,以下所有的工作都在此项目中完成。
图2
建立项目
2.1
元器件的绘制
原理图的绘制之前都需要装载元器件库,选择“元器件“,在如下窗口中找到自己需要的元器件安装。
图2.1
元件库安装
由于元器件库里大部分的元器件都没有,所以大部分都需要绘制,建立自己 3 的组件库。绘制元器件的过程如下:
打开DXP软件,在文件菜单栏里面创建原理图元件库,就会产生一个以Schlib为后缀的文件,在编辑区的中心有一个十字坐标轴将元件编辑区分成4个象限,但是我们一般在第四象限绘制。根据原理图上面器件的形状,在放置一栏中放置元件的外形,再依次放置引脚,引脚的标注根据需要而修改,并且设置管脚属性,最后设置元件的属性,其中包括元件的封装和仿真参数。
图2.2 创建器件库
这里还要介绍一下元件的封装。也是在文件菜单栏中创建PCB库,在工具一栏中选择新元件,在元件封装向导的指引下规定封装的形式和引脚规格,这包括封装的类型和各引脚之间的距离,引脚的大小等等,最后保存。同时要在之前画的元件的图中找到此封装,将两者关联起来。这才算完成一个元器件的绘制。
这里列举几个元器件图:
1、AD转换部分:TLC5649和5620都是AD转换部分使用到的芯片,这里是自己绘制的,包括封装。
图2.3 AD-TLC5649
图2.4 TLC5620 2.主控电路:这部分主要是包括51单片机及其周围一些接口电路和排阻,4个并口所接的芯片都是自己绘制的。
图2.5
STC89C52
图2.6 HEADER16 2.2
绘制原理图
在DXP的软件中,在文件菜单栏中创建原理图,会产生一个以SCHDOC为后缀的文件,按照图纸,以此绘制原理图,移进相应的元器件,其中会用到电源线、地线、总线、导线等进行连接,并且一些简单的电阻和电容还是可以在元件库中找到。放置元器件、导线,绘制的过程中注意各器件的安排,要适合整张图纸,使全体美观且便于检查,并学会快捷键的使用
子图部分:
这次的最小系统的设计涉及到了子图,采用自上而下的方法,从母图开始逐步细化,是DXP设计下的层次结构体现的淋漓尽致,给读书更直观、更清晰的理解。在“文件”菜单栏中创建原理图,但是绘制的时候是采用工具栏中的一些图标,例如 放置方块电路和方块端口,对其设置属性和相应的电路参数。再绘制子图,“设计”栏中选择“根据符号创建图纸”即可。绘制过程中注意母图和子图的关联性和对应。图示即为母图和子图:
1、串口部分:串口部分是为了给单片机下载需要的程序,用到的MAX232和串口。
图2.7
串口的母图和子图 2、4×4的矩阵键盘
图2.8 矩阵键盘母图
图2.9 矩阵键盘的子图
3、蜂鸣器:
图2.10
蜂鸣器的母图和子图
4、数码管显示:
图2.11 数码管的母图和子图
最后所有的部分完成及可见完整的原理图如下:
图2.12
51单片机最小系统原理图
绘制完整后,在“项目管理”菜单栏中检查是否有错误,在“设计”菜单栏中选中“设计项目的网络表”,其中是选择Protel选项。此步是为了PCB板子的绘制做准备的,所以不可缺少.第三章
PCB图的绘制
原理图的“项目管理”菜单栏中选择“追加新文件到项目中”的“PCB文件”,就打开了PCB文件,首先要保存。最初要设置PCB板子的规则,包括导线的宽度、板子的层数、孔的大小等。
然后,在机械层画出板子的大小,并且以能放进所有元件切板子小而优,导入网络表和元器件封装,这就要检查其中是否有错误,我们发现有几处的封装做的不是很完整,所以进行了修改(如果看不见原理图,可缩小再看),将其移近所画范围中,我们可以看见其中的飞线,那是说明这其中的连接。
然后手动布局,将所有器件移到最适合的位置,根据最初的设计规则,在一层或者两层连线(注意连线的过程中在转折处不要形成直角,否则会尖端放电,并且连线之前要考虑全局,不要给自己造成无路可走的局面),也可自动布线。
当所有的连线完成,调整布线的布局使其更加美观。
图3.1 PCB板
最后可在“工具”菜单栏中检查是否有错误,我们发现其实很多细节的地方,连线没有连到位,所以是断线状态,通过将图放大后修改完成。如果有需要,可以给PCB板覆铜。
最后生成器件清单,在“报告”菜单栏中就可做到。并将其以Excel方式保存。第四章
设计心得与体会
通过此次的课程设计,掌握了更多DXP程序工作的基本过程和任务。本次设计由于是本身就有的图纸,所以绘制原理图的过程中没有很大的问题,但是元器件的绘制比较麻烦,期间有查阅相关书籍,询问了同学;并且PCB板的绘制,遭遇到布局不优良的问题,给设计造成了一些阻碍。但是因为本次设计比平时上课的内容要复杂,比如子图的内容,知道了原理图的层次结构给设计带来的方便,所以还是得到不少锻炼。对于器件的绘制更加熟悉了。也激起了对课程学习的更大兴趣,并且对于单片机的相关知识也加深了许多,可以说是一举两得。这次是自己真正学习的过程,并且完成论文的过程中又学会了使用更多的截图工具,所以算是意外的收获,以后还要继续努力。
参考文献:
1、邵群涛主编,《电气制图与电子线路CAD》,北京:机械工业出版社,2005。
2、程昱主编《精通 Protel DXP电路设计》
清华大学出版社。
第四篇:单片机实验总结
单片机原理及接口技术实验总结
本学期的单片机实验转眼已到尾声,共做了六项实验,分别是KEIL4、ISP下载软件的安装于使用、P1口输出循环灯实验、P1口转弯灯实验、P3.3口输入P1口输出实验和中断实验。在王承林老师的带领与指导下,我们认真完成每次的实验任务,并在实验中拓展,去发现一些新的问题。
在这六项实验中让我刻骨铭心的是中断实验。中断可以说是我的一个弱点,首先从概念上我理解比较含糊,理解能力差;其次,6个中断源比较难记清,经常记混,加之它们分配的寄存器存在太多的异同,工作方式更是让人头疼;再次,中断的使用。中断的精髓是在于使用,在电路设计中使用中断来控制单片机的工作,使之更好的达到所需目的。我刚开始学习的时候连怎么使用中断还是一无所知,后来我到图书馆里查找资料,慢慢的琢磨。至今学会了中断源的4种工作方式,能简单设计出中断电路。虽然起步晚,但我相信能厚积薄发,未来一定能熟练使用它们。
经过学习单片机的中断控制,我发现自己存在许多不足,但这些都困难无法阻挡我对单片机的追求。许多同学在做实验时都抱着不良的心态,他们只想照着实验本的步骤原原本本把实验完成就算大功告成,很少更深层次挖掘里面的奥秘,更有甚者是打酱油的,我不得不为他们如此浪费那么好的学习机会感到可惜。我能为他们做的就是帮助他们讲解一些单片机知识,有时教他们编写程序。实验室是培养高层次人才和开展科学研究的重要基地。邢台学院对培养学生的动手能力是十分重视的,为了提高学生的动手能力,让学生做相关实训并完成单片机实验,在实验的形式上注重培养学生的实验技能和动手能力。从单片机实验中学生就可以总结出大量的经验以适应当代社会的发展。
学习单片机这门课程,要掌握单片机指令系统中汇编语言各种基本语句的意义及汇编语言程序设计的基本知识和方法,以及单片机与其他设备相连接的输入输出中断等接口技术。使我从硬件软件的结合上理论联系实际,提高动手能力,从而全面掌握单片机的应用。
单片机课是一门实践性很强的课程,仅有课堂上理论知识的学习,对运用好单片机是完全不够的,必须亲自做实验,从实验中吸取教训,总结经验,增加实战经验,加深对单片机的理解,更好的运用单片机。单片机实验课的目的就是为学生提供做实验的机会,让学生能够从几个简单的实验中学会单片机开发的过程和单片机的实际运用。单片机实验课让我将课堂上学到的理论知识运用到实验当中去,在实验中发现问题,解决问题,强化理论知识的运用。下面是自己做实验当中遇到的一些问题和体会。
首先,自己在实验课上对老师讲解的东西没有很好的领会。自己觉得老师讲的电路和原理自己都懂,就没有认真听老师的讲解,但是当自己去理解程序和修改程序就发现自己对电路的工作原理和过程并不是很了解,使得自己在改编程序实现不同功能时遇到较多的问题。
其次,自己对汇编语言的运用不是很熟练。自己之前接触和使用的编程语言都是诸如C语言等的高级语言,对汇编语言基本上是空白状态。虽然每个实验老师都给出了参考程序,但是自己理解整个程序的运行过程和程序的功能依然遇到了比较大的困难。这就说明基础薄弱是实验中最大的问题。
最后,也是最突出的一个问题。自己逻辑思维和分析问题的能力比较欠缺。对程序的分析能力不足,不能够很好的理解程序段之间的逻辑关系。同时,自己对实验中遇到的问题不能及时分析并找出解决的办法,知识一味的依赖老师的指导和同学的帮助。这也提醒自己,只有多加强锻炼,才能不断提高这方面的能力。
六周的时间说短不短,说长不长,因为在这个不同寻常的六周时间里,我除了做实验,还到图书管理查阅了许多与单片机相关的书籍,学习用C语言编写程序,艰苦奋斗,使我在单片机学习上有了质的飞跃。现在的我虽然不是学习最好的,可是我已经改变过去一事无成的我,如今站在大家面前是个全新的我。我始终梦想着以后自己能在单片机行业上有所建树,经过自己的双手创造无价的财富,成就感伴随终生。
身存在的不足之处。而且这也激发了我今后努力学习的兴趣。
发现问题、提出问题、分析问题、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
1、不管做什么事,计划是很重要的。没有一个完好的计划,做事情就会没有一个好的顺序,做事情会比较乱,很难成功。而有一个好的计划,不管做什么事都会事半功倍,做事心中有数,明确重点和缓急,不会有疏漏。这样才能提高成功率。
2、做事要多动脑,选出最好的方法。一件事往往有多种解决方法,一个好的方法,不仅能使事情事半功倍,而且往往决定最后的成与败,所以做事时一定要多动一下脑筋,想出最好的方法。
3、要注意细节。细节决定成败,这句话在这次课题中不仅一次得到了印证,特别是在软件的编程过程中,一点点的错误就会使你整个程序不能运行。因此我们不仅仅要有整体意识,也要注意细节,不要因一个关键地方的一个细节而导致满盘皆输。
4、最后,也是最重要的一点,通过这次课题,我们学到了很多有关单片机方面的知识,也对单片机有了更深入的了解。使我们受益匪浅。
总之,亲自动手是课堂学习的延续,电子领域随时随地都在发生着翻天覆地的变化,现有的知识储备总是落后于科技的发展脚步,我们只有不断学习新知识,才能做到面对新课题时游刃有余。
感谢王承林老师的教育指导!
教会我单片机应用技术,使我受益终生。
第五篇:单片机实验代码总结
编者:方园
单片机实验代码集合(by fangyuan)
1.多字节累加程序:
ORG 0000H LJMP MAIN ORG 0030H;将加数和被加数送到指定地址 MAIN: MOV 20H,#45H
MOV 21H,#74H
MOV 30H,#67H
MOV 31H,#28H
;低位相加
MOV A,21H
ADD A,31H
DA A
MOV 42H,A
;高位相加
MOV A,20H
ADDC A,30H
DA A
MOV 41H,A
CLR A
ADDC A,#0
MOV 40H,A
SJMP $ END
2.数据交换实验
编写程序,实现以下操作:
【功能1】产生数组Hex1:0H、1H、2H、„ 0FH,存储到片内RAM区中,数组Hex1的首地址为30H。
【功能2】产生数组Hex2:0FH、0EH、0DH、„ 0H,存储到片外RAM区中,数组Hex2的首地址为3000H。
【功能3】将片内RAM数组Hex1与片外RAM数组Hex2交换内容。
代码:
ORG 0000H
Hex1 EQU 30H
;定义内部RAM数组首地址
Hex2 EQU 3000H;定义外部RAM数组首地址
编者:方园
LJMP MAIN
ORG 0030H MAIN:
MOV SP,#4FH
;定义栈顶地址
MOV R7,#16
MOV R0,#Hex1
MOV DPTR,#Hex2
LCALL HEX1DE
;调用内部送数据函数
LCALL HEX2DE;调用外部送数据函数
LCALL XCHDE;调用交换函数
SJMP $
ORG 0100H
;内部送数据
HEX1DE: PUSH 00H
PUSH 07H
MOV A,#0 LOOP1: MOV @R0,A
INC A
INC R0
DJNZ R7,LOOP1
POP 07H
POP 00H
RET
;外部送数据
HEX2DE: PUSH 07H
PUSH DPL
PUSH DPH
MOV A,#0FH LOOP2: MOVX @DPTR,A
DEC A
INC DPTR
DJNZ R7,LOOP2
POP DPH
POP DPL
POP 07H
RET
;交换子程序 XCHDE:
LOOP3: MOVX A,@DPTR
XCH A,@R0
编者:方园
END
MOVX @DPTR,A INC R0 INC DPTR DJNZ R7,LOOP3 RET
3.查表实验
1、《单片机原理及应用实验教程》(第2版)“第2章 实验3”(P49)。要求: 16进制数(00H~0FH)ASCⅡ码表定义在内部ROM中(用伪指令定义);R0为片内RAM区Hex数组指针;R1为片内RAM区Asc数组指针;数据块长度放在寄存器R2中。
代码如下:
ORG 0000H
Hex EQU 40H
Asc EQU 50H
LJMP MAIN
ORG 0030H MAIN:
MOV R2,#16
MOV DPTR,#TABLE
MOV R0,#Hex
MOV R1,#Asc
MOV SP,#2FH
LCALL FUZHI
LCALL ZHUANHUAN
SJMP $
TABLE:
DB '0123456789'
;查表子程序 ORG 1000H ZHUANHUAN:
PUSH 00H
PUSH 01H
PUSH 02H LOOP1:
MOV A,@R0
编者:方园
MOVC A,@A+DPTR
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP1
POP 02H
POP 01H
POP 00H
RET
;R0送值子程序 FUZHI:
PUSH 00H
PUSH 01H
PUSH 02H
MOV A,#0 LOOP2:
MOV @R0,A
INC R0
INC A
DJNZ R2,LOOP2
POP 02H
POP 01H
POP 00H
RET END
2、编写用@A+PC指令的查表程序,实现用查表方式将片内RAM中16进制数组Hex(00H~0FH)转换为ASCⅡ码并存入片内RAM数组Asc中。要求:
16进制数(00H~0FH)ASCⅡ码表在内部ROM中; R0为片内RAM区Hex数组指针; R1为片内RAM区Asc数组指针; 数据块长度放在寄存器R2中。代码如下:
ORG 0000H
Hex EQU 40H
;内部Hex送数据地址定义
Asc EQU 50H;查表后数据储存地址定义
LJMP MAIN
ORG 0030H MAIN:
MOV R2,#16
MOV DPTR,#TABLE
MOV R0,#Hex
编者:方园
MOV R1,#Asc
MOV SP,#2FH
LCALL FUZHI;送值函数
LCALL CHABIAO;查表函数
SJMP $
ORG 1000H;查表子程序 CHABIAO:
PUSH 00H
PUSH 01H
PUSH 02H LOOP1:
MOV A,@R0
ADD A,#20H
MOVC A,@A+PC
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP1
POP 02H
POP 01H
POP 00H
RET
;R0送值子程序 FUZHI:
PUSH 00H
PUSH 01H
PUSH 02H
MOV A,#0 LOOP2:
MOV @R0,A
INC R0
INC A
DJNZ R2,LOOP2
POP 02H
POP 01H
POP 00H
RET
编者:方园
TABLE:
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H
END
4.十进制数1-100累加运算
《单片机原理及应用实验教程》(第2版)“第2章 实验5”(P30)。编写程序,实现以下功能:
【功能1】产生十进制数1~100,并存放在片外RAM中以1000H为首地址的Deci数组中。【功能2】对Deci数组元素进行累加运算,并将累加和存入内部RAM中60H(存累加和低位)和61H(存累加和高位)单元。代码如下: 方法一:
ORG 0000H
LJMP MAIN
ORG 0030H MAIN:
MOV R7,#100
MOV DPTR,#1000H
MOV SP,#20H
LCALL STEP1
LCALL STEP2
SJMP $
ORG 2000H
STEP1: PUSH 07H
PUSH DPH
PUSH DPL
MOV A,#0
MOV R3,#0 LOOP1: INC A
DA A
XCH A,R3
ADDC A,#0
MOVX @DPTR,A
INC DPTR
XCH A,R3
MOVX @DPTR,A
INC DPTR
DJNZ R7,LOOP1
POP DPL
编者:方园
POP DPH
POP 07H
RET
STEP2: PUSH 07H
PUSH DPH
PUSH DPL
MOV 60H,#0
MOV 61H,#0
MOV R3,#0
LOOP2: INC DPTR
MOVX A,@DPTR
ADD A,60H
DA A
MOV 60H,A
CLR A
ADDC A,61H
DA A
MOV 61H,A
INC DPTR
DJNZ R7,LOOP2
MOV A,#1
ADD A,61H
DA A
MOV 61H,A
POP DPL
POP DPH
POP 07H
RET
END
方法二:
ORG 0000H
LJMP MAIN
ORG 0030H MAIN:
MOV R7,#100
MOV DPTR,#1000H
MOV SP,#20H
编者:方园
LCALL STEP1
LCALL STEP2
SJMP $
ORG 2000H
;送值子函数
STEP1: PUSH 07H
PUSH DPH
PUSH DPL
MOV A,#0 LOOP1: INC A
DA A
MOVX @DPTR,A
INC DPTR
DJNZ R7,LOOP1
CLR A
ADDC A,#0
MOVX @DPTR,A
POP DPL
POP DPH
POP 07H
RET
;累加子函数
STEP2: PUSH 07H
PUSH DPH
PUSH DPL
MOV 60H,#0
MOV 61H,#0
LOOP2:
MOVX A,@DPTR
ADD A,60H
DA A
MOV 60H,A
CLR A
ADDC A,61H
DA A
MOV 61H,A
INC DPTR
DJNZ R7,LOOP2
MOVX A,@DPTR
ADD A,61H
DA A
编者:方园
MOV 61H,A POP DPL POP DPH POP 07H RET
END
5.DPTR指针应用
《单片机原理及应用实验教程》(第2版)“第2章 实验6”(P31)。编写程序,实现以下功能:
【功能1】产生十进制数组Deci(1~99),并存放在片内RAM中,Deci数组首地址为08H。【功能2】将Deci数组中的偶数元素全部送入外部RAM偶数区,首地址为2000H;将Deci数组中的奇数元素全部送入外部RAM奇数区,首地址为3000H;分别统计外部RAM偶数区和奇数区元素个数。代码如下:
ORG 0000H
LJMP MAIN
ORG 0030H MAIN:
MOV SP,#70H
MOV R7,#99
MOV R0,#08H
MOV R5,#0
MOV R6,#0
LCALL STEP1
LCALL STEP2
SJMP $
STEP1: PUSH 00H
PUSH 07H
MOV A,#1 LOOP1: DA A
MOV @R0,A
INC R0
INC A
DJNZ R7,LOOP1
POP 07H
POP 00H
RET
编者:方园
STEP2: MOV DPTR,#2000H
PUSH DPL
PUSH DPH
MOV DPTR,#3000H
MOV R3,DPH
MOV R4,DPL LP1: MOV A,@R0
MOV R2,A
JNB ACC.0,LOOP2
SJMP LOOP3
LOOP2: POP DPH
POP DPL
MOVX @DPTR,A
MOV A,R5
ADD A,#1
DA A
MOV R5,A
INC DPTR
PUSH DPL
PUSH DPH
SJMP NEXT
LOOP3: MOV DPH,R3
MOV DPL,R4
MOVX @DPTR,A
MOV A,R6
ADD A,#1
DA A
MOV R6,A
INC DPTR
MOV R3,DPH
MOV R4,DPL
SJMP NEXT
NEXT:
INC R0
DJNZ R7,LP1
POP DPH
POP DPL
RET
END
编者:方园
6.定时器应用实验
DBUF EQU 30H ORG 0000H STRT: LJMP MAIN ORG 000BH LJMP PTF00 ORG 0030H MAIN: MOV DPTR,#5FFFH MOV A,#0DCH MOVX @DPTR,A MOV R5,#20 LP: MOVX A,@DPTR JNB ACC.7,LP MOV A,#00H MOVX @DPTR,A MOV A,#34H MOVX @DPTR,A MOV SP,#60H MOV R0,#39H MOV R7,#06H ML1: MOV @R0,#00H INC R0 DJNZ R7,ML1 MOV TMOD,#01H MOV TL0,#0B0H MOV TH0,#3CH SETB TR0 MOV IE,#82H MOV 40H,#10H ML0: LCALL DIR LJMP ML0 PTF00: PUSH PSW PUSH ACC SETB PSW.3 MOV TL0,#0B0H MOV TH0,#3CH
编者:方园
DJNZ R5,PTFY MOV R5,#20
MOV A,40H DEC A MOV 40H,A JNZ PTFY MOV 40H,#10H MOV R0,#39H MOV R7,#6 PTFX: MOV A,@R0 ADD A,#1 DA A MOV @R0,A CJNE A,#0AH,$+3 JC PTFY MOV @R0,#0 INC R0 DJNZ R7,PTFX PTFY: POP ACC POP PSW RETI DIR:
MOV R3,#06H MOV A,#92H MOV DPTR,#5FFFH MOVX @DPTR,A MOV R1,#39H TY11: MOV A,@R1 MOV DPTR,#CODE1 MOVC A,@A+DPTR MOV DPTR,#5FFFH MOVX @DPTR,A
INC R1 DJNZ R3,TY11 RET
CODE1: DB 0C0H,0F9H,0A4H,0B0H,99H DB 92H,82H,0F8H,80H,90H,88H
编者:方园
DB 83H,0C6H,0A1H,86H,8EH,8CH DB 0C1H,89H,0C7H,0BFH,91H DB 00H,0FFH END
7.广告灯实验
ORG 0000H LJMP MAIN ORG 000BH LJMP DELAY ORG 0030H MAIN: MOV DPTR,#TAB MOV R5,#71H MOV R2,#00H MOV R6,#20 MOV TMOD,#01H MOV TL0,#0B0H MOV TH0,#3CH SETB TR0 MOV IE,#82H SJMP $ DELAY: MOV TL0,#0B0H MOV TH0,#2CH
DJNZ R6,LP ACALL STEP MOV R6,#20 DJNZ R5,LP MOV R5,#71H
LP: RETI
STEP: LOOP: MOV A,R2 MOVC A,@A+DPTR MOV P1,A INC R2 DEC R5
编者:方园
RET
TAB:DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
DB 0FFH,7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH
DB 0FEH,0FFH,0FEH,0FCH,0F8H,0F0H,0E0H,0C0H
DB 80H,00H,80H,0C0H,0E0H,0F0H,0F8H,0FCH
DB 0FEH,0FFH,7FH,3FH,1FH,0FH,07H,03H
DB 01H,00H,01H,03H,07H,0FH,1FH,3FH
DB 7FH,0FFH,7EH,3CH,18H,00H,18H,3CH
DB 7EH,0FFH,0FEH,0FCH,0FCH,0F9H,0F3H,0E7H
DB 0CFH,9FH,3FH,7FH,0FFH,7FH,3FH,9FH
DB 0CFH,0E7H,0F3H,0F9H,0FCH,0FEH,0FFH
DB 0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,80H,00H
DB 80H,40H,20H,10H,08H,04H,02H,01H,00H
DB 01H,02H,04H,08H,10H,20H,40H,80H,00H
DB 80H,0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH END