单片机i/o口实验_单片机i\/o口赋值 - CSDN
  • 单片机I/O口控制实验

    万次阅读 2018-05-23 09:45:40
    实验内容:利用P1做输出口,接八只发光二极管,编写程序是发光二极管循环点亮或者具有一定的花样。1.第一个发光二极管以间隔200ms闪烁;2.8个发光二极管由上至下间隔,1s流动,其中每个管亮500ms,灭500ms,亮时...

    实验内容:

    利用P1口做输出口,接八只发光二极管,编写程序是发光二极管循环点亮或者具有一定的花样。

    1.第一个发光二极管以间隔200ms闪烁;

    2.8个发光二极管由上至下间隔,1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去;

    3.8个发光二极管来回流动,每个管亮100ms,流动时让蜂鸣器发出“滴滴”声;

    4.用8个发光二极管演示出8位二进制数累加过程,结合两个开关(一加一减)实现加减运算;

    5.8个发光二极管间隔200ms由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms间隔全部闪烁5次,重复此过程;

    6.间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复此过程;

    7.间隔300ms先奇数亮再偶数亮,循环三次,一个灯上下循环三次,两个分别从两边往中间流动三次,再从中间往两边流动三次,8个全部闪烁3次,关闭发光管,程序停止。


    仿真图:


    1.第一题简单,不上代码了><

    2.源码:

    #include <reg52.h>   
    #include <intrins.h>
    #define uchar unsigned char
    sbit buzzer=P3^7;                                //定义引脚
    void delay(uchar z)                               //延时函数
    {
    uchar x,y;
    for(x=z;x>0;x--)
    for(y=110;y>0;y--);
    }
    void main()
    {
    uchar a,i;
    while(1)
    {
    a=0xfe;
    for(i=0;i<8;i++)
    {P1=a;
    buzzer=0;
    delay(250);
    P1=0xff;                                //起到消隐作用
    buzzer=1;
    delay(250);
    a=_crol_(a,1);                        //左移函数
    }
    }
    }

    3.源码:

    #include <reg52.h>   
    #include <intrins.h>
    #define uchar unsigned char
    sbit buzzer=P3^7;
    void delay(uchar z)
    {
    uchar x,y;
    for(x=z;x>0;x--)
    for(y=110;y>0;y--);
    }
    void main()
    {
    uchar a,i;
    while(1)
    {
    a=0xfe;                    //第一个灯先亮
    for(i=0;i<8;i++)
    {
    P1=a;
    buzzer=0;
    delay(250);
    buzzer=1;
    delay(250);
    a=_crol_(a,1);
    }
    a=0x7f;                    //倒数第一个灯先亮,形成来回流动
    for(i=0;i<8;i++)
    {
    P1=a;
    buzzer=0;
    delay(250);
    buzzer=1;
    delay(250);
    a=_cror_(a,1);
    }
    }

    }

    4.源码:

    #include<reg52.h>  
    #include<intrins.h>   
    #define uchar unsigned char  
    void delay(uchar z)  
    {     
    uchar x,y;
    for(x=z;x>0;x--)
      for(y=110;y>0;y--); 
    }
    void main()      
    {
    uchar a;
    while(1)        
    {
      a++;
      P1=~a;                    //按位取反
      delay(200);
    }

    }

    5.源码:

    #include<reg52.h>  
    #include<intrins.h>  
    #define uchar unsigned char  
    uchar aa;  
    void delay(uchar z);  
    void main()  
    {  
        uchar i,j,k;  
        while(1)  
        {  
            for(i=0;i<2;i++)  
            {  
                aa=0xfe;  
                for(j=0;j<7;j++)  
                {  
                    P1=aa;  
                    delay(200);  
                    aa=_crol_(aa,1);  
                }  
                aa=0x7f;  
                for(k=0;k<7;k++)  
                {  
                    P1=aa;  
                    delay(200);  
                    aa=_cror_(aa,1);           
                }  
            }  
            P1=0xff;  
            for(j=0;j<10;j++)  
            {  
                  
                P1=~P1;                      //按位取反,则实现一亮一灭;
                delay(300);  
            }  
        }  
    }  
    void delay(uchar z)  
    {  
            uchar x,y;  
            for(x=0;x<z;x++)  
            for(y=0;y<110;y++);  
      

    }  

    6.源码:

    #include <reg52.h>  
    #include <intrins.h>  
    #define uc unsigned char  
    void delay(uc);  
    uc a,b,c,d,x,y,e;  
    void main()  
    {  
     while(1)
     {  
     e=1;  
     for(a=1;a<=8;a++)
     {   
     b=9-a;
     c=0xff;
     e=e*2; 
     d=c-e+1;  
     while(b)  
     {  
     P1=d;  
     delay(300);  
     d=_crol_(d,1);  
     b--;  
     }  
     }  
     }  
    }  
    void delay(uc k)  
    {  
     for(x=k;x>0;x--)  
     for(y=110;y>0;y--);  

    }  

    7.源码:

    #include<reg52.h>
    #include<intrins.h>
    #include<stdlib.h>
    #define uchar unsigned char
    #define uint  unsigned int
    #define led P1
    void delay(uint i);
    void main()

        while(1)
        {
            uchar leddata;
            uchar ci;
            uchar one;
            uchar cs;
    P1=0xff;
            for(ci=0;ci<3;ci++)
            {   leddata=0xaa;
                led=leddata;
                delay(300);
                leddata=0x55;
                led=leddata;
                delay(300);
             }
             for(ci=0;ci<3;ci++)
             {
                leddata=0xfe;
                led=leddata;
                delay(1000);
                for(one=0;one<7;one++)
                {
                    led=(led<<1)+1;
                    delay(1000);
                }
                while(one==7)
                {
                    for(one=7;one>0;one--)
                    {
                        led=(led>>1)+128;
                        delay(1000);
                    }
                    break;
                }
            }
            for(cs=0;cs<3;cs++)
            {
                uchar code led2[]={0xe7,0xdb,0xbd,0x7e};
                uchar deng;
                uchar linshi;
                for(linshi=0;linshi<4;linshi++)
                {
                    deng=linshi;
                    led=led2[deng];
                    delay(1000);
                }
            }
            for(cs=0;cs<3;cs++)
            {
                uchar code led2[]={0x7e,0xbd,0xdb,0xe7};
                uchar deng;
                uchar linshi;
                for(linshi=0;linshi<4;linshi++)
                {
                    deng=linshi;
                    led=led2[deng];
                    delay(1000);
                }
            }
            for(ci=0;ci<3;ci++)
            {leddata=0x00;
            led=leddata;
            delay(1000);
            leddata=0xff;
            led=leddata;
            delay(1000);
            }while(1);
        }

    }
    void delay(uint i)
    {
        uchar j;
        for(;i>0;i--)
            for(j=115;j>0;j--)
            {;}

    }

    本次实验总结:

    点亮流水灯及其花样是单片机入门的第一次实验,接下来会继续整理其他实验,这里用到的单片机c语言的基本的内容,需要对循环,条件等比较熟悉,源码和仿真图都上了,可以用来复习并且给需要的人一些参考吧。

    另外,代码并不是最优的,有更好的意见欢迎交流。

    展开全文
  • 单片机I/O口驱动步进电动机 一、实验目的 二、实验内容 三、实验步骤 四、C代码如下 五、实验结果 六、实验体会 一、实验目的 进一步掌握单片机应用系统的软硬件设计方法 熟悉步进电动机的工作原理和驱动...

    用单片机I/O口驱动步进电动机

    一、实验目的

    二、实验内容

    三、实验步骤

    四、C代码如下

    五、实验结果

    六、实验体会


    一、实验目的

    1. 进一步掌握单片机应用系统的软硬件设计方法
    2. 熟悉步进电动机的工作原理和驱动程序的编写
    3. 了解单片机系统常用的功率驱动电路ULN2803的应用

    二、实验内容

    1. 打开ISIS 7 Professional,参照图4.1设计仿真电路原理图
    2. 编写程序实现:

    (1)步进电动机正转、反转、加速、减速控制

    (2)只使用K1、K2两个按钮作为“加速”和“减速”按键,实现步进电动机速度的连续控制

    三、实验步骤

    本实验电路如图4.1所示,所用元器件清单见表4.1

                                                         图4.1   用单片机I/O口驱动步进电动机电路原理图

    表4.1 用单片机I/O口驱动步进电动机电路元器件清单
    元器件编号 元器件名称 说明
    U1 AT89C52 AT89C52单片机
    U2 ULN2803 大电流输出达林顿管阵列X8
    K1~K6 BUTTON 按钮
    M1 MOTOT-STEPPER 步进电动机

    四、C代码如下

    #include <REG52.H>    //片内寄存器定义
    #include <INTRINS.H>
    
    unsigned char ucMotorDrvPuls;  /*电动机运转时初值*/
    
    #define OUTPUT P2     /*定义P2口为电动机驱动信号口*/
    #define INPUT P1      /*定义P1口为控制信号输入口*/
    
    sbit STARTUP=P1^7;    //启动/停止开关
    sbit FORREV=P1^6;     //正转/反转开关
    
    void time(unsigned int ucMs); /*延时单位:ms*/
    
    /************************* 电动机定位 **************************/
    void position(void)  //延时50us
    {
    	OUTPUT=0x11;time(200);
    	OUTPUT=0x22;time(200);
    	OUTPUT=0x44;time(200);
    	OUTPUT=0x88;time(200);
    	ucMotorDrvPuls=0x11;
    	OUTPUT=0x11;
    }
    /******************** 主程序 ***********************/
    void main(void)
    {
    	unsigned char ucTimes;
    	time(100);
    	position();  //步进电动机定位
    	OUTPUT=0x0;  //步进电动机停止
    	time(100);
    	P1=0xff;     //P1口输入,首先置全1
    	while(1){
    		ucTimes=(P1^0x0f)&0x0f; //读P1口低4位并取反
    		if(!STARTUP){           //启动/停止开关=0,启动
    			if(FORREV){         //正转/反转开关=1,正转
    				OUTPUT=ucMotorDrvPuls;//送正转控制信号
    				ucMotorDrvPuls=_crol_(ucMotorDrvPuls,1);//计算下一个控制信号
    			}
    			else{      //正转/反转开关=0,反转
    				OUTPUT=ucMotorDrvPuls;//送反转控制信号
    				ucMotorDrvPuls=_cror_(ucMotorDrvPuls,1);//计算下一个控制信号
    			}
    			time(380-ucTimes*16);  //延时
    		}
    		else{
    			ucMotorDrvPuls=0x11;   //设置初始值
    		}
    	}
    }
    
    /********************************************
    *  函数说明:延时5us,晶振改变时只需要改变这一个函数!
        1.对于11.0592MHz晶振而言,需要2个_nop_();
        2.对于22.1184MHz晶振而言,需要4个_nop_();
    *  入口参数:无
    * 返回:无
    * 创建日期:20010623
    * 作者:张齐
    ********************************************/
    void delay_5us(void)  //延时5us,晶振改变时只改变这一个函数
    {
    	_nop_();
    	_nop_();
    	//_nop_();
    	//_nop_();
    }
    /**************** delay_50us ******************/
    void delay_50us(void)  //延时50us
    {
    	unsigned char i;
    	for(i=0;i<4;i++)
    	{
    		delay_5us();
    	}
    }
    /***************** 延时100us *******************/
    void delay_100us(void)  //延时100us
    {
    	delay_50us();
    	delay_50us();
    }
    
    /************ 延时单位:ms **************/
    void time(unsigned int ucMs)  //延时单位:ms
    {
    	unsigned char j;
    	while(ucMs>0){
    		for(j=0;j<10;j++) delay_100us();
    		ucMs--;
    	}
    }

    五、实验结果

    六、实验体会

    在实验前,我了解控制步进电动机基本原理,转动方向由相序决定,而转速则由输 出相序表数组元素的时间间隔决定。

    展开全文
  • 单片机I/O口模拟串口

    2019-04-26 15:42:56
    要用到2个串口,我使用了AMTEGA8A单片机,所以用普通IO模拟做了一个串口。花了我两个晚上的时间,才调试好模拟串口程序,也遇到不少的问题,今天终于搞定了。但是还只是波特率1200,校验位N 数据8 停止1 ,以后再...

    最近调试GPS的一个模块,需要把数据从GPS读取,再通过串口发送给PC机等一些功能。要用到2个串口,我使用了AMTEGA8A单片机,所以用普通IO模拟做了一个串口。花了我两个晚上的时间,才调试好模拟串口程序,也遇到不少的问题,今天终于搞定了。但是还只是波特率1200,校验位N 数据8 停止1 ,以后再慢慢完善。

    模拟串口主要是先要考虑到波特率和数据格式。我采用的1200的波特率,所以一个位的时间是:1s/1200=833.3333333us .这里我没用定时器,我是用延时来实现定时的,一个位的延时时间定为833us,AVR里面的延时程序还是比较精确的,我用示波器观察波形,也是正确的。一般串口协议(校验位N 数据8 停止1 )以我现在调试这个来说,比较简单,一个起始位,8位数据,一个停止位,每一位时间都是833us

    展开全文
  • I/O口控制实验

    2020-07-28 23:32:31
    1.P1做输出口,接8只发光二极管,编写程序使发光二极管循环点亮。
  • 51单片机P0/P1/P2/P3的区别: P0要作为低8位地址总线和8位数据总线用,这种情况下P0不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据; P1只能作为I/O口(P1.0、P1.1以外...

    51单片机P0/P1/P2/P3口的区别:

    P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据;

    P1口只能作为I/O口(P1.0、P1.1以外);

    P2口除了作为普通I/O口之外,在扩展外围设备时,要用作高8位地址线;

    P3口除了作为普通I/O口之外,其每个引脚都有第二功能。

    I/O端口具有以下特性:

    ① 端口自动识别:无论是P0 P2口的总线复用还是P3口的功能复用,内部资源会自动选择,不需要通过指令的状态选择。

    ② 准双向口功能:准双向口作为输入口时,应先使锁存器置"1",然后再读引脚。

    ③ P0作为普通I/O口使用:不使用并行扩展总线时,必须外加上拉电阻。

    ④ I/O口驱动特性:P0口作为I/O口时可输出驱动8个LSTTL输入端,P1-P3口则可以输出驱动4个LSTTL输入端

    ————————————————————————————————————————————

    I/O接口直接输入输出实例

    //《51单片机原理及应用(第二版)——基于Keil C与Proteus》第四章例4.3

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    程序分析:

    电路中的P2口既用作输入也用作输出,P2.0-P2.3作为输入,P2.4-P2.7作为输出;

    首先将 P2 = 0xff; P2口全部赋高电平 1111 1111,因为I/O作为输入时应先设置各个锁存器为"1",才能确保输入结果正确;

    当P2.0-P2.3读入开关状态 if ((P2 & 0x0f) != 0x0f)时,通过对其移位 P2 = P2<< 4;,将P2.0-P2.3的值对应移到了P2.4-P2.7中

    代码分析:

        

    代码具体执行情况以及P2调试情况见下 ↓

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    调试及P2情况

    Keil与Proteus联调,打开P2状态图;

    开始调试并且未操作时,P2 = 0xff;,P2状态为 1111 1111,

    闭合开关2,单击RUN执行,在这个执行过程中P2情况:

    ① 初始状态 1111 1111

    ② 闭合开关 1111 1101

    ④ "与运算" 0000 1101

    //通过 (1111 1101 & 0000 1111) 运算得到 (0000 1101) 屏蔽掉高四位的情况,进行!= 0x0f 判断。

    // 如果四开关同时断开,(1111 1111 & 0000 1111) == (0000 1111)

    // 如果有任何一个开关闭合,则将执行左移操作

    ③ 左移四位 1101 0000

    LED2 左端获得低电平,右端高电平,LED亮

    所有开关断开,重新进入循环,P2 = 0xff;

    程序代码执行结束,分析完毕。

    转载于:https://www.cnblogs.com/isAndyWu/p/9566892.html

    展开全文
  • 单片机IO口实验报告

    2020-07-29 14:20:17
    单片机实验三:IO口实验1 实验要求: TKS 或 Keil软件下进行编程设计: 1)为工程准备一个空的文件夹 2)创建工程,工程文件取名,存到指定文件夹 3)选择单片机芯片Atmel公司的AT89C51芯片 4)输入编辑源代码 5)...
  • 74LS273扩展I/O口实验

    2020-07-30 23:31:19
    使用汇编语言编写程序,以74LS273作为I/O口,控制8个单色LED灯,使8个LED灯依次闪烁。I/O端口号为168H。
  • 有个产品的如图的电路模型,接线处的I/O口在开机后是高电平,怀疑是上拉输入之类的功能,但是在闭合的时候加休眠,漏电电流约等于0,松开的时候又可以产生上升沿脉冲。这是为什么呢?据我实验,如果保持上拉输入下,...
  • 单片机应用系统中,常有用单片机I/O口来实现自关机(彻底关机)的功能。一般用单片机的一个I/O口控制一个电子开关来实现,因单片机关电后,失去电源,所以在关机时,实现关机的IO的电平必须用低电平。但在这里有...
  • 实验三(硬件实验):I/O 接口实验 一、实验要求: 将 P0 作为输出,连接 8 个 LED,编写程序,使 LED 循环点亮。(LED1 亮,其余灭->LED2 亮,其余灭……,如此循环 5 次后,进行全灭->全亮闪烁,时间间隔为 500ms...
  • 一种提高单片机i/o口驱动能力的方法 一、简述问题 当你用单片驱动发光二极管的时,你还感觉不到P0、P1的差别。(10-20mA之间,当中P0驱动能力最强,但对于驱动直流电机依旧非常弱。其结果就是...
  • 单片机实验报告 (P1口实验 I/O扩展实验
  • 1.什么是源型漏型?什么是上拉电阻?下拉电阻?什么是线驱动输出集电极开路输出,推挽式输出? 我们先来说说集电极开路输出的结构。集电极开路输出的结构如图1所示,右边的那个三极管集电极什么都不接,所以叫做...
  • 单片机I/O口实现流水灯电路 一、实验目的 二、实验内容 三、实验步骤 四、C代码如下 五、实验结果 六、实验体会 一、实验目的 熟悉单片机I/O口的编程方法 了解发光二极管LED的工作原理和驱动方法 学习...
  • 实验环境 仿真软件 Protue 8.9 sp2 IDE Keil5 C51 单片机 AT89C51 仿真图 将LDE的一端连接电源VCC,一端连接单片机的P0.0引脚 代码 项目结构 代码 #include <REG51.H> //使用P0.0引脚 sbit led1 = P0 ^ 0; ...
  • STM32实例之I/O控制中的按键实验

    万次阅读 2016-10-08 14:30:40
    就本质而言,系统对键盘的处理就是对I/O口电平的读取和处理。 在本实例中,使用OpenM3V开发板,他通过7个按键分别控制7个I/O口,这里我们通过LED等的点亮与熄灭来表征是否有按键的动作。 在做设计之前我们必须理...
  • 利用实验平台上的锁进插座扩展一片74LS273作为输出,控制八个LED灯。改为从右往左两个两个亮 OUTBIT equ 0e101h ; 位控制 CLK164 equ 0e102h ; 段控制(接164时钟位) DAT164 equ 0e102h ; 段控制(接164数据位...
  • 并行I/O口程序: P1 做输出口,接8 个发光二极管L1—L8; P3.3 做输入,外接一开关,编写程序,每输入一个正脉冲,使P1 按二进制加一方式点亮发光二极管。 需要程序流程图与程序源代码 基础不牢,烦请...
  • 参考资料 SAE文件永久原理和应用 http://www.cnblogs.com/HKUI/archive/2013/07/10/3182557.html SAE文件缓存/永久存储应用 http://blog.sjzycxx.cn/post/241/ 待续………
1 2 3 4 5 ... 20
收藏数 4,281
精华内容 1,712
关键字:

单片机i/o口实验