|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于AT89C52单片机的数码管类实验
* T3 k3 B# P& I' @% o" Q电路原理图如下3 g' R. j: g& S1 C5 _( Z# v
0 a1 j- F# j, l% m# j
; R. Y$ g& p1 [# W6 Q _* ]
单片机源程序如下:
) Q6 j4 R( m* S/ S. U8 _4 @- /***************************************************************************
- 标题: 数码管的显示
- 效果: 显示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--);
- }
* `8 `+ ~. r( V! x0 T6 o 1 U2 n0 V" T3 r/ Q0 i! v# C3 `( c
复制代码% R- b- `1 t% y/ r* U3 W( k
- /***************************************************************************
- 标题: 数码管的显示
- 效果: 显示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--);
- }
- " u; k4 Y x$ V2 t! z7 T9 W2 g
) k8 b1 H" u/ T复制代码
( @5 C% ~2 q. K- /***************************************************************************
- 标题: 数码管的显示
- 效果: 静态显示一位数码管,显示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; //查表输出数码管段值给P0口,显示相应的0-9
- delay(500); //延时
- }
- }
- }
- //延时子函数,参数范围 0-65536
- void delay(unsigned int tmp)
- {
- unsigned char j;
- while(tmp--){
- j=255;
- while(j--);
- }
- }
/ _+ a! q1 V+ k0 J z
4 r! ?3 f6 U- R( {复制代码
6 ^. O9 b2 g+ W6 {- /***************************************************************************
- 标题: 数码管的显示
- 效果: 静态显示一位数码管,显示一个"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); //程序停止
- }
- 9 v4 A) R$ |+ L2 ^; ?7 H
8 l# n% }+ r8 G0 q3 {复制代码) Q! B& `( x- L: L
- /***************************************************************************
- 标题: 数码管的显示
- 效果: 显示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;
- }( O5 @5 H$ U+ L8 `2 ^
以上Keil代码下载:
5 \0 w6 W C) K- O" W7 c( f
7 Z; {9 K% b4 o5 m. {, {+ Z3 x9 u
+ K; o0 G( b5 Y) r5 G1 U0 O W3 b9 G
3 U( i/ K1 ] Z. ]0 U1 e
|
|