当前位置:文档之家› 数码管显示实验报告

数码管显示实验报告

三、数码管显示实验
一、实验目的及要求
理解8段数码管的基本原理,理解8段数码管的显示和编程方法,理解4连排共阴极8段数码管J3641AS通过DP1668与CPU的接线图。

理解8段数码管原理,运行与理解各子程序,编制一个4连排8段数码管程序,CPU 的P2口接左、右两个DP1668的控制引脚,各DP1668接LED的数据线hgfedcba,在4 连排8段数码管显示编程的日期。

熟悉结构后,自行编程左边四个数码管,显示分钟和秒,当计时达到一个小时,就重新从00:00开始计时。

另外,指定计时的开始值。

二、实验原理(图)
8段数码管一般由8个发光二极管(Llight-emitting diode,LED)组成,每一个位段就是一个发光二极管。

一个8段数码管分别由a、b、c、d、e、f、g位段,外加上一个小数点的位段h(或记为dp)组成。

根据公共端所接电平的高低,可分为共阳极和共阴极两种。

三、实验设备(环境):
1、电脑一台
2、STC-ISP(V6.85I)烧写应用程序
3、Keil应用程序
四、实验内容(算法、程序、步骤和方法):
#include<STC15F2K60S2.h> //此文件中定义了STC15系列的一些特殊功能寄存器
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit TM1668R_DIO_H = P4^4; //左边数码管宏定义
sbit TM1668R_CLK_H = P2^0;
sbit TM1668R_STB_H = P2^1;
sbit TM1668L_DIO_H = P2^2; //左边数码管宏定义
sbit TM1668L_CLK_H = P2^3;
sbit TM1668L_STB_H = P2^4;
sbit LIGHT = P0^1;
uchar Today_data[8];
uint temp,kk;
const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void Send_Data(uchar dat,uchar n);
void DIS_data_1668(uchar data1,uchar data2,uchar data3,uchar data4,uchar n);
/****************************************************************************** *
* 函数名: Send_Data
* 函数功能: TM1668发送一字节数据函数
* 输入: 无
* 输出: 无
******************************************************************************/ void Send_Data(uchar dat,uchar n)
{
uchar i;
for(i = 0;i<8;i++) //1个字节
{
if(n==0)
TM1668R_CLK_H = 0;
else
TM1668L_CLK_H = 0;
if(dat&(1<<i))
{
if(n==0)
TM1668R_DIO_H = 1;
else
TM1668L_DIO_H = 1;
}
else
{
if(n==0)
TM1668R_DIO_H = 0;
else
TM1668L_DIO_H = 0;
}
_nop_();
_nop_();
_nop_();
_nop_();
if(n==0)
TM1668R_CLK_H = 1;
else
TM1668L_CLK_H =1;
}
}
void DIS_data_1668(uchar data1,uchar data2,uchar data3,uchar data4,uchar n) {
if(n==0)
TM1668R_STB_H = 0;
else
TM1668L_STB_H = 0;
Send_Data(0x00,n); //设置显示模式4位13段
if(n==0)
TM1668R_STB_H = 1;
else
TM1668L_STB_H = 1;
_nop_();
_nop_();
_nop_();
_nop_();
if(n==0)
TM1668R_STB_H = 0;
else
TM1668L_STB_H =0;
Send_Data(0x40,n); // 写数据自动地址加一
if(n==0)
TM1668R_STB_H = 1;
else
TM1668L_STB_H = 1;
_nop_();
_nop_();
_nop_();
_nop_();
if(n==0)
TM1668R_STB_H = 0;
else
TM1668L_STB_H = 0;
Send_Data(0xc0,n); //发送地址指令从0x00开始
_nop_();
_nop_();
Send_Data(data1,n);
Send_Data(0x00,n);
Send_Data(data2,n);
Send_Data(0x00,n);
Send_Data(data3,n);
Send_Data(0x00,n);
Send_Data(data4,n);
Send_Data(0x00,n);
if(n==0)
TM1668R_STB_H = 1;
else
TM1668L_STB_H = 1;
_nop_();
_nop_();
_nop_();
_nop_();
if(n==0)
TM1668R_STB_H = 0;
else
TM1668L_STB_H = 0;
Send_Data(0x88,n);
if(n==0)
TM1668R_STB_H = 1;
else
TM1668L_STB_H = 1;
}
/****************************************************************************** *
* 函数名: Timer0Init
* 函数功能: 定时器0初始化
* 输入: 无
* 输出: 无
******************************************************************************/
void Timer0Init(void) //25微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式1T和12T模式选择
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xEC; //设置定时初值
TH0 = 0xFE; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0 IE.1
EA = 1; //使能全局中断IE.7
}
/****************************************************************************** *
* 函数名: main
* 函数功能: 主函数
* 输入: 无
* 输出: 无
******************************************************************************* /
void main(void)
{
Timer0Init();
LIGHT = 1;
while(1)
{
DIS_data_1668(table[6],table[1],table[0],table[2],0);
DIS_data_1668(table[1],table[5],table[0],table[8],1);
}
}
五、实验结论(结果):
本实验实现了XXX功能,核心算法采用了XXX的方式,达到了预期目的。

六、实验心得与小结:
(自行填写,如:功能是否实现;整个过程中存在哪些问题;如何解决的….)。

相关主题