用51单片机写一个程序:用定时中断T0T1控制4个数码管显示1...
2个回答
2011-05-25
展开全部
用51单片机写一个程序:用定时中断T0T1控制4个数码管显示1...
分内容转自:《51单片机C语言创新教程》温子祺等著。
原理:
软件设计方面使用动态驱动数码管的方式,即要保证当数码管显示时的效果没有闪烁的现象出现,亮
度一致,没有拖尾现象。由于人眼对频率大于对24Hz以上的光的闪烁不敏感,这是利用了人眼视觉暂留的特点。一般来说,每一个数码管点亮时间为1~2ms就可以了。如果某一个数码管点亮时间过长,则这个数码管的亮度过高,如果某一个数码管的点亮时间过短,则这个数码管的亮度过暗。因此我们必须设计一个定时器来定时点亮数码管,在该例子中,定时器的定时为5ms,即每个数码管点亮时间为5ms,扫描四个数码管的时间为20ms。
源码:
/*实验名称:数码管实验
*描 述:在该章节的数码管实验当中,
使用动态驱动数码管的方式来编写程序,
程序的实现方式是数码管从0-9999循环显示
*作 者:温子祺
*修改日期:2010/5/4
*/
#include "stc.h"
#define HIGH 1
#define LOW 0
#define LS164_DATA(x) {if((x))P0_4=1;else P0_4=0;}
#define LS164_CLK(x) {if((x))P0_5=1;else P0_5=0;}
#define SEG_PORT P0
unsigned char Timer0IRQEvent=0;
unsigned char Time1SecEvent=0;
unsigned int TimeCount=0;
unsigned char SegCurPosition=0;
code unsigned char SegCode[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};
//code unsigned char SegPosition[4]={0xfe,0xfd,0xfb,0xf7};
code unsigned char SegPosition[4]={0xf7,0xfb,0xfd,0xfe};
unsigned char SegBuf[4] ={0};
void LS164Send(unsigned char byte)
{
unsigned char j;
for(j=0;j=7;j++)
{
if(byte&(1(7-j)))
{
LS164_DATA(HIGH);
}
else
{
LS164_DATA(LOW);
}
LS164_CLK(LOW);
LS164_CLK(HIGH);
}
}
void RefreshDisplayBuf(void) //刷新显示缓存
{
SegBuf[0] =TimeCount%10;
SegBuf[1] =TimeCount/10%10;
SegBuf[2] =TimeCount/100%10;
SegBuf[3] =TimeCount/1000%10;
}
void SegDisplay(void)
{
unsig......绿竹别其三分景 红梅正报万家春 春回大地
分内容转自:《51单片机C语言创新教程》温子祺等著。
原理:
软件设计方面使用动态驱动数码管的方式,即要保证当数码管显示时的效果没有闪烁的现象出现,亮
度一致,没有拖尾现象。由于人眼对频率大于对24Hz以上的光的闪烁不敏感,这是利用了人眼视觉暂留的特点。一般来说,每一个数码管点亮时间为1~2ms就可以了。如果某一个数码管点亮时间过长,则这个数码管的亮度过高,如果某一个数码管的点亮时间过短,则这个数码管的亮度过暗。因此我们必须设计一个定时器来定时点亮数码管,在该例子中,定时器的定时为5ms,即每个数码管点亮时间为5ms,扫描四个数码管的时间为20ms。
源码:
/*实验名称:数码管实验
*描 述:在该章节的数码管实验当中,
使用动态驱动数码管的方式来编写程序,
程序的实现方式是数码管从0-9999循环显示
*作 者:温子祺
*修改日期:2010/5/4
*/
#include "stc.h"
#define HIGH 1
#define LOW 0
#define LS164_DATA(x) {if((x))P0_4=1;else P0_4=0;}
#define LS164_CLK(x) {if((x))P0_5=1;else P0_5=0;}
#define SEG_PORT P0
unsigned char Timer0IRQEvent=0;
unsigned char Time1SecEvent=0;
unsigned int TimeCount=0;
unsigned char SegCurPosition=0;
code unsigned char SegCode[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};
//code unsigned char SegPosition[4]={0xfe,0xfd,0xfb,0xf7};
code unsigned char SegPosition[4]={0xf7,0xfb,0xfd,0xfe};
unsigned char SegBuf[4] ={0};
void LS164Send(unsigned char byte)
{
unsigned char j;
for(j=0;j=7;j++)
{
if(byte&(1(7-j)))
{
LS164_DATA(HIGH);
}
else
{
LS164_DATA(LOW);
}
LS164_CLK(LOW);
LS164_CLK(HIGH);
}
}
void RefreshDisplayBuf(void) //刷新显示缓存
{
SegBuf[0] =TimeCount%10;
SegBuf[1] =TimeCount/10%10;
SegBuf[2] =TimeCount/100%10;
SegBuf[3] =TimeCount/1000%10;
}
void SegDisplay(void)
{
unsig......绿竹别其三分景 红梅正报万家春 春回大地
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询