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;

;--i){

;--j);

}

}

void main()

{

){

P1=0x00;

delay);   //0.5秒

P1=0xff;

delay);//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;

;--i){

;--j);

}

}

sbit JiDian;

void main()

{

){

JiDian=0x00;

delay);   //0.5秒

JiDian=0xff;

delay);//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;

;--i){

;--j);

}

}

void main()

{

int i;

P2=0x00;

){

;i++){

P2=table[i];

delay);//2秒

}

}

}

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

#include<reg51.h>

#define unit unsigned int

void delay(unit x){

unit i=x;

unit j;

;--i){

;--j);

}

}

void main(){

){

P2=0xff;

while(P2!=0x00){

P2++;

delay);//2秒

}

}

}

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

说明: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;

;--i){

;--j);

}

}

void DisplayNumByOrder(unit DelayNum){

int i;

;i++){

P0=NumTable[i];

delay(DelayNum);//2秒

}

}

void main(){

//P0是段选,P2是位选

P2=0x00;

){

DisplayNumByOrder);

}

}

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

说明:JP15与JP16 用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};//数字的编码

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

void delay_1ms(unit x){

unit i=x;

unit j;

;--i){

;--j);

}

}

/**

在数码管上显示对应的值

**/

void display(unsignedchar k)

{

P0=NumTable[k];

delay_1ms);

}

sbit high;

sbit mid;

sbit low;

/**

位,并分解计数值

**/

void DisplayNumByOrder(unit Count,unit delay_1msNum){

low);

low);

low);

low);

low);

low);

low);

low);

}

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

void main(){

;

){

count++;

DisplayNumByOrder);

;

}

}

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;

;--i){

;--j);

}

}

void DisplayNumByOrder(unit DelayNum){

int i;

;i++){

P0=NumTable[i];

P2=table[i];

delay(DelayNum);//5ms

}

}

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

void main(){

//P0是位选,P2是段选

//P2=0x00;

){

DisplayNumByOrder);

}

}

8.  数码管前三位显示一个跑表,从000到999之间以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};//数字的编码

到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。

sbit high;

sbit mid;

sbit low;

sbit IsCountKey;//是否计数的按键

的时候暂停

//监测

void delay_1ms(unit x){

unit i=x;

unit j;

;--i){

;--j);

}

}

/**

在数码管上显示对应的值

**/

void display(unsignedchar Num)

{

P0=NumTable[Num];

delay_1ms);

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

}

/**

位,并分解计数值

**/

void DisplayNumByOrder(unit Count){

low);

low);

low);

low);

low);

low);

low);

low);

}

//是否计数

void IsCount(unit count){

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

delay_1ms);       //去抖动

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

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

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

}

}

}

}

//扫描键盘

void main(){

;

){

IsCount(count);

count++;

DisplayNumByOrder(count);

;

}

}

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};//数字的编码

到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。

sbit high;

sbit mid;

sbit low;

sbit Key1;//开始

sbit Key2;//暂停

sbit Key3;//清零

;//按下

的时候暂停

//监测

void delay_1ms(unit x){

unit i=x;

unit j;

;--i){

;--j);

}

}

/**

在数码管上显示对应的值

**/

void display(unsignedchar Num)

{

P0=NumTable[Num];

delay_1ms);

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

}

/**

位,并分解计数值

**/

void DisplayNumByOrder(unit Count){

low);

low);

low);

low);

low);

low);

low);

low);

}

//是否清零

void IsClear(unit * count){

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

delay_1ms);       //去抖动

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

;

}

}

}

//是否暂停

void IsSuspend(unit * count){

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

delay_1ms);       //去抖动

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

while(SUSPEND){

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

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

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

}

}

}

}

//扫描键盘

void main(){

;

){

IsSuspend(&count);

IsClear(&count);

count++;

DisplayNumByOrder(count);

;

}

}

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};//数字的编码

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

sbit high;

sbit mid;

sbit low;

sbit Key1;//开始

sbit Key2;//暂停

sbit Key3;//清零

;//按下

的时候暂停

//延时

void delay_1ms(unit x){

unit i=x;

unit j;

;--i){

;--j);

}

}

/**

在数码管上显示对应的值

**/

void display(unsignedchar Num)

{

P0=NumTable[Num];

delay_1ms);

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

}

/**

位,并分解计数值

**/

void DisplayNumByOrder(unit Count){

low);

low);

low);

low);

low);

low);

low);

low);

}

//是否清零

void IsClear(unit * count){

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

delay_1ms);       //去抖动

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

;

}

}

}

//是否暂停

void IsSuspend(unit * count){

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

delay_1ms);       //去抖动

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){

;break;

;break;

;break;

;break;

}

}

//确定行

P3 =0x0f;

tmp = P3;

tmp = tmp &0x0f;

if(tmp !=0x0f){

switch(tmp){

case0x0d:key = key;break;

+ key;break;

+ key;break;

}

}

return key;

}

//扫描键盘

void main(){

// int count=0;

){

unit key= scanKey();

DisplayNumByOrder(key*key);

}

}

实验1 单片机IO口应用及数码管显示的更多相关文章

  1. STM32系列单片机IO口模式设置

    STM32单片机的每组IO口都有4个32位配置寄存器用于配置GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR和GPIOx_PUPDR,2个32位数据寄存器用于配置输入和 ...

  2. 单片机IO口驱动能力

    以STM32的IO口为例,最大的输出电流和灌入电流在芯片手册上都有说明.单个IO口一般都是十几mA到几十mA,同时总的VDD电流也有限制,大概为150mA.所以单片机驱动外设时,如果不是信号型而是功率 ...

  3. 如何检测 51单片机IO口的下降沿

    下降沿检测,说白了就是满足这样一个逻辑,上次检测是1,这次检测是0,就是下降沿. 从这个条件可知,要确保能够正确检测到一个下降沿,负脉冲的宽度,必须大于一个检测周期,当负脉冲宽度小于一个检测周期,就有 ...

  4. 51单片机:IO口扩展芯片用法(74HC165,74HC595)

    IO口扩展芯片,主要是解决单片机IO口太少. 74HC165:数据从并转串 74HC595:数据从串转并 两种芯片,都是通过时序电路,加上移位功能,进行数据传输 74HC165:数据从并转串.以下实例 ...

  5. 单片机小白学步系列(二十) IO口原理

    IO口操作是单片机实践中最基本最重要的一个知识,本篇花了比較长的篇幅介绍IO口的原理. 也是查阅了不少资料,确保内容正确无误,花了非常长时间写的. IO口原理原本须要涉及非常多深入的知识,而这里尽最大 ...

  6. MOS管、PCB、H桥、步进电机驱动电路、51单片机的IO口驱动能力、灌电流、拉电流、上拉电阻的选择

    嵌入式开发PCB设计几点体会(转载):http://bbs.ednchina.com/BLOG_ARTICLE_3021801.HTMCollector-Emitter Saturation Volt ...

  7. 51单片机I/O引脚IO口工作原理

    51单片机I/O引脚IO口工作原理 一.51单片机管脚p0.p1.p2.p3口区别如下: 1.意思不同P0口作输出口用时,需加上拉电阻.P0口有复用功能.当对外部存储器进行读写操作时,P0口先是提供外 ...

  8. AVR单片机8位数码管显示的程序实现

    AVR单片机8位数码管显示的程序实现 转载:http://www.sohu.com/a/117255149_119709   2016-10-26 16:30 我们接着来完成 数码管的显示实验.现在我 ...

  9. 单片机与控制实验(5)——重量测量并在LCD12864显示

    一.实验目的和要求 掌握点阵式液晶显示屏的原理和控制方法,掌握点阵字符的显示方法.掌握模拟/数字(A/D)转换方式,进一步掌握使用C51语言编写程序的方法,使用C51语言编写实现重量测量的功能. 二. ...

随机推荐

  1. cocos jsb工程转html 工程

    1 CCBoot.js prepare方法:注掉下面这行,先加载moduleConfig中的脚本后加载user脚本 //newJsList = newJsList.concat(jsList); // ...

  2. Mysql导入excel数据,解决某些特殊字符乱码问题

    问题 做项目需要从excel表格导入到mysql的数据库表中,excel表格中的“规格”字段的“×”符号导入数据库表中,会出现部分数据的“×”这个符号会乱码,成“?”的形式. 解决方法 打开excel ...

  3. 关于对话框不能响应OnKeyDown和OnChar函数的一些说明

    (1)现象  在MFC的对话框中,映射了WM_CHAR和WM_KEYDOWN消息响应函数后,还是不能响应OnKeyDown和OnChar. (2)原因  因为MFC在进行设计的时候,这两个消息被对话框 ...

  4. 下载编译安装Apache HTTP Server 2.4.23以及配置HTTP/HTTPS反向代理

    http://blog.csdn.net/gangchengzhong/article/details/52910225 [注意,在编译make时出现的错误并不是文章中说的openssl的版本问题,而 ...

  5. 访问前台页面${pageContext.request.contextPath}/el表达式失效问题解决

    访问前台页面${pageContext.request.contextPath}/el表达式失效问题解决 2017年05月09日 10:54:18 AinUser 阅读数:922 标签: el表达式4 ...

  6. 根据方法名获取方法Body Content

    利用 MethodBody类的GetILAsByteArray方法可以获取到返回字节数组的MSIL的body.然后再去解析此字节数组, 可以得到MSIL,然后你再去解析MSIL,你就可以得到你想到so ...

  7. mybatis 时间区间比较

    直接上代码,此时数据库使用的Date类型: <if test="minCreateTime != null and minCreateTime != ''"> < ...

  8. [转]两表join的multi update语句在MySQL中的执行流程分析

    出自:http://hedengcheng.com/?p=209 两表join的multi update语句,执行结果与预计不一致的分析过程 — multi update结论在实际应用中,不要轻易使用 ...

  9. mysql 数据类型及java对应关系

    http://www.cnblogs.com/jerrylz/p/5814460.html    Java数据类型和MySql数据类型对应表 http://www.cnblogs.com/yiwd/p ...

  10. Warning:The /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql'

    Mac OS X的升级或其他原因可能会导致MySQL启动或开机自动运行时   在MySQL操作面板上会提示“Warning:The /usr/local/mysql/data directory is ...