单片机选修实验报告
实验目的:
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单片机编程的入门知识,并实现了用单片机控制系统控制小车完成前进一米的目标,并且完成了在规定时间内走完一米的任务。今后下一步希望实现的目标是,让小车的数码管显示特定的信息,高级功能包括智能车实现寻迹,走迷宫避开障碍物等。
单片机选修实验报告
实验目的:
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单片机编程的入门知识,并实现了用单片机控制系统控制小车完成前进一米的目标,并且完成了在规定时间内走完一米的任务。今后下一步希望实现的目标是,让小车的数码管显示特定的信息,高级功能包括智能车实现寻迹,走迷宫避开障碍物等。