实验1 单片机IO口应用及数码管显示

简介:

1.   单片机驱动蜂鸣器的实验;

a)         说明:Lab51单片机实验板的蜂鸣器连接到单片机的P1.5

b)        基本要求:控制蜂鸣器每2秒响0.5秒。

 

#include <reg51.h>

#define unit unsigned int

 

void delay(unit x){

    unit i=x;

    unit j;

    for(;i>0;--i){

       for(j=x;j>0;--j);

    }

}

void main()

{

    while(1){

       P1=0x00;

       delay(250);   //0.5

       P1=0xff;

       delay(420);//2

    }

}

 

2.  单片机驱动继电器输出实验;

a)         说明:Lab51单片机实验板的蜂鸣器连接到单片机的P1.4

b)        基本要求:控制继电器每5秒吸合0.5秒。

#include <reg51.h>

#define unit unsigned int

 

void delay(unit x){

    unit i=x;

        unit j;

    for(;i>0;--i){

    for(j=x;j>0;--j);

    }

}

sbit JiDian=P1^4;

void main()

{

    while(1){

    JiDian=0x00;

    delay(250);   //0.5

    JiDian=0xff;

    delay(700);//2

    }

}

 

3.延时实现p2口LED流水灯效果(用循环移位指令)

#include <reg51.h>

#define unit unsigned int

 

unit table[]={~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80};

void delay(unit x){

    unit i=x;

        unit j;

    for(;i>0;--i){

    for(j=x;j>0;--j);

    }

}

 

void main()

{

       int i;

       P2=0x00;

       while(1){

           for(i=0;i<8;i++){

                  P2=table[i];

                  delay(250);//2

           }

       }

}     

 

4.p2口八个灯作二进制加法。理解二进值的计算

#include<reg51.h>

#define unit unsigned int

 

void delay(unit x){

    unit i=x;

        unit j;

    for(;i>0;--i){

    for(j=x;j>0;--j);

    }

}

 

void main(){

   while(1){

    P2=0xff;

       while(P2!=0x00){

           P2++;

           delay(250);//2

       }

   }

}   

5.直接用IO口做位选信号,控制8位数码管上显示1,2,3,4F,循环显示

说明:P0是位选,P2是段选

 

#include <reg51.H>

#define unit unsigned int

unit code NumTable[]={0x06,~0x24,~0x30,~0x19,~0x12,~0x02,0x87,0xff,~0x10};

void delay(unit x){

    unit i=x;

        unit j;

    for(;i>0;--i){

    for(j=x;j>0;--j);

    }

}

void DisplayNumByOrder(unit DelayNum){

           int i;

           for(i=0;i<=8;i++){

                  P0=NumTable[i];

                  delay(DelayNum);//2

           }

}

void main(){

    //P0是段选,P2是位选

    P2=0x00;

    while(1){

           DisplayNumByOrder(250);    

    }

}

6.用译码器138做片选信号,控制4位数码管上做加1显示。从0000开始.

说明:JP15JP16 8个短路冒连接,JP10 P0)与J12 8PIN排线连接

#include <reg51.h>

#include <math.h>

#define unit unsigned int

unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码

//  用译码器138做位选信号,控制4位数码管上做加1显示。从0000开始.

void delay_1ms(unit x){

    unit i=x;

        unit j;

    for(;i>0;--i){

       for(j=110;j>0;--j);

    }

}

/**

    在数码管上显示对应的值

**/

void display(unsignedchar k)

{

    P0=NumTable[k];

    delay_1ms(3);

}

sbit high=P2^4;

sbit mid=P2^3;

sbit low=P2^2;

/**

    控制数码管显示后4位,并分解计数值

**/

void DisplayNumByOrder(unit Count,unit delay_1msNum){

       low=0; mid=0; high=0;  display(0);        

        low=1; mid=0; high=0;  display(0);               

        low=0; mid=1; high=0;  display(0);

       low=1; mid=1; high=0;  display(0);

       low=0; mid=0; high=1;  display(Count%10000/1000);

       low=1; mid=0; high=1;  display(Count%1000/100);

       low=0; mid=1; high=1;  display(Count%100/10);

       low=1; mid=1; high=1;  display(Count%10);

}

 

//一个是位选,一个是段选

void main(){

    int count=0;

    while(1){

           count++;

           DisplayNumByOrder(count,300);  

           if(count==9999) count=0;

    }

}

7.利用动态扫描方法在八位数码管上显示出稳定的87654321.

#include <reg51.h>

#define unit unsigned int

unit table[]={~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80};

unit code NumTable[]={0x06,~0x24,~0x30,~0x19,~0x12,~0x02,0x87,0xff,~0x10};

void delay(unit x){

    unit i=x;

        unit j;

    for(;i>0;--i){

    for(j=x;j>0;--j);

    }

}

void DisplayNumByOrder(unit DelayNum){

           int i;

           for(i=0;i<=7;i++){

                  P0=NumTable[i];

                  P2=table[i];

                  delay(DelayNum);//5ms

           }

}

//一个是位选,一个是段选

void main(){

    //P0是位选,P2是段选

    //P2=0x00;

    while(1){

           DisplayNumByOrder(5);      

    }

}

8.  数码管前三位显示一个跑表,从000999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。

#include <reg51.h>

#define unit unsigned int

unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码

//数码管前三位显示一个跑表,从000999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。

sbit high=P2^4;

sbit mid=P2^3;

sbit low=P2^2;

sbit IsCountKey=P3^0;//是否计数的按键

const bit PRESSED=0;//0的时候运行,1的时候暂停

//监测

void delay_1ms(unit x){

    unit i=x;

    unit j;

    for(;i>0;--i){

       for(j=110;j>0;--j);

    }

}

/**

    在数码管上显示对应的值

**/

void display(unsignedchar Num)

{

    P0=NumTable[Num];

    delay_1ms(1);

    P0=0;      //送完段选信号后,进行消影的处理

}

 

/**

    控制数码管显示后3位,并分解计数值

**/

void DisplayNumByOrder(unit Count){

       low=0; mid=0; high=0;  display(0);        

        low=1; mid=0; high=0;  display(0);               

        low=0; mid=1; high=0;  display(0);

       low=1; mid=1; high=0;  display(0);

       low=0; mid=0; high=1;  display(0);

       low=1; mid=0; high=1;  display(Count%1000/100);

       low=0; mid=1; high=1;  display(Count%100/10);

       low=1; mid=1; high=1;  display(Count%10);

}

//是否计数

void IsCount(unit count){

    if(PRESSED==IsCountKey){    //当按键按下

       delay_1ms(10);       //去抖动

       if(PRESSED==IsCountKey){//当按键按下

           while(PRESSED==IsCountKey){//当按键一直按下

              DisplayNumByOrder(count);//显示原数值

           }

       }

    }

}

//扫描键盘

void main(){

    int count=0;

    while(1){

           IsCount(count);

           count++;

           DisplayNumByOrder(count);  

           if(count==999) count=0;

    }

}

 

 

9.  在上题的基础上,用另外三个独立键盘实现按下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始。

#include <reg51.h>

#define unit unsigned int

unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码

//数码管前三位显示一个跑表,从000999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。

sbit high=P2^4;

sbit mid=P2^3;

sbit low=P2^2;

sbit Key1=P3^0;//开始

sbit Key2=P3^1;//暂停

sbit Key3=P3^2;//清零

const bit PRESSED=0;//按下

const bit SUSPEND=1;//0的时候运行,1的时候暂停

//监测

void delay_1ms(unit x){

    unit i=x;

    unit j;

    for(;i>0;--i){

       for(j=110;j>0;--j);

    }

}

/**

    在数码管上显示对应的值

**/

void display(unsignedchar Num)

{

    P0=NumTable[Num];

    delay_1ms(1);

    P0=0;      //送完段选信号后,进行消影的处理

}

 

/**

    控制数码管显示后3位,并分解计数值

**/

void DisplayNumByOrder(unit Count){

       low=0; mid=0; high=0;  display(0);        

        low=1; mid=0; high=0;  display(0);               

        low=0; mid=1; high=0;  display(0);

       low=1; mid=1; high=0;  display(0);

       low=0; mid=0; high=1;  display(0);

       low=1; mid=0; high=1;  display(Count%1000/100);

       low=0; mid=1; high=1;  display(Count%100/10);

       low=1; mid=1; high=1;  display(Count%10);

}

 

//是否清零

void IsClear(unit * count){

    if(PRESSED==Key3){       //当按键按下

       delay_1ms(10);       //去抖动

       if(PRESSED==Key3){   //当按键按下

           *count=0;

       }

    }

}

//是否暂停

void IsSuspend(unit * count){

    if(PRESSED==Key2){       //当按键按下

       delay_1ms(10);       //去抖动

       if(PRESSED==Key2){   //当按键按下

           while(SUSPEND){  

              IsClear(count);          //监测是否需要清零

              if(PRESSED==Key1)return;//跳出暂停

              DisplayNumByOrder(*count);//显示原数值

           }

       }

    }

}

 

 

//扫描键盘

void main(){

    int count=0;

    while(1){

           IsSuspend(&count);

           IsClear(&count);

           count++;

           DisplayNumByOrder(count);  

           if(count==999) count=0;

    }

}

 

 

 

10.按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...

#include <reg51.h>

#include <stdio.h>

#define unit unsigned int

#define uchar unsigned char

 

unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码

//10.按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...

 

sbit high=P2^4;

sbit mid=P2^3;

sbit low=P2^2;

sbit Key1=P3^0;//开始

sbit Key2=P3^1;//暂停

sbit Key3=P3^2;//清零

const bit PRESSED=0;//按下

const bit SUSPEND=1;//0的时候运行,1的时候暂停

//延时

void delay_1ms(unit x){

    unit i=x;

    unit j;

    for(;i>0;--i){

       for(j=110;j>0;--j);

    }

}

/**

    在数码管上显示对应的值

**/

void display(unsignedchar Num)

{

    P0=NumTable[Num];

    delay_1ms(1);

    P0=0;      //送完段选信号后,进行消影的处理

}

 

/**

    控制数码管显示后3位,并分解计数值

**/

void DisplayNumByOrder(unit Count){

       low=0; mid=0; high=0;  display(0);        

        low=1; mid=0; high=0;  display(0);               

        low=0; mid=1; high=0;  display(0);

       low=1; mid=1; high=0;  display(0);

       low=0; mid=0; high=1;  display(0);

       low=1; mid=0; high=1;  display(Count%1000/100);

       low=0; mid=1; high=1;  display(Count%100/10);

       low=1; mid=1; high=1;  display(Count%10);

}

 

//是否清零

void IsClear(unit * count){

    if(PRESSED==Key3){       //当按键按下

       delay_1ms(10);       //去抖动

       if(PRESSED==Key3){   //当按键按下

           *count=0;

       }

    }

}

//是否暂停

void IsSuspend(unit * count){

    if(PRESSED==Key2){       //当按键按下

       delay_1ms(10);       //去抖动

       if(PRESSED==Key2){   //当按键按下

           while(SUSPEND){  

              IsClear(count);          //监测是否需要清零

              if(PRESSED==Key1)return;//跳出暂停

              DisplayNumByOrder(*count);//显示原数值

           }

       }

    }

}

 

uchar scanKey(){

    uchar tmp, key;

 

    P3 =0xf0;

    tmp = P3;

    tmp = tmp &0xf0;

    if(tmp !=0xf0){//确定列

       switch(tmp){

       case0xe0:key =1;break;

       case0xd0:key =2;break;

       case0xb0:key =3;break;

       case0x70:key =4;break;

       }

    }

    //确定行

    P3 =0x0f;

    tmp = P3;

    tmp = tmp &0x0f;

    if(tmp !=0x0f){

       switch(tmp){

       case0x0d:key = key;break;

       case0x0b:key =4+ key;break;

       case0x07:key =8+ key;break;

       }         

    }

    return key;

}

 

//扫描键盘

void main(){

    // int count=0;

    while(1){

       unit key= scanKey();

       DisplayNumByOrder(key*key);

    }

}

本文转自陈哈哈博客园博客,原文链接http://www.cnblogs.com/kissazi2/p/3174347.html如需转载请自行联系原作者


kissazi2

相关文章
|
2月前
【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
|
3月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
2月前
|
数据采集 监控 安全
Io 语言在公司电脑监控软件中的应用可能性
在数字化办公时代,企业对电脑监控软件需求增长,以确保信息安全与合规。Io语言独特的编程特性为监控软件开发带来新可能。其简洁动态的语法适合处理复杂监控任务。通过Io语言,可轻松实现网络数据采集及系统资源监控,如CPU使用率与内存状态的实时获取。Io的消息传递机制支持模块间高效通信,尽管存在社区小和库资源有限等挑战,但仍展现出在企业监控领域的应用潜力。
24 1
|
2月前
|
Ubuntu Linux
内核实验(九):添加IO驱动的阻塞读写功能
本文通过修改内核模块代码,介绍了如何在Linux内核中为IO驱动添加阻塞读写功能,使用等待队列和条件唤醒机制来实现读写操作的阻塞和非阻塞模式,并在Qemu虚拟机上进行了编译、部署和测试。
11 0
|
2月前
51单片机汇编语言点亮一位数码管,并计时(超详细分析汇编语言)
51单片机汇编语言点亮一位数码管,并计时(超详细分析汇编语言)
|
2月前
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
|
2月前
|
算法
51单片机不用定时器的数码管倒计时
51单片机不用定时器的数码管倒计时
|
3月前
|
并行计算 监控 数据处理
构建高效Python应用:并发与异步编程的实战秘籍,IO与CPU密集型任务一网打尽!
【7月更文挑战第16天】Python并发异步提升性能:使用`asyncio`处理IO密集型任务,如网络请求,借助事件循环实现非阻塞;`multiprocessing`模块用于CPU密集型任务,绕过GIL进行并行计算。通过任务类型识别、任务分割、避免共享状态、利用现代库和性能调优,实现高效编程。示例代码展示异步HTTP请求和多进程数据处理。
47 8
|
3月前
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
131 1
|
4月前
|
数据采集 算法 数据处理
Python并发编程:异步IO与多线程的比较与应用
本文探讨了Python中异步IO和多线程两种并发编程模型的优劣及其在实际应用中的适用性。通过比较它们在性能、资源消耗和代码复杂度等方面的差异,分析了不同场景下选择合适的并发模型的策略和方法。
下一篇
无影云桌面