[精品]两位数码管显示计时器
一、题目
用定时0的方式1实现数码管两位59S循环计时(计时器) 二、思路
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
本实验利用单片机的定时器/计数器定时和计数的原理,通过proteus 仿真软件来实现模拟实现。模拟利用AT89C51单片机、LED数码管实现秒表的计时。
其中一个两位数码管用来显示数据,一位用来显示个位秒,另一位用来显示十位秒。当计数超过范围时所有数码管全部清零重新计数。
三、实验设计原理图
四、程序流程图
五、程序代码如下:
#include
#define uchar unsigned char
#define uint unsigned int
uchar num,count,ge,shi;
void delay(uint);
void display(uchar,uchar);
uchar SEG[]={0xc0,0xf9,0xa4,0xb0,0x99, //显示数码管0-9数字
0x92,0x83,0xf8,0x80,0x98}; void main()
{
TMOD=0x01; //设置定时器工作方式 T0的工作方式为1
TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872
TL0=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
while(1) //程序在这里不停的对数码管动态扫描同时等待中断发生
{
display(shi,ge);
}
}
/*以下是设计中断服务程序的时间和显示*/ void T0_time()interrupt 1
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
if(++num= =20) //如果到了20次,说明1秒时间到
{
num=0; //然后把num清0重新再记20次
if(++count==60) //这个数用来送数码管显示,到60后归0
count=0;
shi=count/10; //把一个2位数分离后分别送数码管显示,十位和个位
ge=count%10;
}
}
/*以下为延迟函数*/
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //延迟时间为 xms乘以50ms
for(j=110;j>0;j--);
}
/*以下为显示数码管的子函数*/
void display(uchar shi,uchar ge)
{
P3=0xfe; //打开P3.0,及打开数码管1引脚
P2=SEG[ge];
delay(20);
P3=0xfd; //打开P3.1,及打开数码管2引脚
P2=SEG[shi];
delay(20);
}
六实验过程遇到的问题总结
1. 由于重新接触单片机,软硬件较生疏,刚看题目没思路,只能网上查资料看,再理解,
相当的费力。
2. 连接硬件找不到元器件,英文的都看不到,只能一个个翻译才找到元器件,英文真的很
重要。以下是用到组别的英文单词
Microprocessor ICs 微处理器集成电路(里面包含各样的集成芯片如:89C51,MAX232等)
Optoelectronics 光电学(包含各类数码管、led、点阵、液晶屏) 后来又遇到 两位数码管的1、2引脚参数不懂,现在懂得了: 1引脚:显示右边第一个
2引脚:显示左边第一个
3. 由于C语言没掌握扎实,编程序思路还没很好掌握,但通过一次实验多次调试,有进步
了。