gxslxxm 发表于 2020-5-30 22:07 谢谢您的回复,我另一个pwm可调占空比的程序数码管确实有闪烁。 |
BilibiliGiao 发表于 2020-5-30 17:33 没有必要把显示程序放在中断,稍微改一下即可不用delay。
|
|
很久项目不用io口扫数码管了。有点不知道怎么说。 简单说: 1:io口扫描数码管要注意是扫描的时间间隔。 满足扫描间隔的前提下,如果主循环里有ALU占用时间过长的函数,那么数码管扫描的程序放到中断里扫描来满足扫描时间的间隔。(假设在突发情况下,一个模拟iic的流程可能会占用5ms时间,那么,有可能就会因为这个导致数码管亮度异常或者闪烁) 2:看了一眼程序,改进的程序中放在中断中的程序已经把每一位的扫描分时出来了。如果时序没问题是可以的。修改意见:定时器的时间注释出来;if 改成 siwtch 语句(我觉得相对直观);电路有问题,一般不这么设计,至于为什么自己去看看三极管一般怎么用。 |
|
//按普中的视频改了改不知道行不行 #include<reg51.h> #include<stdio.h> unsigned char dis; //sbit relay = P1^0; unsigned char code nondis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9 //定时器1初始化 void timerinit() { TMOD|=0X10; TH1=0xFC; TL1=0x18; ET1=1; EA=1; TR1=1; } void main(void) { P0=0x80; EA = 1; ET0 = 1; EX0 = 1; IT0 = 1; ET0 = 0; TMOD = 0x06; TH0 = 0;//9 TL0 = 0;//9 TR0 = 1; timerinit(); while(1); } void int0() interrupt 0 // 清空 { TL0 = 0 ; } //void counter1() interrupt 1 //{ // relay = ~relay; //} void Time1() interrupt 3 // 清空 { static unsigned short i; unsigned char gewei,shiwei,baiwei; baiwei=TL0/100; gewei=TL0%10; shiwei=(TL0/10)%10; TH1=0xFC; TL1=0x18; i++; if(i==10) { P2=0xff; P2=nondis[gewei];//个位 P0=0x80; } if(i==20) { P2=0xff; P2=nondis[shiwei];//十位 P0=0x40; } if(i==30) { i=0; P2=0xff; P2=nondis[baiwei];//百位 P0=0x20; } } |