if(i==weishu)j=0x02;
}
else
{
if(flag)j=0xdf;//show负号
else{if(i!
=0)j=0xff;}//oxff就不显示
flag=0;
}
}
send(j);
w=w/10;//每显示一位,除10
}
return;
}
51单片机接74ls164驱动数码管的C程序
#include
sbitsclk=P2^0;
sbitsda=P2^1;
sbitslck=P2^2;
inttab[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
voiddelay()
{
inti,j;
for(i=0;i<255;i++)
for(j=0;j<80;j++);
}
voidbit_dat(biti)
{sclk=0;
sda=i;
sclk=1;
}
voiddat(chari)
{
slck=0;
bit_dat((bit)(tab[i]&0x80));
bit_dat((bit)(tab[i]&0x40));
bit_dat((bit)(tab[i]&0x20));
bit_dat((bit)(tab[i]&0x10));
bit_dat((bit)(tab[i]&0x08));
bit_dat((bit)(tab[i]&0x04));
bit_dat((bit)(tab[i]&0x02));
bit_dat((bit)(tab[i]&0x01));
slck=1;
}
main()
{inti;
while
(1)
{
for(i=0;i<10;i++)
{dat(i);
delay();
}
i=0;
}
}
程序如下:
/**************************************/
/*74LS164数码管动态显示*/
/**************************************/
//-------------------------------------库函数声明,管脚定义------------
#include
#defineucharunsignedchar
sbitsimuseri_CLK=P1^1;//用P1^1模拟串口时钟
sbitsimuseri_DATA=P1^0;//用P1^0模拟串口数据
sbita0=ACC^0;
unsignedcharcodedis_code[11]={0x28,0x7E,0xa2,0x62,//查表显示0,1、、9
0x74,0x61,0x21,0x7A,0x20,0x60,0x01};
ucharnumer,temp;
ucharge,shi;
//----------------------------------------------------------------------------
//函数名称:
out_simuseri
//输入参数:
data_buf
//输出参数:
无
//功能说明:
8位同步移位寄存器,将data_buf的数据逐位输出到simuseri_DATA
//----------------------------------------------------------------------------
voidout_simuseri(uchardata_buf)
{
uchari;
i=8;
ACC=data_buf;
do
{
simuseri_CLK=0;
simuseri_DATA=a0;
simuseri_CLK=1;
ACC=ACC>>1;
}
while(--i!
=0);
}
/************************************/
voiddelay(ucharms)//延时程序
{
uchari;
while(ms--)
{
for(i=0;i<125;i++);
}}
/***********************************/
voidmain()
{
ucharm;
while
(1)
{
for(temp=0;temp<99;temp++)
{
ge=temp/10;
shi=temp%10;
for(m=0;m<20;m++)//显示频率200ms加1次
{
P2_0=0;//位段码
numer=dis_code[ge];
out_simuseri(numer);//个位移位显示
delay(5);
P2_0=1;
P2_1=0;
numer=dis_code[shi];//十位移位
out_simuseri(numer);
delay(5);
P2_1=1;
}
m=0;
}
}
}
/****************************************/
*******************************************************************************
第二个程序
74HC164是个移位寄存器,以下程序是我用过的,绝对没问题:
其中ShowData为164数据脚,ShowClck为164时钟脚;
voidShow_164(unsignedchar_ShowValue)
{
unsignedcharCount0;
for(Count0=0;Count0<=7;Count0++)
{
if((_ShowValue&0x80)==0x80)
ShowData=1;
else
ShowData=0;
_ShowValue<<=1;
ShowClck=0;
_nop_();
_nop_();
ShowClck=1;
}
}
基于51单片机的简易数字频率计
要求使用定时/计数器1作定时用,定时1s;定时/计数器0作计数器用,被计数的外部脉冲从P3.4(T0)接入。
单片机将在1s内对脉冲计数并送四位数码管显示,最大计数显示值为0FFFFH。
求程序。
悬赏分:
30-解决时间:
2010-6-2722:
26
;===============================================
最佳答案:
这是个简易频率计,程序如下:
;---------------------------------
ORG0000H
JMPSTART
ORG000BH
JMPT0_INT
;---------------------------------
START:
MOVTMOD,#51H ;/*01010001T1计数,T0定时*/
MOVTH0,#HIGH(65536-50000);50ms@12MHz
MOVTL0,#LOW(65536-50000)
MOVTH1,#0
MOVTL1,#0
SETBTR0
SETBTR1
SETBET0
SETBEA
MOVR7,#20
SJMP$
;---------------------------------
T0_INT:
;50ms执行一次
MOVTL0,#LOW(65536-50000);重新写入初始值
MOVTH0,#HIGH(65536-50000);50ms@12MHz
DJNZR7,T0_END
MOVR7,#20
MOVP1,TL1
MOVP2,TH1
MOVTL1,#0
MOVTH1,#0
T0_END:
RETI
;---------------------------------
END
外接74系列驱动电路就行,比如74LS164或74LS138。
动态扫描就是给各个数码管依次显示,任意时间只有一个数码管亮,但闪烁的太快了,人眼分辨不出,给人的感觉就是每个数码管都在亮。
一般过程就是赋值,开显示,延时,关显示,这是我以前写过的程序
#include
main()
{unsignedinti;
while
(1)
{P0=0x3f;//个位赋值
P1_0=0;//开显示
for(i=0;i<2;i++);//延时
P1_0=1;//关显示
P0=0x6;//十位
P1_1=0;
for(i=0;i<2;i++);
P1_1=1;
P0=0x5b;//百位
P1_2=0;
for(i=0;i<2;i++);
P1_2=1;
P0=0x4f;//千位
P1_3=0;
for(i=0;i<2;i++);
P1_3=1;}
}
这个是4位数码管,P0口接赋值端,P1口低四位接4个数码管的选通端,你要八个的话就把P1口的高四位再接到另外四个数码管的片选端,程序仿照就可以了
以下是共阳数码管简单程序;
p0口接abcdefg,P2口接s0,s1,s2......s7;
软件靠自己啦
如:
main:
movr1,#8;
movr0,#00h;
movr2,#0feh;
loop:
movp0,r0;送显示数据
incr0;
movp2,r2;选通要显示的数码管
lcalldelay;
mova,r2;
rla;
movr2,a;
djnzr1,loop;
ajmpmain;
delay:
movr7,#245;延时大约1ms
djnzr7,$;
ret