和我预想的一致,接下来该涉及外设了!
/********************************************************
*********数码管显示*****数码管显示********************
数码管显示****************数码管显示
***************************************************/
//实例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