一、实验内容:
(1)在实验箱上完成:
编写程序,用定时器产生0.1S定时中断,对时钟计数器计数,并将数值实时地送数码管显示(左边2个数码管显示“时”,中间2个显示“分”,右边2个显示“秒”)。
(2)用Proteus软件参照实验电路连线并仿真运行,得出与实验箱上相同的软件仿真结果。
所用元器件:单片机AT89C51、8位锁存器74LS273或74LS373、3-8译码器74LS138、排阻或电阻RESPACK-8(RES)、或非门74LS02、共阳极六合一数码管7SEG-MPX6-CA
二、实验电路及功能说明
1.数码显示电路:
①电路组成:6个共阳极数码管、2个74LS273锁存器 ②端口地址:
字型口(段码锁存器)——FFDCH 字位口(位码锁存器)——FFDDH
2.动态显示:
每次只有一个数码管显示其相应字符,并且从左往右反复快速扫描,利用人眼的“视觉滞留”效益实现“同时”显示不同字符的工作方式。
3.字型码表:(共阳极)
0~9:0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
三、实验程序流程图:
主程序:
子程序:
四、实验结果分析
五、心得体会
通过实验让我进一步了解、熟练掌握单片机定时器的编程技巧;同时掌握八段数码LED显示器的工作原理和编程方法。使我对c51有了更深的了解和学习的兴趣。
六、程序清单
#include #define ZX XBYTE[0xffdc] #define ZW XBYTE[0xffdd] unsigned char hour=12, min=59,sec=50; unsigned a1,a2,a3,a4,a5,a6; char unsigned ,9}; unsigned char code char unsigned char num=0; void delay(); void main() { ,0x92,0x82,0xF8,0x80,0 TMOD=0X01; TH0=(65536-5000)/256; TL0=(65536-5000)%256; buffer[]={0,1,2,3,4,5,6,7,8 table[]={0xC0,0xF9,0xA4,0xB0,0x99 x90}; EA=1; ET0=1; TR0=1; while(1) { if(num==10) { num=0; sec++; if(sec==60) { sec=0; min++; if(min==60) { hour++; min=0; if(hour==24) { hour=0; } } } } a1=hour/10; a2=hour%10; a3=min/10; a4=min%10; a5=sec/10; a6=sec%10; ZX=table[buffer[a6]]; ZW=0x01; delay(); ZW=0; ZX=table[buffer[a5]]; ZW=0x02; delay(); ZW=0; ZX=table[buffer[a4]]; ZW=0x04; delay(); ZW=0; ZX=table[buffer[a3]]; ZW=0x08; delay(); ZW=0; ZX=table[buffer[a2]]; ZW=0x10; delay(); ZW=0; ZX=table[buffer[a1]]; ZW=0x20; delay(); ZW=0; } } void delay() { int i; for(i=0;i<100;i++); } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; num++; } 因篇幅问题不能全部显示,请点此查看更多更全内容