单片机原理及应用实验报告

单片机原理及应用实验报告

老师:

学生:

            专业:电气工程及其自动化

  学院:核自学院

      学号:

实验一蜂鸣器实验

一.         实验目的

利用单片机的P1口作IO口,使用户学会蜂鸣器的使用。

二.         实验设备及器件

IBM PC 机                                 一台

DP-51PROC单片机综合仿真实验仪        一台

频率计                                         一台

三.         实验内容

1.    编写一段程序,用P1.3口控制(输出3K到4K频率的方波),使B5区的蜂鸣器发出嘹亮的响声。

2.    按照例程输入一段程序,用P1.3口控制,使B5区的蜂鸣器发出“生日快乐”的音乐。

图3.3  蜂鸣器原理图

四.         实验步骤

1.    使用导线把A2区的P13与B5区的 BUZZ接线柱相连。

2.    先编写一个延时程序(120~200us)。

3.    再编写一个循环程序,改变P1.3脚的电平,然后延时。这样,这个循环就使P1.3口输出一个频率为2.5KHz-4KHz的方波。在DP-51PROC单片机综合仿真实验仪上运行该程序时,B5区的蜂鸣器将发出嘹亮的响声

4.    按以下例程输入,然后运行,蜂鸣器发出“生日快乐”的音乐。

五、实验修改后源程序

ORG         0000H

        JMP       MAIN

        ORG       000BH

        JMP       INTT0

        ORG       0100H       

MAIN:  

MOV      SP,#60H

        MOV      TMOD,#01H    ;初始化定时器及器中断

        SETB        ET0                              ;开定时器0中断

        SETB        EA

        SETB        TR0                              ;启动定时器0

START0:

SETB  P1.3

        MOV      30H,#00H

NEXT:  

MOV        A,30H

        MOV  DPTR,#TABLE       ;从TABLE中读取数据――声响时间

        MOVC      A,@A+DPTR

        MOV        R2,A

        JZ         ENDD

        ANL       A,#0FH

        MOV      R5,A

        MOV      A,R2

        SWAP       A

        ANL       A,#0FH

        JNZ        SING

        CLR       TR0

        JMP       D1

SING:  

DEC        A

        MOV      22H,A

        RL         A

        MOV      DPTR,#TABLE1         ;从TALBE1中读取数据――声调

        MOVC     A,@A+DPTR

        MOV      TH0,A

        MOV      21H,A

        MOV      A,22H

        RL         A

        INC        A

        MOVC     A,@A+DPTR

        MOV      TL0,A

        MOV      20H,A

        SETB  TR0

D1:    

CALL        DELAY                         ;声音延时

        INC        30H

        JMP       NEXT

ENDD:  

CLR       TR0

        JMP       START0

INTT0:                                                              ;定时器0中断服务程序

        PUSH       PSW

        PUSH       ACC

        MOV  TL0,20H

        MOV  TH0,21H

        CPL        P1.3

        POP       ACC

        POP       PSW

        RETI

DELAY:                                                  ;R5的值就是声响持续时间

MOV        R7,#02

DELAY0:

MOV      R4,#187

DELAY1:

MOV        R3,#248

        DJNZ       R3,$

        DJNZ       R4,DELAY1

        DJNZ       R7,DELAY0

        DJNZ  R5,DELAY

        RET

TABLE: 

DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H

        DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H

        DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H

        DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H

        DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H

        DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H

        DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H

        DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H,00H

TABLE1:

DW 64260,64400,64524,64580,64684,64777,64820,64898

        DW 64968,65030,65058,65110,65157,65178,65217       

END

在keil上编辑后的截图:

编译好后检查出无错误和警告:

下载后:

将程序经图3下载后就可以发出祝你生日快乐的声音。

实验总结:

编辑源程序是注意将指导中的

ORG 8000H

        JMP        MAIN

        ORG       800BH

        JMP        INTT0

        ORG    8100H 

改成:ORG    0000H

        JMP       MAIN

        ORG       000BH

        JMP       INTT0

        ORG       0100H 

在keil上编辑运行时要选择文件的保存属性后缀.ASM 若有错误则不能运行。实验中只要一根导线将A2区的P13与B5区的 BUZZ接线柱相连。

本次实验让我们知道可以通过单片机上运行汇编程序来实现特定的功能如让蜂鸣器循环发出祝你生日快乐的音调。

实验二 电子琴实验

一.         实验目的

利用实验仪上提供的按键K1~K7作为电子琴按键,控制蜂鸣器发声,使用户了解计算机发声原理,熟悉定时器和键盘扫描电路的工作原理及编程方法。

二.         实验设备及器件

IBM PC 机                                    一台

DP-51PROC单片机综合仿真实验仪         一台

频率计                                          一台

三.         实验内容

1. 编写一段程序,用P3.3口控制(输出7种音阶标称频率的方波),使B5区的蜂鸣器发出不同的音调。程序检测按键的状态,当某一键按下时,蜂鸣器发出对应的音调。

2. 按照歌曲的音调,使用D1区的按键K1~K7,弹奏一首简单的音乐。

四.         实验步骤

1. 用导线将A2区P3.3口(INT1)和B5区的BUZZ接口相连,然后将D1区的J53接口和A2区的J61接口一一对应相连。如图3.4所示。

图3.4  实验5原理图

2. 编写按键的动态键盘扫描程序,根据不同音阶的频率编写蜂鸣器的音调控制程序,然后完成电子琴的主程序设计。

3. 调试编写好的程序,使用频率计校准音阶的频率,然后使用键盘演奏一段好听的音乐。

实验修改后程序

  BUZZ    EQU P3.3          ;端口定义

         ORG       0000H

         LJMP     MAIN

         ORG       000BH

         LJMP     INT_T0

         ORG      0100H               

MAIN:  

         MOV      SP,#60H             ;初始化堆栈指针

         MOV        P1,#0FFH          ;设置P1口为输入模式

         MOV     TMOD,#01H    ;设置定时器0为工作模式1

         SETB       ET0                              ;开定时器0中断

         SETB         EA                                ;开总中断

         CLR           TR0                              ;关闭定时器0

START:     

         MOV         R0,P1                

         CJNE         R0,#0FFH,KEY1         ;键盘扫描

         CLR          TR0

         SJMP         START

KEY1:

         CJNE         R0,#0FEH,KEY2        ;K1键按下

         MOV         30H,#0FBH                ;设置音阶1

         MOV         31H,#0E9H

         LJMP         SET_TIMER

KEY2:       

         CJNE         R0,#0FDH,KEY3;K2键按下

         MOV         30H,#0FCH                ;设置音阶2

         MOV         31H,#5CH

         LJMP         SET_TIMER

KEY3:

         CJNE         R0,#0FBH,KEY4;K3键按下

         MOV         30H,#0FCH                ;设置音阶3

         MOV         31H,#0C1H

         LJMP         SET_TIMER

KEY4:

         CJNE         R0,#0F7H,KEY5        ;K4键按下

         MOV         30H,#0FCH                ;设置音阶4

         MOV         31H,#0EFH

         LJMP         SET_TIMER

KEY5:

         CJNE         R0,#0EFH,KEY6        ;K5键按下

         MOV         30H,#0FDH                ;设置音阶5

         MOV         31H,#045H

         LJMP         SET_TIMER

KEY6:

         CJNE         R0,#0DFH,KEY7;K6键按下

         MOV         30H,#0FDH                ;设置音阶6

         MOV         31H,#92H

         LJMP         SET_TIMER

KEY7:

         CJNE         R0,#0BFH,NOKEY;K7键按下

         MOV         30H,#0FDH                ;设置音阶7

         MOV         31H,#0D6H

SET_TIMER:

         SETB         TR0                              ;发声

         SJMP         START

NOKEY:

         CLR           TR0                              ;无键按下

         SJMP         START

INT_T0:                                                  ;T0中断服务程序

         MOV      TH0,30H           ;定时器赋初值

         MOV      TL0,31H

         CPL        BUZZ                           ;输出方波

RETI

;

END

编译好后检查出无错误和警告:

下载到单片机上后点开始:

开始后分别按按键K1~K7就可以发出7种音阶。

实验总结:

首先编写源程序时要将

BUZZ EQU     P3.3           ;端口定义

   ORG    8000H

   LJMP         MAIN

   ORG    800BH

   LJMP         INT_T0

      ORG   8100H  

改成:

BUZZ        EQU P3.3          ;端口定义

         ORG       0000H

         LJMP     MAIN

         ORG       000BH

         LJMP     INT_T0

         ORG      0100H               

设置合适的地址才能正确的运行。

连接导线时要注意用导线将A2区P3.3口(INT1)和B5区的BUZZ接口相连,然后将D1区的J53接口和A2区的J61接口一一对应相连。连接好后按下k1~K 7的按键如能发出7个音阶则证明实验成功。让我们更好的理解了单片机的功能。

实验三 直流电机控制电路设计  

一  设计目的 

1掌握单片机用PWM实现直流电机调整的基本方法,掌握直流电机的驱动原理。 

2学习模拟控制直流电机正转、反转、加速、减速的实现方法。

二  设计要求 

用已学的知识配合51单片机设计一个可以正转、反转或变速运动的直流电机控制电路,并用示波器观察其模拟变化状况。 

三  设计思路及原理 

PWM功率驱动电路如下:

图3.34 直流电机驱动原理图

原理图如图3.34,只要ZDJ_A的电压比ZDJ_B的电压高,电机正转。如果ZDJ_B的电压比ZDJ_A高,电机反转。

利用单片机对PWM信号的软件实现方法。MCS一51系列典型产品8051具有两个定时计数器。因为PWM信号软件实现的核心是单片机内部的定时器,所以通过控制定时计数器初值,从而可以实现从8051的任意输出口输出不同占空比的脉冲波形。从而实现对直流电动机的转速控制。 

。AT89C51的P1.0—P1.2控制直流电机的快、慢、转向,低电平有效。P3.0为PWM波输出,P3.1为转向控制输出,P3.2为蜂鸣器。PWM控制DC电机转速,晶振为12M,利用定时器控制产生占空比可变的PWM波,按K1键,PWM值增加,则占空比增加,电机转快,按K2键,PWM值减少,则占空比减小,电机转慢,当PWM值增加到最大值255或者最小值1时,蜂鸣器将报警 

四  实验器材

DVCC试验箱  导线若 电源等器件                   PROTUES仿真软件  KRIL软件

 五 实验流程与程序

 #include < reg51.h > sbit  K1 =P1^0     增加键 

sbit  K2 =P1^1     减少键 

sbit  K3 =P1^2     转向选择键

 sbit  PWMUOT =P3^0   PWM波输出 

  sbit  turn_around =P3^1  转向控制输出 s

bit  BEEP =P3^2          蜂鸣器 

unsigned int PWM;    void Beep(void); 

void delay(unsigned int n); void main(void) {    

     TMOD=0x11; //设置T0、T1为方式1,(16位定时器)      

TH0=0   65536us延时常数{t=(65536-TH)/fose/12}     TL0=0; 

     TH1=PWM   //脉宽调节,高8位    TL1=0; 

     EA=1;   //开总中断     

 ET0=1;     //开T0中断 

ET1=1;   //开T1中断      TR0=1  // T0定时允许      

while(1)     {    

   if(K3==0&&K1==1&&K2==1)  // 转向    

 { 

    turn_around=!turn_around;          } 

   while(K3==0);  //检测K3是否释放   

do{ 

PWM++  

       if(PWM>0xfe)//防止PWMS计数溢出        

         PWM=0xff;         } 

       if(PWM==0xff)Beep()  响        delay(3000);        

  } 

     while(K1==0&&K2==1);     

 do{ 

       PWM--         if(PWM<1) 

         PWM=1;        } 

       if(PWM==1)Beep()         delay(3000);           } 

     while(K1==1&&K2==0);    } } 

void timer0() interrupt 1 using 2 // 定时器0中断服务程序 {   

    TR1=0    //T1禁止   TH0=0    //置T0定时常数   TL0=0  

  TH1=PWM  //置T1定时常数   TL1=0; 

  TR1=1   //T1允许     PWMUOT=0 // PWM波输出0 }  

void timer1() interrupt 3 using 3 //定时器1中断服务程序 

{  

TR1=0  //T1禁止       PWMUOT=1  //PWM波输出1 } 

void Beep(void)  //蜂鸣器子程序    { 

      unsigned char i;       for (i=0;i<100;i++)         { 

          delay(100); 

          BEEP=!BEEP;                         }  

     BEEP=1;                               delay(100);   }  

void delay(unsigned int n)   {  

while(n--)   ; }  

六  Proteus仿真截图

七 实验结果 

此次试验通过仿真系统进行了仿真,按下相应的开关,可实现控制直流电机的加速、减速及转向。 

八  实验结论与心得 

通过软件的设计及运行,实验达到了预期的结果,实现了电机的正转、反转,加速和减速设计。设计过程中遇到了很多的问题,但是我们没有半途而废,加深了对知识的理解,一点一点的分析。总而言之,这次课程设计让我受益匪浅。在摸索该如何设计电路使之实现所需功能的过程中,培养了我的设计思维,增加了实际操作能力,也让深深地体会到了自己学习知识的不足之处,对于知识的理解程度不够深,自己以为明白的实际上不明白。在以后的学习过程中,我会重视这些问题,逐渐改变自己的学习习惯,不断的进步!

实验四 16×16 LED扫描输出实验

一.         实验目的

使用户学会利用单片机的IO口进行LED点阵的扫描显示。

二.         实验设备及器件

IBM PC 机                                  一台

DP-51PROC单片机综合仿真实验仪         一台

三.         实验内容

编写一段程序,用P1口控制C3区4片74HC164进行行列扫描,使C3区的16×16 LED点阵显示用户指定的汉字。

四.         实验要求

学会使用单片机对LED点阵进行扫描显示。

五.         实验步骤

1.    使用导线将A2区的P10~P14与C3区的L_DAT_H、L_DAT_L、L_CLK、L_OE、L_STR依次连接。

2.    运行光盘中的程序,显示“感谢您使用DP-51PROC单片机综合仿真实验仪!”,先是向左滚动,后是向上滚动

3.    如果用户希望改变显示的汉字,可以使用光盘中附带的字模提取软件(Pctolcd2002)提取用户希望显示汉字的字模,字模提取软件的设置为阴码、逐列式、逆向、十六进制、C51格式自定义,将生成的字模拷贝到程序中所指定的位置插入即可。

六.         实验预习要求

阅读本书的2.8.19节内容,理解硬件结构,还可以先把程序编好,然后在Keil C51环境下进行软件仿真。

七.         实验参考程序

#include  <reg52.h>

typedef  unsigned char  byte;

typedef  unsigned int   word;

sbit  datah595=P1^0;

sbit  datal595=P1^1;

sbit  clk595=P1^2;

sbit  oe595=P1^3;

sbit  str595=P1^4;

word  data  datah,datal;           

byte  code  displaydata[]= 

{        

0x00,0x00,                                                   

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

//在以下位置插入字模

0x00,0x04,0x00,0x43,0xFC,0x70,0x14,0x00,0xD4,0x39,0x54,0x41,0x54,0x41,0xD4,0x49,

0x04,0x50,0x3F,0x42,0xC4,0x41,0x45,0x61,0x36,0x0A,0x04,0x34, 0x00,0x27,0x00,0x00,/*"感",0*/

0x40,0x00,0x42,0x00,0xCC,0x3F,0x04,0x50,0x00,0x29,0xFC,0x11,0x56,0x4D,0x55,0x83,

0xFC,0x7F,0x50,0x00,0x90,0x41,0x10,0x80,0xFF,0x7F,0x10,0x00, 0x10,0x00,0x00,0x00,/*"谢",1*/

0x80,0x00,0x40,0x20,0x30,0x38,0xFC,0x03,0x03,0x38,0x90,0x40,0x68,0x40,0x06,0x49,

0x04,0x52,0xF4,0x41,0x04,0x40,0x24,0x70,0x44,0x00,0x8C,0x09, 0x04,0x30,0x00,0x00,/*"您",2*/

0x40,0x00,0x20,0x00,0xF0,0x7F,0x1C,0x00,0x07,0x40,0xF2,0x41,0x94,0x22,0x94,0x14,

0x94,0x0C,0xFF,0x13,0x94,0x10,0x94,0x30,0x94,0x20,0xF4,0x61, 0x04,0x20,0x00,0x00,/*"使",3*/

0x00,0x80,0x00,0x40,0x00,0x30,0xFE,0x0F,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,

0xFE,0xFF,0x22,0x02,0x22,0x02,0x22,0x42,0x22,0x82,0xFE,0x7F, 0x00,0x00,0x00,0x00,/*"用",4*/

0x08,0x20,0xF8,0x3F,0x08,0x20,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"D"*/

0x08,0x20,0xF8,0x3F,0x08,0x21,0x08,0x01,0x08,0x01,0x08,0x01,0xF0,0x00,0x00,0x00,/*"P", 5*/

0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,

0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,/*"-",6*/

0x00,0x00,0xF8,0x19,0x08,0x21,0x88,0x20,0x88,0x20,0x08,0x11,0x08,0x0E,0x00,0x00,/*"5"*/

0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,/*"1", 7*/

0x08,0x20,0xF8,0x3F,0x08,0x21,0x08,0x01,0x08,0x01,0x08,0x01,0xF0,0x00,0x00,0x00,/*"P"*/

0x08,0x20,0xF8,0x3F,0x88,0x20,0x88,0x00,0x88,0x03,0x88,0x0C,0x70,0x30,0x00,0x20,/*"R", 8*/

0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"O"*/

0xC0,0x07,0x30,0x18,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x10,0x38,0x08,0x00,0x00,/*"C", 9*/

0x00,0x08,0x00,0x08,0xF8,0x0B,0x28,0x09,0x29,0x09,0x2E,0x09,0x2A,0x09,0xF8,0xFF,

0x28,0x09,0x2C,0x09,0x2B,0x09,0x2A,0x09,0xF8,0x0B,0x00,0x08, 0x00,0x08,0x00,0x00,/*"单",10*/

0x00,0x80,0x00,0x40,0x00,0x30,0xFE,0x0F,0x10,0x01,0x10,0x01,0x10,0x01,0x10,0x01,

0x10,0x01,0x1F,0x01,0x10,0x01,0x10,0xFF,0x10,0x00,0x18,0x00, 0x10,0x00,0x00,0x00,/*"片",11*/

0x08,0x04,0x08,0x03,0xC8,0x00,0xFF,0xFF,0x48,0x00,0x88,0x41,0x08,0x30,0x00,0x0C,

0xFE,0x03,0x02,0x00,0x02,0x00,0x02,0x00,0xFE,0x3F,0x00,0x40, 0x00,0x78,0x00,0x00,/*"机",12*/

0x20,0x22,0x30,0x23,0xA8,0x22,0x67,0x12,0x32,0x12,0x00,0x20,0x0C,0x11,0x24,0x0D,

0x24,0x41,0x25,0x81,0x26,0x7F,0x24,0x01,0x24,0x05,0x24,0x09, 0x0C,0x31,0x00,0x00,/*"综",13*/

0x40,0x00,0x40,0x00,0x20,0x00,0x50,0x7E,0x48,0x22,0x44,0x22,0x42,0x22,0x41,0x22,

0x42,0x22,0x44,0x22,0x68,0x22,0x50,0x7E,0x30,0x00,0x60,0x00, 0x20,0x00,0x00,0x00,/*"合",14*/

0x40,0x00,0x20,0x00,0x10,0x00,0xEC,0x7F,0x07,0x40,0x0A,0x20,0x08,0x18,0x08,0x06,

0xF9,0x01,0x8A,0x10,0x8E,0x20,0x88,0x40,0x88,0x20,0xCC,0x1F, 0x88,0x00,0x00,0x00,/*"仿",15*/

0x00,0x10,0x04,0x90,0x04,0x90,0x04,0x50,0xF4,0x5F,0x54,0x35,0x5C,0x15,0x57,0x15,

0x54,0x15,0x54,0x35,0x54,0x55,0xF4,0x5F,0x04,0x90,0x06,0x90, 0x04,0x10,0x00,0x00,/*"真",16*/

0x00,0x00,0x10,0x82,0x0C,0x82,0x04,0x42,0x4C,0x42,0xB4,0x23,0x94,0x12,0x05,0x0A,

0xF6,0x07,0x04,0x0A,0x04,0x12,0x04,0xE2,0x14,0x42,0x0C,0x02, 0x04,0x02,0x00,0x00,/*"实",17*/

0x02,0x08,0xFA,0x08,0x82,0x04,0x82,0x24,0xFE,0x40,0x80,0x3F,0x40,0x22,0x60,0x2C,

0x58,0x21,0x46,0x2E,0x48,0x20,0x50,0x30,0x20,0x2C,0x20,0x23, 0x20,0x20,0x00,0x00,/*"验",18*/

0x40,0x00,0x20,0x00,0xF0,0xFF,0x0C,0x00,0x03,0x40,0x00,0x40,0x38,0x20,0xC0,0x10,

0x01,0x0B,0x0E,0x04,0x04,0x0B,0xE0,0x10,0x1C,0x20,0x00,0x60, 0x00,0x20,0x00,0x00,/*"仪",19*/

0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x5F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,/*"!",20*/

//至此字模插入结束

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

};

byte  *p=&displaydata[0];         

byte  *q=&displaydata[32];       

void  delay(word a)    

{

    word b;

      for(b=0;b<a;b++);

}

void  senddata(word datah,datal)    

{

    byte i=0;

      word m,n;

      oe595=0;

      str595=0;

      for(;i<16;i++)                                  

      {

          clk595=0;

           m=datah;                       

           n=~datal;                       

           m&=0x8000;

           n&=0x8000;

           datah595=(bit)m;                  

           datal595=(bit)n;

           datah<<=1;

           datal<<=1;

           clk595=1;

      }

      str595=1;                   

      str595=0;

}

void  horizontal(byte time,word counth)  //水平移动子程序

{

    byte  x,y;

      word  j,k,z;

    for(z=0;z<counth;z++)        

      {

               for(y=0;y<time;y++)             

           {

               datal=0x0001;

              for(x=0;x<16;x++)                    

              {

                  p+=3;       

                   j=(word)*p;

                     j<<=8;                  

                     j&=0xff00;               

                     p-=1;

                     k=(word)*p;             

                     k&=0x00ff;              

                     datah=j|k;    

                     if(x)                   

                     {

                         datal<<=1;          

                     }

                          //datah=~datah;                          senddata(datah,datal);  

               }

                 p-=32;                      

           }                               

           p+=2;                                   

      }                                                

      p=&displaydata[0];                  

      oe595=1;

}

void  vertical(byte a,time,word countv)  //垂直移动子程序

{

    byte  x,y,e,w=0;

      word  j,k,z;

      word  datah1,datah2;                

      for(z=countv;z>0;z--)               

      {

          for(e=0;e<16;e++)               

            {

               for(y=0;y<time;y++)         

                 {

                   datal=0x0001;

                  for(x=0;x<16;x++)     

                  {

                       p+=3;

                       j=(word)*p;

                         j<<=8;

                         j&=0xff00;

                         p-=1;

                         k=(word)*p;

                         k&=0x00ff;

                         datah1=j|k;

                    datah1>>=w;         

                          q+=3;

                       j=(word)*q;

                         j<<=8;

                         j&=0xff00;

                         q-=1;

                         k=(word)*q;

                         k&=0x00ff;

                         datah2=j|k;

                            datah2<<=(16-w);    

                            datah=datah1|datah2;

                            if(x)               

                         {

                             datal<<=1;

                         }

                            //datah=~datah;     

                          senddata(datah,datal);

                   }                       

                      p-=32;q-=32;           

                 }                            

                 w++;                        

                 if(w==16) w=0;    

           }                               

           if((a==16)&&(z==2))        

           { p+=32;q+=16; }           

           else                                 

           { p+=32;q+=32; }                

      }                                  

      p=&displaydata[0];

      q=&displaydata[32];                 

      oe595=1;

}

void  main(void)

{

      byte  time=8;                       

      word  size=sizeof(displaydata);     

      word  countv=((size-2)>>5)-1;       

      word  counth=countv<<4;

      byte  a=(byte)((size-2)%32);        

      if(a==16)                           

      {

          counth+=8;    

           countv+=1;                    

      }

      while(1)

      {

          horizontal(time,counth);        

           delay(65535);

           delay(65535);

          vertical(a,time,countv);

           delay(65535);

           delay(65535);

    }

}

实验五步进电机实验

一.实验目的

了解步进电机的工作原理,掌握它的转动控制方式和调速方法。

二.         实验设备及器件

IBM PC 机                                  一台

DP-51PROC单片机综合仿真实验仪         一台

三.         实验内容

1.    编写程序,通过单片机的P1口控制步进电机的控制端,使其按一定的控制方式进行转动。

2.    分别采用双四拍(AB→BC→CD→DA→AB)方式、单四拍(A→B→C→D→A)方式和单双八拍(A→AB→B→BC→C→CD→D→DA→A)方式编程,控制步进电机的转动方向和转速。

3.    观察不同控制方式下,步进电机转动时的振动情况和步进角的大小,比较这几种控制方式的优缺点。

四.         实验要求

学会步进电机的工作原理和控制方法,掌握一些简单的控制电路和基本的电机基础知识。

图3.35 步进电机驱动原理图

五.          实验步骤

1.    安装C10区JP6接口上的短路帽,将C10区BA、BB、BC、BD与A2区的P10~P13对应相连。

2.    打开程序调试软件,下载运行编写好的软件程序,观察步进电机的转动情况。

3.    修改步进电机的控制程序,再次运行程序,比较它们的不同控制效果。

六.         实验参考程序

5、       程序:

        #include"reg51.h"

#define uint  unsigned int

//#define delay_ms 5             //延时

sbit W=P3^6;

sbit R=P3^7;

sbit SEND=P3^0;

sbit CLOCK=P3^1;

int delay_ms=30; 

sbit bu1=P1^4;

sbit bu2=P1^5;

sbit bu3=P1^6;

sbit bu4=P1^7;

uint flag=0;

unsigned int   table[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0xff};

uint h=0;

void  delay(uint n)                 //延时程序

{

   uint i,j;

   for(i=0;i<100;i++)

       for(j=0;j<n;j++);

}

void zhengzhuan()                  //正转

{

    bu1=~bu1;

    delay(delay_ms);

    bu1=~bu1;

    bu2=~bu2;

    delay(delay_ms);

    bu2=~bu2;

    bu3=~bu3;

    delay(delay_ms);

    bu3=~bu3;

    bu4=~bu4;

    delay(delay_ms);

    bu1=~bu1;

}

void fanzhuan()                //反转

{

    bu4=~bu4;

    delay(delay_ms);

    bu4=~bu4;

    bu3=~bu3;

    delay(delay_ms);

    bu3=~bu3;

    bu2=~bu2;

    delay(delay_ms);

    bu2=~bu2;

    bu1=~bu1;

    delay(delay_ms);

    bu1=~bu1;

}

void senddata(unsigned int dat)       //发送数据程序

{

      unsigned int  i=0;

          for(;i<8;i++)

          {

             CLOCK=0;

             SEND=dat>>i&1;

             ;

             CLOCK=~CLOCK;     

          }

}

uint saomiao()                                      //键盘扫描程序

{

      uint  i,j,k1,k2=0x01,n;

      uint   A[]={0xfe,0xfd,0xfb,0xf7};      

       for(i=0;i<4;i++)

        {  

              k2=0x01;

              W=0;

              P2=0x60;

              P0=A[i];

              delay(1);

              W=1;

              P2=0xA0;

              W=0;

//            k1=P0&0x0f;

//            if(k1!=0x0f)

//              {

                      for(j=0;j<4;j++)

                       {

                          n=P0&0x0F;

                          if(!(n&k2))

                            {

                                return(4*i+j);

                            }

                             k2<<=1;

                       }

//              }         

        }

    delay(100);

     return(10) ;  

}

void main()

{  

       uint m,r;

//     W=0;

//     P2=0x60;

//     P0=0x00;

//     ;

//     W=1;                //锁存P0口输出数据

//     P2=0xA0;

//     W=0;

       while(1)

       {

               W=0;

               P2=0x60;

               P0=0xf0;

               W=1;                //锁存P0口输出数据

               P2=0xA0;

               W=0;

           m=P0&0x0F;

           if(m!=0x0f)

             {

                delay(50);

                m=P0&0x0f;

                if(m!=0x0f)

                {

        //          flag=!flag;

        //          switch(flag)

        //          {

        //              case 0: zhengzhuan();

        //                      break;

        //              case 1: fanzhuan();

        //                      break;

        //              default : ;

        //          }

                    h=saomiao();

                    senddata(table[h]);

                }      

              }

                    r=h;

                    if(r==1)

                    {

                        zhengzhuan();                  

                    }

                    if(r==2)

                    {

                        fanzhuan();

                    }

                    if(r==5)

                    {delay_ms+=5;

                        if(delay_ms>100)delay_ms=200;

                    }

                    if(r==4)

                    {delay_ms-=5;

                        if(delay_ms<=5)

                            {

                                delay_ms= 5;       

                            }

                    }

            }

}

实验心得:

20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快

步进电机是一种将电脉冲信号转换成相应的角位移(或线位移)的电磁机械装置[1]。现在比较常用的步进电机包括反应式步进电机(VR)、永磁式步进电机(PM)、混合式步进电机(HB)等。

         整个实验过程中呢,源程序的编写比较麻烦,调试多次也没有得出理想的结果!

采用提出的步进电机控制系统,步进电机在工作频率内运行平稳,定位精度高。该系统有效,实用,已在无人机器人系统中得到验证,结果有效可行。

相关推荐