51单片机如何跳出wile循环_51单片机C语言程序100例分析(4)外设

和我预想的一致,接下来该涉及外设了!

/********************************************************

*********数码管显示*****数码管显示********************

数码管显示****************数码管显示

***************************************************/

//实例60:用LED数码显示数字5

#include<reg51.h>//包含51单片机寄存器定义的头文件

void main(void)

{

P2=0xfe;//P2.0引脚输出低电平,数码显示器接通电源准备点亮

P0=0x92;//让P0口输出数字"5"的段码92H

}

说是外设其实就是利用IO引脚而已,可见基础的重要性。

//实例61:用LED数码显示器循环显示数字0~9

#include<reg51.h> //包含51单片机寄存器定义的头文件

/**************************************************

函数功能:延时函数,延时一段时间

***************************************************/

void delay(void)

{

unsigned char i,j;

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

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

;

}

/**************************************************

函数功能:主函数

***************************************************/

void main(void)

{

unsigned char i;

unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//数码管显示0~9的段码表,程序运行中当数组值不发生变化时,

//前面加关键字code,可以大大节约单片机的存储空间

P2=0xfe;   //P2.0引脚输出低电平,数码显示器DS0接通电源工作

while(1)   //无限循环

{

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

{

P0=Tab[i];  //让P0口输出数字的段码92H

delay();   //调用延时函数

}

}

}

//实例62:用数码管慢速动态扫描显示数字"1234"

#include<reg51.h>          //   包含51单片机寄存器定义的头文件

void delay(void)          //延时函数,延时一段时间

{

unsigned char i,j;

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

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

;

}

void main(void)

{

while(1)    //无限循环

{

P2=0xfe;   //P2.0引脚输出低电平,DS0点亮

P0=0xf9;  //数字1的段码

delay();

P2=0xfd;   //P2.1引脚输出低电平,DS1点亮

P0=0xa4;  //数字2的段码

delay();

P2=0xfb;   //P2.2引脚输出低电平,DS2点亮

P0=0xb0;  //数字3的段码

delay();

P2=0xf7;   //P2.3引脚输出低电平,DS3点亮

P0=0x99;  //数字4的段码

delay();

P2=0xff;

}


}

注意外设的原理,主要是看引脚的对接和电平的逻辑

//实例63:用LED数码显示器伪静态显示数字1234

#include<reg51.h>              //   包含51单片机寄存器定义的头文件

void delay(void)          //延时函数,延时约0.6毫秒

{

unsigned char i;

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

;

}

void main(void)

{

while(1)    //无限循环

{

P2=0xfe;   //P2.0引脚输出低电平,DS0点亮

P0=0xf9;  //数字1的段码

delay();

P2=0xfd;   //P2.1引脚输出低电平,DS1点亮

P0=0xa4;  //数字2的段码

delay();

P2=0xfb;   //P2.2引脚输出低电平,DS2点亮

P0=0xb0;  //数字3的段码

delay();

P2=0xf7;   //P2.3引脚输出低电平,DS3点亮

P0=0x99;  //数字4的段码

delay();

P2=0xff;

}

}

//实例64:用数码管显示动态检测结果
#include<reg51.h>     //  包含51单片机寄存器定义的头文件
#include<stdlib.h>//包含随机函数rand()的定义文件
unsigned char i;//记录中断次数
unsigned int x;//随机检测的数据
unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示0~9的段码表
/********************************************************************
函数功能:快速动态扫描延时,延时约0.9毫秒
********************************************************************/
void delay(void)
{
  unsigned int i;
  for(i=0;i<300;i++)
}
/*******************************************************************
函数功能:4位数的数码显示器显示
入口参数:k
出口参数:无
********************************************************************/
void display(unsigned int k)
{
  P2=0xfe;   //即P2=11111110B,P2.0引脚输出低电平,数码显示器DS0接通电源
  P0=Tab[k/1000];          //显示千位
  delay();
  P2=0xfd;   //即P2=11111101B,P2.1引脚输出低电平,数码显示器DS1接通电源
  P0=Tab[(k%1000)/100];            //显示百位
  delay();
  P2=0xfb;   //即P2=11111011B,P2.2引脚输出低电平,数码显示器DS2接通电源
  P0=Tab[(k%100)/10];   //显示十位
  delay();
  P2=0xf7;   //即P2=11110111B,P2.3引脚输出低电平,数码显示器DS3接通电源
  P0=Tab[k%10];//显示个位
  delay();
  P2=0xff;  //关闭所有显示器
}

void main(void)//主函数
{
  TMOD=0x01;//定时器0工作方式一
  TH0=(65536-46083)/256;
  TL0=(65536-46083)%256;
  EA=1;
  ET0=1;
  TR0=1;
  while(1)
  {
    display(x);//调用检测结果的显示程序
  }
}
/********************************************************
函数功能:定时器T0的中断服务程序
*******************************************************/
void Time0(void) interrupt 1 using 1
{
  TR0=0;    //关闭定时器T0
  i++;      //每来一次中断,i自加1
  if(i==20)   //够20次中断,即1秒钟进行一次检测结果采样
  {
    x=rand()/10;      //随机产生一个从0到32767的整数,再将其除以10,获得一个随机4位数,模拟检测结果
    i=0;              //将i清0,重新统计中断次数
  }
  TH0=(65536-46083)/256;    //重新给计数器T0赋初值
  TL0=(65536-46083)%256;
  TR0=1;     //启动定时器T0
}

x在中断中发生改变,通过显示函数显示,这个函数的结构就是一个比较复杂的程序的常用结构了,包括初始化和功能块,注意逻辑分析。

//实例65:数码秒表设计

包含51单片机寄存器定义的头文件

unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示0~9的段码表

unsigned char int_time;          //记录中断次数

unsigned char second;          //储存秒

/********************************************************************

***

函数功能:快速动态扫描延时,延时约0.6毫秒

*********************************************************************

***/

void delay(void)

{

unsigned char i;

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

;

}

/********************************************************************

***

函数功能:显示秒

入口参数:k

出口参数:无

*********************************************************************

***/

void Display Second(unsigned
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值