
sbit P10=P1^0//控制LED闪烁
unsigned char count=0//计数变量
void main()
{
TMOD = 0x01//设定时器0为模式1,16位模式
TH0=0xdc
TL0=0x00//设定时值为10ms,此时晶振频率是11.0592MHZ
//若晶振频率是12MHZ,则初值应为 TH0=0xd8TL0=0xf0
ET0 = 1//定时器0中断打开
EA = 1//允许CPU中断
TR0 = 1//启动定时器0
while(1)
{
if(count==40) //0.4秒时间是否到
{
count=0//计数变量清零,为下一次计数做准备
P10=!P10 //IO口取反,即LED亮灭变化
}
}
}
//定时器0中断处理子程序
void Time0() interrupt 1 using 0
{
TH0=0xdc
TL0=0x00//设定时值为10ms
count++ //计数加一
}
因为你的显示数码管数量比较多,应该是用扫描的方法来显示的。1.所以对于硬件来说,你可以在单片机的输出端使用244缓冲输出器,提高负载的驱动能力,同时加三极管形成达林顿阵列(当然你也可以使用IC芯片),接在数码管的一段,在数码管的另一端(比如说共阴数码管共阴端)你可以加一个三极管作为地址锁存器,关闭不需要显示的数码管,同时锁住需要显示的部分,减少闪烁。
2.中断用C来写的话可能你程序部分没有写好,写好的话不会出现闪烁的现像,建议你用汇编语言再写一次试。
你先试着在公共端,增加三极管,锁住数码管显示的数字,一般来说这样应该可以避免闪烁了。
#include<reg52.h>sbit P00=P0^0
sbit key=P1^0
unsigned int i=0
void main(void)
{
TMOD=0x10//设定定时器的工作模式为定时器1方式1
TH1=15536/256//向定时器装入初值高八位
TL1=15536%256//向定时器装入初值低八位
EA=1//开总开关
ET1=1//开分开关
TR1=1//启动定时器
while(1)
{
if(key==0)TR1=0
else TR1=1
}
}
void t1(void) interrupt 3//定时器0服务函数
{
TH1=15536/256//向定时器装入初值高八位
TL1=15536%256//向定时器装入初值低八位
if(++i==30)//延时1.5S
{
i=0
P00=~P00//闪烁
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)