标题:
51单片机数码管实验程序(动态、静态显示)注释很详细
[打印本页]
作者:
Galtondaxy
时间:
2022-5-20 17:59
标题:
51单片机数码管实验程序(动态、静态显示)注释很详细
基于AT89C52单片机的数码管类实验
电路原理图如下
1.png
(87.07 KB, 下载次数: 30)
下载附件
2022-5-20 19:47 上传
单片机源程序如下:
/***************************************************************************
标题: 数码管的显示
效果: 显示00-99,动态显示+变化显示
******************************************************************************/
//头文件:
#include "reg51.h"
//变量定义:
unsigned char table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//表:共阳数码管 0-9
//引脚定义:
sbit SMG_q = P1^0; //定义数码管阳级控制脚(千位)
sbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)
sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)
sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)
//函数声明:
void display(unsigned char da);//定义显示函数,参数为显示内容,只显示两位数
void delay(void);
//主函数,C语言的入口函数:
void main(void)
{
unsigned char i=0; //作为查表的索引号
unsigned char ldata; //变量用作0~99计数
unsigned int j; //此变量作为计数跳变刷新时间
while(1)
{
j=5000;
while(j--){
display(ldata); //刷新5000次,约1秒,注:在C语言里是没有周期可计算的哦~~~
}
if(ldata<99)
ldata++; //刷新完成约1秒,变量做加计数
else
ldata=0;
}
}
//显示函数,参数为显示内容,只显示两位数
void display(unsigned char da)
{
SMG_q=0; //选择十位数码管
P0=table[da/10]; //获取十位值,查表输出定义好的数码管段值与P0口,显示相应的0-9
delay(); //延时
P0=0XFF; //清除数码管显示,因是共阳型,所以不是0
SMG_q=1; //关闭十位数码管
SMG_b=0; //选择个位数码管
P0=table[da%10]; //获取个位值,查表输出定义好的数码管段值与P0口,显示相应的0-9
delay(); //延时
P0=0XFF; //清除数码管显示,因是共阳型,所以不是0
SMG_b=1; //关闭个位数码管
}
//延时子函数,短暂延时
void delay(void){
unsigned char i=10;
while(i--);
}
复制代码
/***************************************************************************
标题: 数码管的显示
效果: 显示1234,从这个例子可以学习多位数码管的动态显示技术
******************************************************************************/
//头文件:
#include "reg51.h"
//变量定义:
unsigned char table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//表:共阳数码管 0-9
//引脚定义:
sbit SMG_q = P1^0; //定义数码管阳级控制脚(千位)
sbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)
sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)
sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)
//函数声明:
void delay(void); //延时子函时
//主函数,C语言的入口函数:
void main(void)
{
unsigned char i=0; //作为查表的索引号
while(1) //不停的循环扫描,不扫描则不显示或显示不正确,即为动态显示,
{ //数码管显示 1234,可自行修改
SMG_q=0; //选择千位数码管
P0=table[1]; //查找"1"定义好的数码管段值与P0口输出,显示相应的1
delay(); //加入短暂延时
P0=0XFF; //清除数码管显示,因是共阳型,所以不是0
SMG_q=1; //关闭千位数码管
SMG_b=0; //选择百位数码管
P0=table[2]; //查找"2"定义好的数码管段值与P0口输出,显示相应的2
delay(); //加入短暂延时
P0=0XFF; //清除数码管显示,因是共阳型,所以不是0
SMG_b=1; //关闭百位数码管
SMG_s=0; //选择十位数码管
P0=table[3]; //查找"2"定义好的数码管段值与P0口输出,显示相应的2
delay(); //加入短暂延时
P0=0XFF; //清除数码管显示,因是共阳型,所以不是0
SMG_s=1; //关闭十位数码管
SMG_g=0; //选择个位数码管
P0=table[4]; //查找"2"定义好的数码管段值与P0口输出,显示相应的2
delay(); //加入短暂延时
P0=0XFF; //清除数码管显示,因是共阳型,所以不是0
SMG_g=1; //关闭个位数码管
}
}
//延时子函数,短暂延时
void delay(void){
unsigned char i=10;
while(i--);
}
复制代码
/***************************************************************************
标题: 数码管的显示
效果: 静态显示一位数码管,显示0-9
******************************************************************************/
//头文件:
#include "reg51.h"
//变量定义:
unsigned char table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//表:共阳数码管 0-9
//引脚定义:
sbit SMG_q = P1^0; //定义数码管阳级控制脚(千位)
sbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)
sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)
sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)
//函数声明:
void delay(unsigned int d_time); //延时子函时,
//主函数,C语言的入口函数:
void main(void)
{
unsigned char i; //定义循环变量
while(1)
{
SMG_q=0; //选择千位数码管,这是静态显示,P0口输出显示,不需要刷新,也可选择百位、十位或个位;
//也可两位或全部同时输出显示
for(i=0;i<10;i++) //循环显示0-9
{
P0=table[i]; //查表输出数码管段值给P0口,显示相应的0-9
delay(500); //延时
}
}
}
//延时子函数,参数范围 0-65536
void delay(unsigned int tmp)
{
unsigned char j;
while(tmp--){
j=255;
while(j--);
}
}
复制代码
/***************************************************************************
标题: 数码管的显示
效果: 静态显示一位数码管,显示一个"5"
******************************************************************************/
//头文件:
#include "reg51.h"
//引脚定义:
sbit SMG_q = P1^0; //定义数码管阳级控制脚(千位)
sbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)
sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)
sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)
//主函数,C语言的入口函数:
void main(void)
{
SMG_q=0; //打开千位数码管,这是静态显示,P0口输出显示,不需要刷新,也可选择百位、十位或个位;
//也可两位或全部同时输出显示
P0=0x92; //输出数码管段值给P0口,显示相应的5,
//0-9的段值分别是(共阳):0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
while(1); //程序停止
}
复制代码
/***************************************************************************
标题: 数码管的显示
效果: 显示1234,缓冲显示
******************************************************************************/
//头文件:
#include "reg51.h"
//变量定义:
code unsigned char table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//表:共阳数码管 0-9
unsigned char l_disbuff[4]={1,2,3,4,};//显示缓冲
unsigned char l_posit=0; //显示位置
//引脚定义:
sbit SMG_q = P1^0; //定义数码管阳级控制脚(千位)
sbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)
sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)
sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)
//函数声明:
void delay(unsigned int timer); //延时子函时
void display(); //显示
//主函数,C语言的入口函数:
void main(void)
{
unsigned int i=10000,j=1000;
while(1) //不停的循环扫描,不扫描则不显示或显示不正确,即为动态显示,
{
display(); //调用显示缓冲内容
delay(10);
}
}
//延时子函数,短暂延时
void delay(unsigned int timer){
while(timer--);
}
//显示函数,参数为显示内容
void display()
{
P0=0XFF; //
switch(l_posit){
case 0: //选择千位数码管,关闭其它位
SMG_q=0;
SMG_b=1;
SMG_s=1;
SMG_g=1;
P0=table[l_disbuff[0]]; //输出显示内容
break;
case 1: //选择百位数码管,关闭其它位
SMG_q=1;
SMG_b=0;
SMG_s=1;
SMG_g=1;
P0=table[l_disbuff[1]];
break;
case 2: //选择十位数码管,关闭其它位
SMG_q=1;
SMG_b=1;
SMG_s=0;
SMG_g=1;
P0=table[l_disbuff[2]];
break;
case 3: //选择个位数码管,关闭其它位
SMG_q=1;
SMG_b=1;
SMG_s=1;
SMG_g=0;
P0=table[l_disbuff[3]];
break;
}
l_posit++; //每调用一次将轮流显示一位
if(l_posit>3)
l_posit=0;
}
复制代码
以上Keil代码下载:
纯代码.7z
(16.66 KB, 下载次数: 14)
2022-5-23 03:21 上传
点击文件名下载附件
数码管类实验包
下载积分: 黑币 -5
作者:
heicad
时间:
2022-5-23 03:36
注释够详细 对初学者有参考价值
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1