2019年11月30日 星期六
2019年11月19日 星期二
引用出處https://www.quora.com/Why-is-the-small-signal-model-of-an-npn-transistor-identical-to-an-pnp-transistor
As you can see, the components are the same, but the battery is now placed inversed. Since there are DC-blockers at the input and outputs, this doesnt matter for the normal functioning.
Remember that in small signal analysis all the indempendent voltage sources are shorted. It only rests the model for the transistors but if you take a look at the next image, they actually have the same behavior (only the conventions are changed). So, as you can see, both circuits have the same model.
As it says, the small signal model is a... model. Models serve to solve problems that usually cannot or are too difficult to be solved by simple mathematics, however they work for certain conditions. For the small signal model, the condition is that all the signals involved be small (hence the name os the model) in such a way that the transistor does not go out of the operation point.
So the only diference between these circuits happens when you try to amplify something that saturates the output, and thats why we have lab classes with this subject.
A small signal transistor model is a linearized model at the operation point (quiescent point) for analyzing small amplitude AC signal. Since DC supply is AC ground, this eliminates the issue with power supply and ground differences between NPN and PNP. A small amplitude AC signal is both adding and subtracting from the quiescent point; with the polarities of Ic, Ie and Ib being consistent, the ac signal cannot tell the difference between NPN and PNP. Therefore, the model can be exactly the same.
This website will help you understand all there is to know about the transistors:
"An NPN transistor receives positive voltage at the collector terminal. This positive voltage to the collector allows current to flow across from the collector to emitter, given that there is a sufficient base current to turn the transistor on."
"A PNP transistor receives positive voltage at the emitter terminal. The positive voltage to the emitter allows current to flow from the emitter to the collector, given that there is no current flowing into the base."
2019年11月17日 星期日
108 V4
#include <at89x52.h>
#define key_pwm
0x10
#define key_mode
0x20 //增加一個按鍵P3.5
#define key_start 0x40
#define key_pause 0x80
int
P2table[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x10,0x20,0x40};
char
P0table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char bdata flag;
sbit Mode0_flag=flag^0;
sbit Mode1_flag=flag^1;
sbit up_flag=flag^2;
int task;
int anti_cck_i;
int pili_led_i;
int i=2;
int ii;
int j=0;
int count=0;
char k=0;
int time=0;
char Trg;
char Cont;
int x;
sbit output=P3^0;
int pwm_add=-1;
unsigned char zero_cnt;
sbit buzzer = P3^2;
bit mode_flag;
char bcd[2]={0,0};
char P1table[]={0xFE,0xfD};
void delay_4ms(int k1)//245~248hz約250hz
{
int i,j;
for(i=0;i<k1;i++)
for(j=0;j<40;j++)
;
}
void delay_1ms(int k)
{
int i,j;
for(i=0;i<k;i++)
for(j=0;j<110;j++)
;
}
void task1_seg7_rotate3_cck()//???????
{
for(anti_cck_i=0;anti_cck_i<3;anti_cck_i++)
{
P1=0XFE;P0=0XFE;delay_1ms(50);//?a ???
P1=0XFD;P0=0XFE;delay_1ms(50); //?a???
P1=0XFB;P0=0XFE;delay_1ms(50); //?a???
P1=0XF7;P0=0XFE;delay_1ms(50); //?a???
P1=0XF7;P0=0XDF;delay_1ms(50); //?f???
P1=0XF7;P0=0XEF;delay_1ms(50);
//?e???
P1=0XF7;P0=0XF7;delay_1ms(50); //?d???
P1=0XFB;P0=0XF7;delay_1ms(50); //?d???
P1=0XFD;P0=0XF7;delay_1ms(50); //?d???
P1=0XFE;P0=0XF7;delay_1ms(50); //?d???
P1=0XFE;P0=0XFB;delay_1ms(50); //?c???
P1=0XFE;P0=0XFD;delay_1ms(50); //?b???
}
P1=0XFE;P0=0XFE;delay_1ms(500); //?a???
}
void task2_8LED_rotate3()
{
for(ii=0;ii<3;ii++)
{
for(pili_led_i=0;pili_led_i<14;pili_led_i++)
{
P2=~P2table[pili_led_i];delay_1ms(50);
}
}
}
void task3_buzzer_beep3(int count,int TH,int TL)
{
int i;
for(i=0;i<count;i++)
{
buzzer=0;
delay_1ms(TL);
buzzer=1;
delay_1ms(TH);
}
}
void init()
{
int task=1;//??
if(task==1)
{
P0=~0xFF;P1=0XFF;
task1_seg7_rotate3_cck();//
P0=~0xFF;P1=0XFF;//OFF
task=2;
}
if(task==2)
{
task2_8LED_rotate3();
P2=~0x80;delay_1ms(500);P2=0xFF;
task=3;
}
if(task==3)
{
int i;
for(i=0;i<3;i++)
{
task3_buzzer_beep3(100,1,1);delay_1ms(10);
}
}
}
void T0_int(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P0=P0table[
bcd[j] ];
P1=P1table[j];
j++;
if(j==2) j=0;
}
void T1_int(void) interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time++;
if(time %2==0)
{
count++;
if(count==100) count=0;
bcd[1]=count/10;
bcd[0]=count%10;
}
}
void KeyRead()
{
unsigned char
ReadData = P3^0xff; // 1
ReadData &= 0xF0; //按鍵只讀取 P3.6 及 P3.7
/*
11000000 11000000
&)10000000 &01000000
10000000 01000000
*/
Trg = ReadData
& (ReadData ^ Cont); // 2
Cont =
ReadData; // 3
/*
不是0x80不然就是0x40
*/
}
void KeyProc()
{
if(Trg & key_pwm)
{
TR0=0;TR1=0;
pwm_add++;
if(pwm_add>9)
pwm_add=0;
}
if(Trg &
key_mode)
{
mode_flag=~mode_flag;
if(
mode_flag){TR0=1;TR1=1;}
else {TR0=0;TR1=0;P1=0xfe;P0=0xc0;pwm_add=0;}
}
if(Trg &
key_start) TR1=1;
/*按一次開始計數 P3.6 0x40
& 0x40 =0x40*/
if(Trg &
key_pause)
/*按一次開始計數 P3.7 0x80 & 0x80=0x80*/
{ //短按兩次停止計數
TR1=1;
k++;
if(k == 2)
TR1=0;
}
if(!Trg &
!Cont) //按一次放開後 k 為零
{
zero_cnt++;
if(zero_cnt>10)
{
zero_cnt=0;
k=0;;
}
}
if (Cont &
key_pause)
{
zero_cnt++;
if(zero_cnt>50)
{
zero_cnt=0;
TR1=0;
count=0;
bcd[1]=0;
bcd[0]=0;
}
}
}
void main()
{
init();
P3=0xFF;
IE=0x8A;
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
Mode0_flag=1;
TR0=1; TR1=0;
while(1)
{
if(Mode0_flag==1)
{
delay_1ms(80); //防止按鍵彈跳,delay時間配合短按兩下的時間調整
KeyRead();
KeyProc();
}
if(pwm_add==0)
{
P1=0xfe;P0=P0table[0];
P2=0xFF;//二進制0
x=0;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
if(pwm_add==1)
{
P1=0xfe;P0=P0table[1];
P2=0xF5;//二進制10
x=1;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
if(pwm_add==2)
{
P1=0xfe;P0=P0table[2];
P2=0xEB;//二進制20
x=2;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
if(pwm_add==3)
{
P1=0xfe;P0=P0table[3];
P2=0xE1;//二進制30
x=3;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
if(pwm_add==4)
{
P1=0xfe;P0=P0table[4];
P2=0xD7;//二進制40
x=4;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
if(pwm_add==5)
{
P1=0xfe;P0=P0table[5];
P2=0xCD;//二進制50
x=5;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
if(pwm_add==6)
{
P1=0xfe;P0=P0table[6];
P2=0xB3;//二進制60
x=6;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
if(pwm_add==7)
{
P1=0xfe;P0=P0table[7];
P2=0xB9;//二進制70
x=7;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
if(pwm_add==8)
{
P1=0xfe;P0=P0table[8];
P2=0xA5;//二進制80
x=8;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
if(pwm_add==9)
{
P1=0xfe;P0=P0table[9];
P2=0xA5;//二進制90
x=9;
output=0;delay_4ms(x);
output=1;delay_4ms(10-x);
}
}
}
108 V3
#include <at89x52.h>
#define key_pwm 0x10
#define key_mode 0x20 //增加一個按鍵P3.5
#define key_start 0x40
#define key_pause 0x80
int P2table[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x10,0x20,0x40};
char P0table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char bdata flag;
sbit Mode0_flag=flag^0;
sbit Mode1_flag=flag^1;
sbit up_flag=flag^2;
int task;
int anti_cck_i;
int pili_led_i;
int i=2;
int ii;
int j=0;
int count=0;
char k=0;
int time=0;
char Trg;
char Cont;
int pwm_add=-1;
unsigned char zero_cnt;
sbit buzzer = P3^2;
bit mode_flag;
char bcd[2]={0,0};
char P1table[]={0xFE,0xfD};
void delay_1ms(int k)
{
int i,j;
for(i=0;i<k;i++)
for(j=0;j<110;j++)
;
}
void task1_seg7_rotate3_cck()//???????
{
for(anti_cck_i=0;anti_cck_i<3;anti_cck_i++)
{
P1=0XFE;P0=0XFE;delay_1ms(50);//?a ???
P1=0XFD;P0=0XFE;delay_1ms(50); //?a???
P1=0XFB;P0=0XFE;delay_1ms(50); //?a???
P1=0XF7;P0=0XFE;delay_1ms(50); //?a???
P1=0XF7;P0=0XDF;delay_1ms(50); //?f???
P1=0XF7;P0=0XEF;delay_1ms(50); //?e???
P1=0XF7;P0=0XF7;delay_1ms(50); //?d???
P1=0XFB;P0=0XF7;delay_1ms(50); //?d???
P1=0XFD;P0=0XF7;delay_1ms(50); //?d???
P1=0XFE;P0=0XF7;delay_1ms(50); //?d???
P1=0XFE;P0=0XFB;delay_1ms(50); //?c???
P1=0XFE;P0=0XFD;delay_1ms(50); //?b???
}
P1=0XFE;P0=0XFE;delay_1ms(500); //?a???
}
void task2_8LED_rotate3()
{
for(ii=0;ii<3;ii++)
{
for(pili_led_i=0;pili_led_i<14;pili_led_i++)
{
P2=~P2table[pili_led_i];delay_1ms(50);
}
}
}
void task3_buzzer_beep3(int count,int TH,int TL)
{
int i;
for(i=0;i<count;i++)
{
buzzer=0;
delay_1ms(TL);
buzzer=1;
delay_1ms(TH);
}
}
void init()
{
int task=1;//??
if(task==1)
{
P0=~0xFF;P1=0XFF;
task1_seg7_rotate3_cck();//
P0=~0xFF;P1=0XFF;//OFF
task=2;
}
if(task==2)
{
task2_8LED_rotate3();
P2=~0x80;delay_1ms(500);P2=0xFF;
task=3;
}
if(task==3)
{
int i;
for(i=0;i<3;i++)
{
task3_buzzer_beep3(100,1,1);delay_1ms(10);
}
}
}
void T0_int(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P0=P0table[ bcd[j] ];
P1=P1table[j];
j++;
if(j==2) j=0;
}
void T1_int(void) interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time++;
if(time %2==0)
{
count++;
if(count==100) count=0;
bcd[1]=count/10;
bcd[0]=count%10;
}
}
void KeyRead()
{
unsigned char ReadData = P3^0xff; // 1
ReadData &= 0xF0; //按鍵只讀取 P3.6 及 P3.7
/*
11000000 11000000
&)10000000 &01000000
10000000 01000000
*/
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // 3
/*
不是0x80不然就是0x40
*/
}
void KeyProc()
{
if(Trg & key_pwm)
{
TR0=0;TR1=0;
pwm_add++;
if(pwm_add>9) pwm_add=0;
if(pwm_add==0)
{
P1=0xfe;P0=P0table[0];
P2=0xFF;//二進制0
}
if(pwm_add==1)
{
P1=0xfe;P0=P0table[1];
P2=0xF5;//二進制10
}
if(pwm_add==2)
{
P1=0xfe;P0=P0table[2];
P2=0xEB;//二進制20
}
if(pwm_add==3)
{
P1=0xfe;P0=P0table[3];
P2=0xE1;//二進制30
}
if(pwm_add==4)
{
P1=0xfe;P0=P0table[4];
P2=0xD7;//二進制40
}
if(pwm_add==5)
{
P1=0xfe;P0=P0table[5];
P2=0xCD;//二進制50
}
if(pwm_add==6)
{
P1=0xfe;P0=P0table[6];
P2=0xB3;//二進制60
}
if(pwm_add==7)
{
P1=0xfe;P0=P0table[7];
P2=0xB9;//二進制70
}
if(pwm_add==8)
{
P1=0xfe;P0=P0table[8];
P2=0xA5;//二進制80
}
if(pwm_add==9)
{
P1=0xfe;P0=P0table[9];
P2=0xA5;//二進制90
}
}
if(Trg & key_mode)
{
mode_flag=~mode_flag;
if( mode_flag){TR0=1;TR1=1;}
else {TR0=0;TR1=0;P1=0xfe;P0=0xc0;pwm_add=0;}
}
if(Trg & key_start) TR1=1;
/*按一次開始計數 P3.6 0x40 & 0x40 =0x40*/
if(Trg & key_pause)
/*按一次開始計數 P3.7 0x80 & 0x80=0x80*/
{ //短按兩次停止計數
TR1=1;
k++;
if(k == 2)
TR1=0;
}
if(!Trg & !Cont) //按一次放開後 k 為零
{
zero_cnt++;
if(zero_cnt>10)
{
zero_cnt=0;
k=0;;
}
}
if (Cont & key_pause)
{
zero_cnt++;
if(zero_cnt>50)
{
zero_cnt=0;
TR1=0;
count=0;
bcd[1]=0;
bcd[0]=0;
}
}
}
void main()
{
init();
P3=0xFF;
IE=0x8A;
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
Mode0_flag=1;
TR0=1; TR1=0;
while(1)
{
if(Mode0_flag==1)
{
delay_1ms(80); //防止按鍵彈跳,delay時間配合短按兩下的時間調整
KeyRead();
KeyProc();
}
}
}
#define key_pwm 0x10
#define key_mode 0x20 //增加一個按鍵P3.5
#define key_start 0x40
#define key_pause 0x80
int P2table[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x10,0x20,0x40};
char P0table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char bdata flag;
sbit Mode0_flag=flag^0;
sbit Mode1_flag=flag^1;
sbit up_flag=flag^2;
int task;
int anti_cck_i;
int pili_led_i;
int i=2;
int ii;
int j=0;
int count=0;
char k=0;
int time=0;
char Trg;
char Cont;
int pwm_add=-1;
unsigned char zero_cnt;
sbit buzzer = P3^2;
bit mode_flag;
char bcd[2]={0,0};
char P1table[]={0xFE,0xfD};
void delay_1ms(int k)
{
int i,j;
for(i=0;i<k;i++)
for(j=0;j<110;j++)
;
}
void task1_seg7_rotate3_cck()//???????
{
for(anti_cck_i=0;anti_cck_i<3;anti_cck_i++)
{
P1=0XFE;P0=0XFE;delay_1ms(50);//?a ???
P1=0XFD;P0=0XFE;delay_1ms(50); //?a???
P1=0XFB;P0=0XFE;delay_1ms(50); //?a???
P1=0XF7;P0=0XFE;delay_1ms(50); //?a???
P1=0XF7;P0=0XDF;delay_1ms(50); //?f???
P1=0XF7;P0=0XEF;delay_1ms(50); //?e???
P1=0XF7;P0=0XF7;delay_1ms(50); //?d???
P1=0XFB;P0=0XF7;delay_1ms(50); //?d???
P1=0XFD;P0=0XF7;delay_1ms(50); //?d???
P1=0XFE;P0=0XF7;delay_1ms(50); //?d???
P1=0XFE;P0=0XFB;delay_1ms(50); //?c???
P1=0XFE;P0=0XFD;delay_1ms(50); //?b???
}
P1=0XFE;P0=0XFE;delay_1ms(500); //?a???
}
void task2_8LED_rotate3()
{
for(ii=0;ii<3;ii++)
{
for(pili_led_i=0;pili_led_i<14;pili_led_i++)
{
P2=~P2table[pili_led_i];delay_1ms(50);
}
}
}
void task3_buzzer_beep3(int count,int TH,int TL)
{
int i;
for(i=0;i<count;i++)
{
buzzer=0;
delay_1ms(TL);
buzzer=1;
delay_1ms(TH);
}
}
void init()
{
int task=1;//??
if(task==1)
{
P0=~0xFF;P1=0XFF;
task1_seg7_rotate3_cck();//
P0=~0xFF;P1=0XFF;//OFF
task=2;
}
if(task==2)
{
task2_8LED_rotate3();
P2=~0x80;delay_1ms(500);P2=0xFF;
task=3;
}
if(task==3)
{
int i;
for(i=0;i<3;i++)
{
task3_buzzer_beep3(100,1,1);delay_1ms(10);
}
}
}
void T0_int(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P0=P0table[ bcd[j] ];
P1=P1table[j];
j++;
if(j==2) j=0;
}
void T1_int(void) interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time++;
if(time %2==0)
{
count++;
if(count==100) count=0;
bcd[1]=count/10;
bcd[0]=count%10;
}
}
void KeyRead()
{
unsigned char ReadData = P3^0xff; // 1
ReadData &= 0xF0; //按鍵只讀取 P3.6 及 P3.7
/*
11000000 11000000
&)10000000 &01000000
10000000 01000000
*/
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // 3
/*
不是0x80不然就是0x40
*/
}
void KeyProc()
{
if(Trg & key_pwm)
{
TR0=0;TR1=0;
pwm_add++;
if(pwm_add>9) pwm_add=0;
if(pwm_add==0)
{
P1=0xfe;P0=P0table[0];
P2=0xFF;//二進制0
}
if(pwm_add==1)
{
P1=0xfe;P0=P0table[1];
P2=0xF5;//二進制10
}
if(pwm_add==2)
{
P1=0xfe;P0=P0table[2];
P2=0xEB;//二進制20
}
if(pwm_add==3)
{
P1=0xfe;P0=P0table[3];
P2=0xE1;//二進制30
}
if(pwm_add==4)
{
P1=0xfe;P0=P0table[4];
P2=0xD7;//二進制40
}
if(pwm_add==5)
{
P1=0xfe;P0=P0table[5];
P2=0xCD;//二進制50
}
if(pwm_add==6)
{
P1=0xfe;P0=P0table[6];
P2=0xB3;//二進制60
}
if(pwm_add==7)
{
P1=0xfe;P0=P0table[7];
P2=0xB9;//二進制70
}
if(pwm_add==8)
{
P1=0xfe;P0=P0table[8];
P2=0xA5;//二進制80
}
if(pwm_add==9)
{
P1=0xfe;P0=P0table[9];
P2=0xA5;//二進制90
}
}
if(Trg & key_mode)
{
mode_flag=~mode_flag;
if( mode_flag){TR0=1;TR1=1;}
else {TR0=0;TR1=0;P1=0xfe;P0=0xc0;pwm_add=0;}
}
if(Trg & key_start) TR1=1;
/*按一次開始計數 P3.6 0x40 & 0x40 =0x40*/
if(Trg & key_pause)
/*按一次開始計數 P3.7 0x80 & 0x80=0x80*/
{ //短按兩次停止計數
TR1=1;
k++;
if(k == 2)
TR1=0;
}
if(!Trg & !Cont) //按一次放開後 k 為零
{
zero_cnt++;
if(zero_cnt>10)
{
zero_cnt=0;
k=0;;
}
}
if (Cont & key_pause)
{
zero_cnt++;
if(zero_cnt>50)
{
zero_cnt=0;
TR1=0;
count=0;
bcd[1]=0;
bcd[0]=0;
}
}
}
void main()
{
init();
P3=0xFF;
IE=0x8A;
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
Mode0_flag=1;
TR0=1; TR1=0;
while(1)
{
if(Mode0_flag==1)
{
delay_1ms(80); //防止按鍵彈跳,delay時間配合短按兩下的時間調整
KeyRead();
KeyProc();
}
}
}
108 V2 1117
#include <at89x52.h>
#define key_mode 0x20 //增加一個按鍵P3.5
#define key_start 0x40
#define key_pause 0x80
int P2table[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x10,0x20,0x40};
char const P0table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char bdata flag;
sbit Mode0_flag=flag^0;
sbit Mode1_flag=flag^1;
sbit up_flag=flag^2;
int task;
int anti_cck_i;
int pili_led_i;
int i=2;
int ii;
int j=0;
int count=0;
char k=0;
int time=0;
char Trg;
char Cont;
unsigned char zero_cnt;
sbit buzzer = P3^2;
bit mode_flag;
char bcd[2]={0,0};
char P1table[]={0xFE,0xfD,0xFF};
void delay_1ms(int k)
{
int i,j;
for(i=0;i<k;i++)
for(j=0;j<110;j++)
;
}
void task1_seg7_rotate3_cck()//???????
{
for(anti_cck_i=0;anti_cck_i<3;anti_cck_i++)
{
P1=0XFE;P0=0XFE;delay_1ms(50);//?a ???
P1=0XFD;P0=0XFE;delay_1ms(50); //?a???
P1=0XFB;P0=0XFE;delay_1ms(50); //?a???
P1=0XF7;P0=0XFE;delay_1ms(50); //?a???
P1=0XF7;P0=0XDF;delay_1ms(50); //?f???
P1=0XF7;P0=0XEF;delay_1ms(50); //?e???
P1=0XF7;P0=0XF7;delay_1ms(50); //?d???
P1=0XFB;P0=0XF7;delay_1ms(50); //?d???
P1=0XFD;P0=0XF7;delay_1ms(50); //?d???
P1=0XFE;P0=0XF7;delay_1ms(50); //?d???
P1=0XFE;P0=0XFB;delay_1ms(50); //?c???
P1=0XFE;P0=0XFD;delay_1ms(50); //?b???
}
P1=0XFE;P0=0XFE;delay_1ms(500); //?a???
}
void task2_8LED_rotate3()
{
for(ii=0;ii<3;ii++)
{
for(pili_led_i=0;pili_led_i<14;pili_led_i++)
{
P2=~P2table[pili_led_i];delay_1ms(50);
}
}
}
void task3_buzzer_beep3(int count,int TH,int TL)
{
int i;
for(i=0;i<count;i++)
{
buzzer=0;
delay_1ms(TL);
buzzer=1;
delay_1ms(TH);
}
}
void init()
{
int task=1;//??
if(task==1)
{
P0=~0xFF;P1=0XFF;
task1_seg7_rotate3_cck();//
P0=~0xFF;P1=0XFF;//OFF
task=2;
}
if(task==2)
{
task2_8LED_rotate3();
P2=~0x80;delay_1ms(500);P2=0xFF;
task=3;
}
if(task==3)
{
int i;
for(i=0;i<3;i++)
{
task3_buzzer_beep3(100,1,1);delay_1ms(10);
}
}
}
void T0_int(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P0=P0table[ bcd[j] ];
P1=P1table[j];
j++;
if(j==2) j=0;
}
void T1_int(void) interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time++;
if(time %2==0)
{
count++;
if(count==100) count=0;
bcd[1]=count/10;
bcd[0]=count%10;
}
}
void KeyRead()
{
unsigned char ReadData = P3^0xff; // 1
ReadData &= 0xe0; //按鍵只讀取 P3.6 及 P3.7
/*
11000000 11000000
&)10000000 &01000000
10000000 01000000
*/
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // 3
/*
不是0x80不然就是0x40
*/
}
void KeyProc()
{
if(Trg & key_mode)
{
mode_flag=~mode_flag;
if( mode_flag){TR0=1;TR1=1;}
else {TR0=0;TR1=0;P1=0xfe;P0=0xc0;}
}
if(Trg & key_start) TR1=1;
/*按一次開始計數 P3.6 0x40 & 0x40 =0x40*/
if(Trg & key_pause)
/*按一次開始計數 P3.7 0x80 & 0x80=0x80*/
{ //短按兩次停止計數
TR1=1;
k++;
if(k == 2)
TR1=0;
}
if(!Trg & !Cont) //按一次放開後 k 為零
{
zero_cnt++;
if(zero_cnt>10)
{
zero_cnt=0;
k=0;;
}
}
if (Cont & key_pause)
{
zero_cnt++;
if(zero_cnt>50)
{
zero_cnt=0;
TR1=0;
count=0;
bcd[1]=0;
bcd[0]=0;
}
}
}
void main()
{
init();
P3=0xFF;
IE=0x8A;
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
Mode0_flag=1;
TR0=1; TR1=0;
while(1)
{
if(Mode0_flag==1)
{
delay_1ms(80); //防止按鍵彈跳,delay時間配合短按兩下的時間調整
KeyRead();
KeyProc();
}
}
}
#define key_mode 0x20 //增加一個按鍵P3.5
#define key_start 0x40
#define key_pause 0x80
int P2table[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x10,0x20,0x40};
char const P0table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char bdata flag;
sbit Mode0_flag=flag^0;
sbit Mode1_flag=flag^1;
sbit up_flag=flag^2;
int task;
int anti_cck_i;
int pili_led_i;
int i=2;
int ii;
int j=0;
int count=0;
char k=0;
int time=0;
char Trg;
char Cont;
unsigned char zero_cnt;
sbit buzzer = P3^2;
bit mode_flag;
char bcd[2]={0,0};
char P1table[]={0xFE,0xfD,0xFF};
void delay_1ms(int k)
{
int i,j;
for(i=0;i<k;i++)
for(j=0;j<110;j++)
;
}
void task1_seg7_rotate3_cck()//???????
{
for(anti_cck_i=0;anti_cck_i<3;anti_cck_i++)
{
P1=0XFE;P0=0XFE;delay_1ms(50);//?a ???
P1=0XFD;P0=0XFE;delay_1ms(50); //?a???
P1=0XFB;P0=0XFE;delay_1ms(50); //?a???
P1=0XF7;P0=0XFE;delay_1ms(50); //?a???
P1=0XF7;P0=0XDF;delay_1ms(50); //?f???
P1=0XF7;P0=0XEF;delay_1ms(50); //?e???
P1=0XF7;P0=0XF7;delay_1ms(50); //?d???
P1=0XFB;P0=0XF7;delay_1ms(50); //?d???
P1=0XFD;P0=0XF7;delay_1ms(50); //?d???
P1=0XFE;P0=0XF7;delay_1ms(50); //?d???
P1=0XFE;P0=0XFB;delay_1ms(50); //?c???
P1=0XFE;P0=0XFD;delay_1ms(50); //?b???
}
P1=0XFE;P0=0XFE;delay_1ms(500); //?a???
}
void task2_8LED_rotate3()
{
for(ii=0;ii<3;ii++)
{
for(pili_led_i=0;pili_led_i<14;pili_led_i++)
{
P2=~P2table[pili_led_i];delay_1ms(50);
}
}
}
void task3_buzzer_beep3(int count,int TH,int TL)
{
int i;
for(i=0;i<count;i++)
{
buzzer=0;
delay_1ms(TL);
buzzer=1;
delay_1ms(TH);
}
}
void init()
{
int task=1;//??
if(task==1)
{
P0=~0xFF;P1=0XFF;
task1_seg7_rotate3_cck();//
P0=~0xFF;P1=0XFF;//OFF
task=2;
}
if(task==2)
{
task2_8LED_rotate3();
P2=~0x80;delay_1ms(500);P2=0xFF;
task=3;
}
if(task==3)
{
int i;
for(i=0;i<3;i++)
{
task3_buzzer_beep3(100,1,1);delay_1ms(10);
}
}
}
void T0_int(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P0=P0table[ bcd[j] ];
P1=P1table[j];
j++;
if(j==2) j=0;
}
void T1_int(void) interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time++;
if(time %2==0)
{
count++;
if(count==100) count=0;
bcd[1]=count/10;
bcd[0]=count%10;
}
}
void KeyRead()
{
unsigned char ReadData = P3^0xff; // 1
ReadData &= 0xe0; //按鍵只讀取 P3.6 及 P3.7
/*
11000000 11000000
&)10000000 &01000000
10000000 01000000
*/
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // 3
/*
不是0x80不然就是0x40
*/
}
void KeyProc()
{
if(Trg & key_mode)
{
mode_flag=~mode_flag;
if( mode_flag){TR0=1;TR1=1;}
else {TR0=0;TR1=0;P1=0xfe;P0=0xc0;}
}
if(Trg & key_start) TR1=1;
/*按一次開始計數 P3.6 0x40 & 0x40 =0x40*/
if(Trg & key_pause)
/*按一次開始計數 P3.7 0x80 & 0x80=0x80*/
{ //短按兩次停止計數
TR1=1;
k++;
if(k == 2)
TR1=0;
}
if(!Trg & !Cont) //按一次放開後 k 為零
{
zero_cnt++;
if(zero_cnt>10)
{
zero_cnt=0;
k=0;;
}
}
if (Cont & key_pause)
{
zero_cnt++;
if(zero_cnt>50)
{
zero_cnt=0;
TR1=0;
count=0;
bcd[1]=0;
bcd[0]=0;
}
}
}
void main()
{
init();
P3=0xFF;
IE=0x8A;
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
Mode0_flag=1;
TR0=1; TR1=0;
while(1)
{
if(Mode0_flag==1)
{
delay_1ms(80); //防止按鍵彈跳,delay時間配合短按兩下的時間調整
KeyRead();
KeyProc();
}
}
}
2019年11月14日 星期四
108 1114
#include <at89x52.h>
#define key_start 0x40//按鍵用P3.6按鍵開始
#define key_pause 0x80//探按兩下暫停
int P2table[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x10,0x20,0x40};
char const P0table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char bdata flag;
sbit Mode0_flag=flag^0;
sbit Mode1_flag=flag^1;
sbit up_flag=flag^2;
int task;
int anti_cck_i;
int pili_led_i;
int i=2;
int ii;
int j=0;
int count=0;
char k=0;
int time=0;
char Trg;
char Cont;
unsigned char zero_cnt;
sbit buzzer = P3^5;
char bcd[2]={0,0};
char P1table[]={0xFE,0xfD,0xFF};
void delay_1ms(int k)
{
int i,j;
for(i=0;i<k;i++)
for(j=0;j<110;j++)
;
}
void task1_seg7_rotate3_cck()//???????
{
for(anti_cck_i=0;anti_cck_i<3;anti_cck_i++)
{
P1=0XFE;P0=0XFE;delay_1ms(50);//?a ???
P1=0XFD;P0=0XFE;delay_1ms(50); //?a???
P1=0XFB;P0=0XFE;delay_1ms(50); //?a???
P1=0XF7;P0=0XFE;delay_1ms(50); //?a???
P1=0XF7;P0=0XDF;delay_1ms(50); //?f???
P1=0XF7;P0=0XEF;delay_1ms(50); //?e???
P1=0XF7;P0=0XF7;delay_1ms(50); //?d???
P1=0XFB;P0=0XF7;delay_1ms(50); //?d???
P1=0XFD;P0=0XF7;delay_1ms(50); //?d???
P1=0XFE;P0=0XF7;delay_1ms(50); //?d???
P1=0XFE;P0=0XFB;delay_1ms(50); //?c???
P1=0XFE;P0=0XFD;delay_1ms(50); //?b???
}
P1=0XFE;P0=0XFE;delay_1ms(500); //?a???
}
void task2_8LED_rotate3()
{
for(ii=0;ii<3;ii++)
{
for(pili_led_i=0;pili_led_i<14;pili_led_i++)
{
P2=~P2table[pili_led_i];delay_1ms(50);
}
}
}
void task3_buzzer_beep3(int count,int TH,int TL)
{
int i;
for(i=0;i<count;i++)
{
buzzer=0;
delay_1ms(TL);
buzzer=1;
delay_1ms(TH);
}
}
void init()
{
int task=1;//
if(task==1)
{
P0=~0xFF;P1=0XFF;
task1_seg7_rotate3_cck();//
P0=~0xFF;P1=0XFF;//OFF
task=2;
}
if(task==2)
{
task2_8LED_rotate3();
P2=~0x80;delay_1ms(500);P2=0xFF;
task=3;
}
if(task==3)
{
int i;
for(i=0;i<3;i++)
{
task3_buzzer_beep3(100,1,1);delay_1ms(10);
}
}
}
void T0_int(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P0=P0table[ bcd[j] ];
P1=P1table[j];
j++;
if(j==2) j=0;
}
void T1_int(void) interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time++;
if(time %2==0)
{
count++;
if(count==100) count=0;
bcd[1]=count/10;
bcd[0]=count%10;
}
}
void KeyRead()
{
unsigned char ReadData = P3^0xff; // 1
ReadData &= 0xc0; //按鍵只讀取 P3.6 及 P3.7不一定要0XC0
/*
11000000 11000000
&)10000000 &01000000
10000000 01000000都沒有按為0X00,有壓為1沒壓為0
*/
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // Cont =為最後按鍵值(沒有放開也是ReadData)=ReadData例如0x40 0x80
Trg=0, cont=readdata
/*
不是0x80不然就是0x40
*/
}
void KeyProc()
{
if(Trg & key_start) TR1=1;//Trg & 只會做一次, 按著不放也是0
/*
Triger只會出現(判斷)一次,Triger沒有按皆為0,cont也是0,
按一次開始計數 P3.6 0x40 & 0x40 =0x40
*/
if(Trg & key_pause)
/*按一次開始計數 P3.7 0x80 & 0x80=0x80 */
{ //短按兩次停止計數
TR1=1;
k++;
if(k == 2)
TR1=0;
}
if(!Trg & !Cont) //按一次放開後 k 為零,按一下k=1, 不執行任何動作,反相Trg 反相cont
{ //沒壓也執行此段
/*
10000000 &
*/
zero_cnt++;
if(zero_cnt>10)//放開執行k清除
{
zero_cnt=0;
k=0;;
}
}
if (Cont & key_pause)//按著不放開是0
/*
長按按鍵停止計數並歸零
0x80 & 0x80
*/
{
zero_cnt++;
if(zero_cnt>50)
{
zero_cnt=0;
TR1=0;
count=0;
bcd[1]=0;
bcd[0]=0;
}
}
}
void main()
{
init();
P3=0xFF;
IE=0x8A;
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
Mode0_flag=1;
TR0=1; TR1=0;
while(1)
{
if(Mode0_flag==1)
{
delay_1ms(80); //防止按鍵彈跳,delay時間配合短按兩下的時間調整
KeyRead();
KeyProc();
}
}
}
#define key_start 0x40//按鍵用P3.6按鍵開始
#define key_pause 0x80//探按兩下暫停
int P2table[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x10,0x20,0x40};
char const P0table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char bdata flag;
sbit Mode0_flag=flag^0;
sbit Mode1_flag=flag^1;
sbit up_flag=flag^2;
int task;
int anti_cck_i;
int pili_led_i;
int i=2;
int ii;
int j=0;
int count=0;
char k=0;
int time=0;
char Trg;
char Cont;
unsigned char zero_cnt;
sbit buzzer = P3^5;
char bcd[2]={0,0};
char P1table[]={0xFE,0xfD,0xFF};
void delay_1ms(int k)
{
int i,j;
for(i=0;i<k;i++)
for(j=0;j<110;j++)
;
}
void task1_seg7_rotate3_cck()//???????
{
for(anti_cck_i=0;anti_cck_i<3;anti_cck_i++)
{
P1=0XFE;P0=0XFE;delay_1ms(50);//?a ???
P1=0XFD;P0=0XFE;delay_1ms(50); //?a???
P1=0XFB;P0=0XFE;delay_1ms(50); //?a???
P1=0XF7;P0=0XFE;delay_1ms(50); //?a???
P1=0XF7;P0=0XDF;delay_1ms(50); //?f???
P1=0XF7;P0=0XEF;delay_1ms(50); //?e???
P1=0XF7;P0=0XF7;delay_1ms(50); //?d???
P1=0XFB;P0=0XF7;delay_1ms(50); //?d???
P1=0XFD;P0=0XF7;delay_1ms(50); //?d???
P1=0XFE;P0=0XF7;delay_1ms(50); //?d???
P1=0XFE;P0=0XFB;delay_1ms(50); //?c???
P1=0XFE;P0=0XFD;delay_1ms(50); //?b???
}
P1=0XFE;P0=0XFE;delay_1ms(500); //?a???
}
void task2_8LED_rotate3()
{
for(ii=0;ii<3;ii++)
{
for(pili_led_i=0;pili_led_i<14;pili_led_i++)
{
P2=~P2table[pili_led_i];delay_1ms(50);
}
}
}
void task3_buzzer_beep3(int count,int TH,int TL)
{
int i;
for(i=0;i<count;i++)
{
buzzer=0;
delay_1ms(TL);
buzzer=1;
delay_1ms(TH);
}
}
void init()
{
int task=1;//
if(task==1)
{
P0=~0xFF;P1=0XFF;
task1_seg7_rotate3_cck();//
P0=~0xFF;P1=0XFF;//OFF
task=2;
}
if(task==2)
{
task2_8LED_rotate3();
P2=~0x80;delay_1ms(500);P2=0xFF;
task=3;
}
if(task==3)
{
int i;
for(i=0;i<3;i++)
{
task3_buzzer_beep3(100,1,1);delay_1ms(10);
}
}
}
void T0_int(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P0=P0table[ bcd[j] ];
P1=P1table[j];
j++;
if(j==2) j=0;
}
void T1_int(void) interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time++;
if(time %2==0)
{
count++;
if(count==100) count=0;
bcd[1]=count/10;
bcd[0]=count%10;
}
}
void KeyRead()
{
unsigned char ReadData = P3^0xff; // 1
ReadData &= 0xc0; //按鍵只讀取 P3.6 及 P3.7不一定要0XC0
/*
11000000 11000000
&)10000000 &01000000
10000000 01000000都沒有按為0X00,有壓為1沒壓為0
*/
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // Cont =為最後按鍵值(沒有放開也是ReadData)=ReadData例如0x40 0x80
Trg=0, cont=readdata
/*
不是0x80不然就是0x40
*/
}
void KeyProc()
{
if(Trg & key_start) TR1=1;//Trg & 只會做一次, 按著不放也是0
/*
Triger只會出現(判斷)一次,Triger沒有按皆為0,cont也是0,
按一次開始計數 P3.6 0x40 & 0x40 =0x40
*/
if(Trg & key_pause)
/*按一次開始計數 P3.7 0x80 & 0x80=0x80 */
{ //短按兩次停止計數
TR1=1;
k++;
if(k == 2)
TR1=0;
}
if(!Trg & !Cont) //按一次放開後 k 為零,按一下k=1, 不執行任何動作,反相Trg 反相cont
{ //沒壓也執行此段
/*
10000000 &
*/
zero_cnt++;
if(zero_cnt>10)//放開執行k清除
{
zero_cnt=0;
k=0;;
}
}
if (Cont & key_pause)//按著不放開是0
/*
長按按鍵停止計數並歸零
0x80 & 0x80
*/
{
zero_cnt++;
if(zero_cnt>50)
{
zero_cnt=0;
TR1=0;
count=0;
bcd[1]=0;
bcd[0]=0;
}
}
}
void main()
{
init();
P3=0xFF;
IE=0x8A;
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
Mode0_flag=1;
TR0=1; TR1=0;
while(1)
{
if(Mode0_flag==1)
{
delay_1ms(80); //防止按鍵彈跳,delay時間配合短按兩下的時間調整
KeyRead();
KeyProc();
}
}
}
訂閱:
文章 (Atom)
algorithm
#include <iostream> #include <string.h> using namespace std; int main(int argc, char** argv) { for(int j=2;j<=100;j++)//j...
-
本文旨在補充《 超圖解Arduino互動設計入門 》第18章「RFID無線識別裝置與問答遊戲製作」單元,書本採用的RFID讀卡機模組是採用9600bps, TTL序列通訊介面,RFID的通訊頻率為125KHz。這種模組的接線和程式都很簡單,每當感測到RFID卡,讀卡機就把...
-
/* 多重按鈕開關 */ //==宣告區================================ #include // 定義8051暫存器之標頭檔,P2-17~19 #include "myio.h" // 自己寫的I/O程式庫 sbit PB...