- 实验目的
掌握STC89C52RC单片机最小系统构成,最小系统由单片机芯片、时钟电路及复位电路组成。
掌握STC89C52RC单片机开发板与数码管的原理图、控制方式。
掌握对单片机I/O的复杂控制
熟练掌握C语言的设计和调试方法。
- 实验仪器
一套STC89C52RC开发板套件,包括STC89C52RC开发板,以及USB烧录线。
- 设计要求
使用STC89C52RC的I/O控制、调配数码管,使得数码管能够在相应的位置显示出99累减。
- 实验原理
通过观察原理图使用I/O口进行数据的控制,通过段码与位码分别控制数码管的数字、以及控制哪个数码管进行数字显示,最后通过循环函数实现99累减的功能,在预计的数码管上显示。
- 实验流程
- 根据教材进行学习数码管显示控制,本项目单片机为八段共阴数码管,段码为{ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f},分别表示0~9
- 根据教材进行学习定时器相关知识,学习教材上的99累减代码。
- 将代码烧录进入单片机
- 实验结果
单片机数码管上数字从99开始递减直至00。
- 代码
#include <reg52.h>
#define DataPort P0 //定义数据端口
sbit LATCH1 = P2 ^ 6; //定义锁存使能端口 段锁存
sbit LATCH2 = P2 ^ 7; // 定义锁存使能端口 位锁存
unsigned char code DuanMa[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管段码表
unsigned char code WeiMa[] = { 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码表
unsigned char TempData[8]; //用来存放数码管数据
void Delay(unsigned int t); //延迟函数
void Display(unsigned char FirstBit, unsigned char Num); //数码管显示函数
main()
{
unsigned char num = 99; //设置初始数字为99
unsigned int j = 0; //设置初始变量j用于计数,与累减器数字变化的时间相关
while (1)
{
j++;
if (j == 500) //这个数字与数码管数字变化时间有关
{
j = 0;
if (num > 0)
{
num--; //控制累减器数字递减
}
else
{
num = 99; //当数字为00时,数字重置为99
}
}
TempData[0] = DuanMa[num / 10]; //取十位数
TempData[1] = DuanMa[num % 10]; //取个位数
Display(2, 2);
}
}
void Delay(unsigned int t)
{
while (t--)
{
}
}
void Display(unsigned char FirstBit, unsigned char Num)
{
unsigned char i;
for (i = 0; i < Num; i++)
{
DataPort = 0; //清空数据,防止有交替重影
LATCH1 = 1;
LATCH1 = 0;
DataPort = WeiMa[i + FirstBit]; //取位码
LATCH2 = 1; //位锁存
LATCH2 = 0;
DataPort = TempData[i]; //取显示数据,段码
LATCH1 = 1; //段锁存
LATCH1 = 0;
Delay(200); //扫描间隙延时,时间太长会闪烁
//太短会造成重影
}
}