单片机c语言版数码管动态显示实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数码管动态显示实验
一、实验要求
1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路
2.在电路中增加四个7段数码管(共阳/共阴自选),将P1口作数据输出口与7段数码
管数据引脚相连,P2.0~P2.3引脚输出选控制信号
3.在Keil软件中编写程序,采用动态显示法,实现数码管显示变量unsigned int
show_value的值(show_value的值范围为0000~9999),即把show_value的千百
十个位的值用数码管显示出来。

二、实验目的
1.巩固Proteus软件和Keil软件的使用方法
2.学习端口输入输出的高级应用
3.掌握7段数码管的连接方式和动态显示法
4.掌握查表程序和延时等子程序的设计
三.实验说明
(条理清晰,含程序的一些功能分析计算)
如下图(五)所示,由P1口将要显示的数字输给七段数码管;再由P2第四位输给数码管的公共端,作为扫描输入信号;用外部中断P3.2和P3.3分别接PB1与PB2,实现数字的增减。

所要实现的功能是,开始运行电路功能图时,四个数码管分别显示0000,按下PB1增1,直到9999回到0000,相反按下PB2减1,直到0000回到9999。

在算相关数据时,由于要显示个十百千的不同数字,要调用disp函数,
disp[0]=show/1000; //显示千位的值 disp[1]=show%1000/100; //显示百位的值
disp[2]=show%100/10; //显示十位的值 disp[3]=show%10; //显示个位的值
本实验需要用到IE寄存器与TCON寄存器。

四、硬件原理图及程序设计
(一)硬件原理图设计
图(五)
开始运行proteus,四个数码管显示0000,按下PB1数码管增1,按下PB2数码管减1。

(二)程序流程图设计
三)程序设源代码
#include<reg51.h> //定义8051寄存器头文件
#define SEG7P P1 // 定义数码管输入信号接P1 #define SCANP P2 //定义数码管扫描信号接P2 char code TAB[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, //数字0~4 0x92, 0x83, 0xf8, 0x80, 0x98 };//数字5~~9 char disp[4]={0,0,0,0}; //显示数组
void delay_ms(int x); //声明延迟函数char scan[4]={0xfe,0xfd,0xfb,0xf7}; //声明输入扫描信号char i,j; //声明变量
void display(); //显示数组diso的内容int show=0000; //定义初始值
void get_disp(); //声明返回diap main() //主程序开始
{
IE=0X85; //开IE寄存器,允许INT0和INT1中断
TCON=0X05; //开INT0,INT1
while(1) //无穷循环
{
get_disp();
display();
}
}
void delay_ms(int x) //声明延迟函数
{ int i,j; //定义变量
for (i=0;i<x;i++) //开始计数,计数x次
for (j=0;j<120;j++); //计数120次,延迟1ms }
void display() //声明显示函数
{
for(i=0;i<4;i++) //开始计数,计数4次{ j=disp[3-i]; //diap的值附到变量j SCANP=scan[i]; //显示扫描信号
SEG7P=TAB[j]; //显示数字到数码管
delay_ms(4); //延迟4ms
}
}
void INT0_ISR(void) interrupt 0 //INT0中断子程序开始 {
if(show<9999) //如果显示数值小于9999
show++; //显示数值自增1
else show=0; //否则显示数值0
}
void_INT1_ISR(void) interrupt 2 //INT1中断子程序开始
{
if(show>0) //如果显示数值大于0
show--; //显示数值自减1
else show=9999; //否则显示数值9999
}
void get_disp ()
{
disp[0]=show/1000; //显示千位的值disp[1]=show%1000/100; //显示百位的值
disp[2]=show%100/10; //显示十位的值
disp[3]=show%10; //显示个位的值
}
五.实验总结
实验过程中遇到的问题及解决方法、体会
问题1:运行电路原理图时,数码管都不亮。

解决方法:定义IE寄存器时,没有开启总开关EA,导致数码管不能正常显示数字。

问题2:按下PB1或PB2,数码管乱码。

解决方法:因为使用了两个外部中断,所以INT0和INT1都要开启,在声明INT0和INT1时,起初写成if(show<9999);show--;if(show>0);show++;而应该是if(show<9999);show++;if(show>0);show--;最电路原理图能正常显示0000~9999。

体会:科学的魅力太强大了,从之前的一个数码管亮0~9,现在只要你想要几个数码管亮就可以接几个,写入正确的程序,就能实现你想要的效果。

程序一直在增多,实现的功能也在无穷的变换着,越来越觉得单片机实现的功能,在生活中也随处可见。

相关文档
最新文档