数码管: 基于STC89C52的数码管设计详解

说明:
选通一个数码管分两步,
第一步是位选,即选择哪个数码管亮, 这里位选是通过锁存器U2的WE1~WE6来选择第一个数码管到第六个数码管,由于数码管为共阴极(相对于8位数码管),那么这里WE端为0代表位选选通,
第二步是段选,即选择数码管的哪位亮, 这里段选是通过锁存器U1的a~h来选择数码管的8位管子,这里DUAN端为1代表段选选通.
二. 程序设计详解
1. 让第一个数码管显示8
#include
sbit duan = P2 ^ 6;
sbit wela = P2 ^ 7;
void main()
{
}
2. 让6个数码管显示反复显示0~F
#include
#define uchar unsigned char
#define uint unsigned int
sbit duan = P2 ^ 6;
sbit wela = P2 ^ 7;
uchar code table[] = {
};
void delayms(uint xms);
void main()
{
}
void delayms(uint xms)
{
}
3.
第一个数码管显示1,时间为0.5s,然后关闭它,
第二个数码管显示2,时间为0.5s,然后关闭它,
…
第六个数码管显示6,时间为0.5s,然后关闭它,
依次循环.
#include
#define uchar unsigned char
#define uint unsigned int
sbit duan = P2 ^ 6;
sbit wela = P2 ^ 7;
uchar code we_table[] = {
};
uchar code du_table[] = {
};
void delayms(uint xms);
void main()
{
}
void delayms(uint xms)
{
}
说明:
只要将延时时间调整为1s,我们可以看到数码管一起显示123456.
P0 = 0xff; 是用来消影, 即消除段选与位选之间的影响.
4.
定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,
定时器1的方式1实现数码管前两位59s循环计时
#include
#define uchar unsigned char
#define uint unsigned int
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;
sbit led1 = P1 ^ 0;
uchar code table[] = {
};
void delayms(uint);
void display(uint);
uchar num, num1, num2;
void main()
{
}
void display(uint num)
{
}
void delayms(uint xms)
{
}
void T0_time() interrupt 1
{
}
void T1_time() interrupt 3
{
}
5. 用定时器以间隔500MS在6位数码管上依次显示0、1、2、3….C、D、E、F,重复
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;
uchar num, tt;
uchar code table[] = {
};
void main()
{
}
void T0_timer() interrupt 1
{
}
6. 利用动态扫描方法在六位数码管上显示出稳定的654321
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;
uchar code du_table[] = {
};
uchar code we_table[] = {
};
void delayms(uint);
void main()
{
}
void delayms(uint xms)
{
}
7. 用动态扫描方法和定时器1在数码管的前三位显示出秒表,精确到1%秒,即后两位显示1%秒,一直循环下去
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;
uint tt;
uchar code du_table[] = {
};
void display(uint);
void delayms(uint);
void main()
{
}
void T1_timer() interrupt 3
{
}
void display(uint num)
{
}
void delayms(uint xms)
{
}
8. 利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。到此保持住
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;
uchar code table[] = {
};
uchar temp, t0, t1, bai, shi, ge, flag, flag1;
uint shu;
void init();
void display(uchar, uchar, uchar, uchar, uchar, uchar);
void delayms(uint);
void main()
{
}
void init()
{
}
void T0_timer() interrupt 1
{
}
void T1_timer() interrupt 3
{
}
void display(uchar aa, uchar bb, uchar cc, uchar bai, uchar shi, uchar ge)
{
}
评论