北邮单片机公选课实验报告 - 范文中心

北邮单片机公选课实验报告

01/26

单片机选修实验报告

实验目的:

1. 学习单片机编程的入门知识,以及焊接技术,并 2. 通过计数器控制小车直线行走一米, 3. 通过计数器,实现小车在规定时间内前进一米

实验原理及步骤:

硬件部分:

1. 小车采用两轮轮驱动,能够控制小车的前进,前端有不是驱动的轮子,起到支撑

小车的作用。

系统结构框图

2. 电机驱动模块

L298N 驱动直流电机,它靠两个引脚控制一个电机的运动。小车采用四轮驱

动,小车两侧的电机短接起来各接到L298N 的一个输出端。通过调制两边轮子的转速或正反转来达到控制小车转向的目的。芯片引脚和功能如图1,驱动电路如图2。

3. 电机模块

电机模块采用2块电机同时驱动,这里将同一侧电机短接接到L298N 的一个输出端。

4. 电源模块

采用两片7805电压稳压5V 后给单片机系统和其他芯片供电供电,但缺点是压降过大,消耗的功率过大,发热量过大,我们加了散热片,减小了芯片的温度。

5. 小车直行设计:

若要求小车直走,这需要给4个电机正转命令。根据L298N 芯片手册

这里将P1=0xfa。 6. 时钟电路

80C51虽然有内部振荡电路,但要形成时钟,必须外部附加电路。80C51单片机的时钟产生方法有两种。内部时钟方式和外部时钟方式。

本设计采用内部时钟方式,利用芯片内部的振荡电路,在XTAL1、XTAL2引脚上外接定时元件,内部的振荡电路便产生自激振荡。本设计采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHZ 到12MHZ 之间选择。电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小、振荡电路起振速度

有少许影响,CX1、CX2可在20pF 到100pF 之间取值,但在60pF 到70pF 时振荡器有较高的频率稳定性。所以本设计中,振荡晶体选择6MHZ, 电容选择65pF 。

在设计印刷电路板时,晶体和电容应尽可能靠近单片机芯片安装,以减少寄生电

容,更好的保证振荡器稳定和可靠地工作。为了提高温度稳定性,应采用NPO 电容。 7. 复位电路

80C51的复位是由外部的复位电路来实现的。复位引脚RST 通过一个斯密特触发器用来抑制噪声,在每个机器周期的S5P2, 斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。

复位电路通常采用上电自动复位和按钮复位两种方式。

最简单的上电自动复位电路中上电自动复位是通过外部复位电路的电容充电来实现的。只要Vcc 的上升时间不超过1ms, 就可以实现自动上电复位。时钟频率用6MHZ 时C 取22uF,R 取1K Ω。

除了上电复位外,有时还需要按键手动复位。本设计就是用的按键手动复位。按键手动复位有电平方式和脉冲方式两种。其中电平复位是通过RST 端经电阻与电源Vcc 接通而实现的。按键手动复位电路见图3.2。时钟频率选用6MHZ 时,C 取22uF,Rs 取200Ω,R K 取1K Ω。

图3.2 80C51复位电路

本设计调速采用PWM 调速[5]: 8. 脉宽调制原理:

脉宽调制器本身是一个由运算放大器和几个输入信号组成的电压比较器。运算放

图3.4 双极式H 型可逆PWM 变换器电路原理图

大器工作在开换状态,稍微有一点输入信号就可使其输出电压达到饱和值,当输入电压极性改变时,输出电压就在正、负饱和值之间变化,这样就完成了把连续电压变成脉冲电压的转换作用。加在运算放大器反相输入端上的有三个输入信号。一个输入信号是锯齿波调制信号,另一个是控制电压,其极性大小可随时改变,与锯齿波调制信号相减,从而在运算放大器的输出端得到周期不变、脉宽可变的调制输出电压。只要改变控制电压的极性, 也就改变了PWM 变换器输出平均电压的极性, 因而改变了电动机的转向. 改变控制电压的大小, 则调节了输出脉冲电压的宽度, 从而调节电动机的转速. 只要锯齿波的线性度足够好, 输出脉冲的宽度是和控制电压的大小成正比的.

2、逻辑延时环节:

在可逆PWM 变换器中, 跨接在电源两端的上下两个晶体管经常交替工作. 由于晶体管的关断过程中有一段存储时间和电流下降时间, 总称关断时间, 在这段时间内晶体管并未完全关断. 如果在此期间另一个晶体管已经导通, 则将造成上下两管之通, 从而使电源正负极短路. 为避免发生这种情况, 设置了由RC 电路构成的延时环节.

3、电源的设计

本设计的电源为4节1.5v 的干电池提供。

附小车截图:

软件部分:

/*-------------------------------------------------------------------------- SST89x55x.H

Header file for 8-bit SST microcontrollers.

Copyright (c) 2002 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved.

--------------------------------------------------------------------------*/

/* BYTE Registers */ sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0xA0; sfr P3 = 0xB0;

sfr PSW = 0xD0;

sfr ACC = 0xE0; sfr B = 0xF0; sfr SP = 0x81; sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8; sfr IP = 0xB8; sfr SCON = 0x98; sfr SBUF = 0x99;

/* 8052 Extensions */ sfr T2CON = 0xC8; sfr T2MOD = 0xC9; sfr RCAP2L = 0xCA; sfr RCAP2H = 0xCB; sfr TL2 = 0xCC; sfr TH2 = 0xCD;

/* 89E564 Extensions */ sfr IPA = 0xF8; sfr IEA = 0xE8; sfr SADEN = 0xA9; sfr SPSR = 0xAA; sfr AUXR1 = 0xA2; sfr AUXR = 0x8E; sfr WDTD = 0x85; sfr SPDR = 0x86; sfr SFCF = 0xB1; sfr SFCM = 0xB2; sfr SFAL = 0xB3; sfr SFAH = 0xB4; sfr SFDT = 0xB5; sfr SFST = 0xB6; sfr IPH = 0xB7; sfr SPCR = 0xD5; sfr IPAH = 0xF7;

/* BIT Registers */ /* PSW */

sbit CY = PSW^7; sbit AC = PSW^6; sbit F0 = PSW^5; sbit RS1 = PSW^4; sbit RS0 = PSW^3; sbit OV = PSW^2;

sbit P = PSW^0; //8052 only

/* TCON */

sbit TF1 = TCON^7; sbit TR1 = TCON^6; sbit TF0 = TCON^5; sbit TR0 = TCON^4; sbit IE1 = TCON^3; sbit IT1 = TCON^2; sbit IE0 = TCON^1; sbit IT0 = TCON^0;

/* IE */

sbit EA = IE^7;

sbit ET2 = IE^5; //8052 only sbit ES = IE^4; sbit ET1 = IE^3; sbit EX1 = IE^2; sbit ET0 = IE^1; sbit EX0 = IE^0;

/* IP */

sbit PT2 = IP^5; sbit PS = IP^4; sbit PT1 = IP^3; sbit PX1 = IP^2; sbit PT0 = IP^1; sbit PX0 = IP^0;

/* P3 */

sbit RD = P3^7; sbit WR = P3^6; sbit T1 = P3^5; sbit T0 = P3^4; sbit INT1 = P3^3; sbit INT0 = P3^2;

sbit TXD = P3^1; sbit RXD = P3^0;

/* SCON */

sbit SM0 = SCON^7; sbit SM1 = SCON^6; sbit SM2 = SCON^5; sbit REN = SCON^4; sbit TB8 = SCON^3; sbit RB8 = SCON^2; sbit TI = SCON^1; sbit RI = SCON^0;

/* P1 */

sbit T2EX = P1^1; // 8052 only sbit T2 = P1^0; // 8052 only /* T2CON */

sbit TF2 = T2CON^7; sbit EXF2 = T2CON^6; sbit RCLK = T2CON^5; sbit TCLK = T2CON^4; sbit EXEN2 = T2CON^3; sbit TR2 = T2CON^2; sbit C_T2 = T2CON^1; sbit CP_RL2 = T2CON^0;

sbit LED1 = P2^7; sbit LED2 = P2^6;

unsigned int gate = 0;

unsigned char pos[] = { 0xdf , 0xef , 0xf7 , 0xfb , 0xfd , 0xfe } ;

unsigned char seg_data[] = { 0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 0x80 , 0x90 } ; unsigned char hour , min , sec ;

char dec_bcd_high( char a ) {

char i = 0 ;

while ( a >= 10 ) {

i = i + 1;

a = a - 10 ;

}

return i ;

}

char dec_bcd_low( char a )

{

while ( a >= 10 )

{

a = a - 10 ;

}

return a ;

}

void show()

{

char i=0;

int j ;

i = dec_bcd_high( hour );

P2 = pos[0] ;

P0 = seg_data[ i ] ;

for ( j = 0 ; j

i = dec_bcd_low( hour );

P2 = pos[1] ;

P0 = seg_data[ i ] ;

for ( j = 0 ; j

i = dec_bcd_high( min );

P2 = pos[2] ;

P0 = seg_data[ i ] ;

for ( j = 0 ; j

i = dec_bcd_low( min );

P2 = pos[3] ;

P0 = seg_data[ i ] ;

for ( j = 0 ; j

i = dec_bcd_high( sec );

P2 = pos[4] ;

P0 = seg_data[ i ] ;

for ( j = 0 ; j

i = dec_bcd_low( sec );

P2 = pos[5] ;

P0 = seg_data[ i ] ;

for ( j = 0 ; j

}

void time()

{

gate = gate + 1;

if ( gate

gate = 0;

sec = sec + 1 ;

if ( sec == 99 )

{

sec = 0 ;

min = min + 1 ;

if ( min == 60 )

{

min = 0 ;

hour = hour + 1 ;

if ( hour == 24 )

{

hour = 0 ;

}

}

}

}

unsigned char g_pwm_max = 70 ;

unsigned char g_pwm = 0 ;

void pwm()

{

if ( g_pwm

{

ctrl = '1' ;

}

else

{

ctrl = '0' ;

}

}

void timer_init()

{

TMOD=0x22; /* T1工作模式:

TR1=1可启动定时器,与INT1~无关

T1定时

16位计数器

T0工作模式:

TR0=1可启动定时器,与INT0~无关

T0定时

16位计数器*/

TH1=0x00; //T1初值十进制为:15536 晶振:6Mhz 溢出周期:100ms

TL1=0xcc;

TH0=0x00; //T0初值十进制为:15536 晶振:6Mhz 溢出周期:100ms

TL0=0xcc;

}

void int0_int() interrupt 0

{

}

void int1_int() interrupt 2

{

}

unsigned int g_timer = 0 ;

void timer0_int() interrupt 1

{

//TH0=0xec; //T0初值十进制为:15536 晶振:6Mhz 溢出周期:10ms

//TL0=0x78;

//time();

if ( g_timer

{

g_timer ++ ;

g_pwm ++ ;

if ( g_pwm == 100 )

{

g_pwm = 0 ;

}

}

else

{

g_timer = 0 ;

}

}

main()

{

hour = 12 ;

min = 0 ;

sec = 0 ;

SCON = 0x20 ;

timer_init();

TR1=1; //T1软启动

TI=1;

//ET0 = 1;

//EA =1 ;

//TR0=1; //T0软启动

TCON=0x50; //控制寄存器

SBUF = 'A' ;

while( 1 )

{

pwm();

// show();

// time ();

}

}

实验总结:

通过这次单片机全校公选课,我们小组成员各自都有不同的收获,锻炼了团队协作的精神,提高了动手能力,学会了电路板的基本焊接技术,以及c51单片机编程的入门知识,并实现了用单片机控制系统控制小车完成前进一米的目标,并且完成了在规定时间内走完一米的任务。今后下一步希望实现的目标是,让小车的数码管显示特定的信息,高级功能包括智能车实现寻迹,走迷宫避开障碍物等。


相关内容

  • 北邮期中信息论附加题实验报告
    信息论实验报告 3. Matlab 仿真实验:掷骰子游戏,每次同时抛掷两枚骰子,将两枚骰子点数的和作为游戏结果,重复抛掷 1000 次(视为 1000 次信源符号输出).要求: (1) 对 1000 次游戏结果进行逐符号二进制定长编码和译码 ...
  • [精品]高中课程设置方案
    篇一:高中课程设置方案 陕西省从20XX年秋季开始全面实施普通高中新课程,根据教育部颁布的<基础教育课程改革纲要(试行)><普通高中课程方案(试验)><关于进一步加强普通高中新课程实验工作的指导意见>和陕 ...
  • 面向应用型人才培养的网络工程专业课程体系探索与实践
    文章编号:1672-5913(2009)19-0134-06 面向应用型人才培养的网络工程专业课程体系探索与实践 郭广军1,羊四清1,戴经国1,龚德良2 (1.湖南人文科技学院 计算机科学技术系,湖南 娄底 417000:2.湘南学院 计算 ...
  • 数据库实验报告
    数据库技术I 实验报告 系别:计算机科学与技术 班级:计11-2班 姓名:XXX 学号:[1**********] 成绩: 评语: 指导教师签字: 日期: <数据库技术I >实验报告 一. 实验题目 掌握SQL Server 2 ...
  • 微处理器与应用实验报告
    微处理器原理与应用实验日志 微处理器原理与应用实验日志一 指导教师 实验时间: 学院 专业 班级 学号 姓名 实验室 实验题目: 熟悉并使用传送类指令 实验目的: 1. 熟悉并掌握Keil C51 的基本用法: 2. 掌握MCS-51 传送 ...
  • 北邮自动化篮球赛颁奖稿
    亲爱的同学们: 大家下午好! 在自动化院团委学生会的大力支持下,在各代表队的密切配合下,在学生会体育部的精心组织安排下,为期两个月的2016自动化院篮球赛圆满结束了.经过近30场比赛的激烈角逐,运动员们为同学们奉献了一场又一场精彩激烈的比赛 ...
  • 省创新项目结题
    项目编号 __07423___ 福建省大学生创新性实验计划 项目结题表 项 目 名 称: 项 目 负 责 人: 所在学院.年级: 联 系 电 话: 电 子 邮 件: 指 导 教 师: 项 目 起 止 时 间: 填 表 日 期: 基于 MCU ...
  • 20**年1114生命科学实验与探索报告册
    专业班级学 号 [1**********]24 姓 名 王新民 任课教师 上课时间 浙江理工大学生命科学学院 生物化学研究所编 二O一二年九月 ABO血型鉴定 结果与分析 1. 本人的血型: O型 2. 实验班的血型分布: 大米淀粉的糖化作 ...
  • 浙大20**年学生手册题库答案
    1:未报名可以修读辅修专业 对 2:各专业确认选拔标准全校统一 错 3:大一上25学分 大一下30学分 大二上7学分 退学警告 错 4:跨校修读课程 成绩 他校修读本校审核予以承认 对 5:学校可以对人才需求发展变化 学生同意时可以调整学生 ...
  • 数据库原理实验指导书(Mysql)
    数据库原理实验指导书 实验项目列表 实验一:数据库的定义实验 一.实验目的: 1.理解MySQL Server 6.0 服务器的安装过程和方法: 2.要求学生熟练掌握和使用SQL .T-SQL .SQL Server Enterpriser ...