51单片机C语言程序100例分析(4)外设

发布时间:2022-12-07  

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


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


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


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


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


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


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


void main(void)


{


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


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


}

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


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


#include //包含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          //   包含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              //   包含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     //  包含51单片机寄存器定义的头文件

#include//包含随机函数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 char k)

{

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

  P0=Tab[k/10];            //显示十位

  delay();

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

  P0=Tab[k%10];           //显示个位

  delay();

  P2=0xff;      //关闭所有数码管

}

void main(void)//主函数

{

  TMOD=0x01;//使用定时器T0秒

  TH0=(65536-46083)/256; //将定时器计时时间设定为46083×1.085微=50000微秒=50毫秒

  TL0=(65536-46083)%256;

  EA=1;//开启总中断

  ET0=1;//定时器T0中断允许

  TR0=1;//启动定时器T0开始运行

  int_time=0;//中断次数初始化

  second=0;//秒初始化

  while(1)

  {

     DisplaySecond(second);//调用秒的显示子程序

  }

}

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

//函数功能:定时器T0的中断服务程序

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

void interserve(void) interrupt 1 using 1

{

TR0=0;    //关闭定时器T0

int_time++;          //每来一次中断,中断次数int_time自加1

if(int_time==20)    //够20次中断,即1秒钟进行一次检测结果采样

{

int_time=0;     //中断次数清0

second++;     //秒加1

if(second==60)

second=0;//秒等于60就返回0

}

TH0=(65536-46083)/256;    //重新给计数器T0赋初值

TL0=(65536-46083)%256;

TR0=1;     //启动定时器T0

}


//实例66:数码时钟设计

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

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

unsigned char port[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

unsigned char int_time;//中断次数计数变量

unsigned char second;     //秒计数变量

unsigned char minute;     //分钟计数变量

unsigned char hour;      //小时计数变量

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

{

  unsigned char j;

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

}

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

函数功能:显示秒的子程序

入口参数:s

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

void Display Second(unsigned char s)

{

  P2=0xbf;          //P2.6引脚输出低电平,DS6点亮

  P0=Tab[s/10];            //显示十位

  delay();

  P2=0x7f;         //P2.7引脚输出低电平,DS7点亮

  P0=Tab[s%10];           //显示个位

  delay();

  P2=0xff;      //关闭所有数码管

}

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

函数功能:显示分钟的子程序

入口参数:m

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

void Display Minute(unsigned char m)

{

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

  P0=Tab[m/10];//显示个位

  delay();

  P2=0xef;   //P2.4引脚输出低电平,DS4点亮

  P0=Tab[m%10];

  delay();

  P2=0xdf;   //P2.5引脚输出低电平,DS5点亮

  P0=0xbf;   //分隔符“-”的段码

  delay();

  P2=0xff;   //关闭所有数码管

}

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

函数功能:显示小时的子程序

入口参数:h

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

void Display Hour(unsigned char h)

{

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

  P0=Tab[h/10];            //显示十位

  delay();

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

  P0=Tab[h%10];     //显示个位

  delay();

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

  P0=0xbf;      //分隔符“-”的段码

  delay();

  P2=0xff;      //关闭所有数码管

}

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

函数功能:主函数

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

void main(void)

{

  TMOD = 0x01;                //使用定时器T0

  EA=1;                      //开中断总允许

  ET0=1;                     //允许T0中断

  TH0=(65536-46083)/256;   //定时器高八位赋初值

  TL0=(65536-46083)%256;   //定时器低八位赋初值

  TR0=1;

  int_time=0;     //中断计数变量初始化

  second=0;       //秒计数变量初始化

  minute=0;      //分钟计数变量初始化

  hour=0;         //小时计数变量初始化

  while(1)

  {

    DisplaySecond(second);     //调用秒显示子程序

    delay();

    DisplayMinute(minute);    //调用分钟显示子程序

    delay();

    DisplayHour(hour);

    delay();

  }

}

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

函数功能:定时器T0的中断服务子程序

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

void interserve(void) interrupt 1 using 1   //usingTime0

{

  int_time++;

  if(int_time==20)

  {

    int_time=0;     //中断计数变量清0

    second++;       //秒计数变量加1

  }

  if(second==60)

 {

   second=0;     //如果秒计满60,将秒计数变量清0

   minute++;     //分钟计数变量加1

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>