&& : 邏輯與,都為真則真 ||: 邏輯或,一個為真則為真 !:邏輯非, &:按位與 |:按位或 ~:按位取反 ^:按位異或,相異為1.例如A=0b11001100,B=0b11110000,F=A^B=0b00111100 時鐘周期:晶振就是時鐘源,就是晶振分之一。 機器周期:完成一個操作的最短 ...
&& : 邏輯與,都為真則真
||: 邏輯或,一個為真則為真
!:邏輯非,
&:按位與
|:按位或
~:按位取反
^:按位異或,相異為1.例如A=0b11001100,B=0b11110000,F=A^B=0b00111100
時鐘周期:晶振就是時鐘源,就是晶振分之一。
機器周期:完成一個操作的最短時間。一個機器周期是12個時鐘周期。
定時器:打開定時器後,定時器“存儲寄存器”的值經過一個機器周期自動加1,也就是說,機器周期是定時器的計數周期。
定時器存儲寄存器 sfr地址 複位值
TH0 定時器 0x8C 0x00
TL0 0x8A
TH1 0x8D
TL1 0x8B
TCON 定時器控制寄存器的位分配
TMOD 定時器模式寄存器的位分配
#include<reg52.h>
sbit LED=P0^0;
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
void main()
{
ADDR0=0;
ADDR1=1;
ADDR2=1;
ADDR3=1;
ENLED=0;
TMOD=0x01;
TH0= 0xb8;
TL0=0x00;
TR0=1;
unsigned char cnt=0;
while(1)
{ /*
定時器使用方法
1.設置特殊功能寄存器TMOD,配置好工作模式。
2.設置計數寄存器TH0和TL0的初值。
3.設置TCON,通過TR0置1讓定時器開始計數
4.判斷TCON寄存器的TF0位,檢測定時器溢出情況
*/
if(TF0==1)
{
/*
晶振是11.0592MHz ,時鐘周期是1/11.0592 *1000000=90422。
定時20ms=0.02s
機器周期X *12/11.0592=0.02
X=18432;
定時器到65535+1 溢出
T0+X=65536
T0=47104;
*/
TF0=0;
TH0=0xb8;
TL0=0x00;
cnt++;
if(cnt>=50)
{
cnt=0;
LED=~LED;
}
}
}
}
#includ<reg52.h>
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
unsigned char code (放入程式存儲空間,節省空間)LED[]={0xC0,數位管真值表。}
void main()
{
unsigned char cnt=0;
unsigned char sec=0;
ENLED =0;
ADDR3=1;
ADDR2=0;
ADDR1=0;
ADDR0=0;
TMOD=0x01;
TH0=0xB8;
TL0=0x00;
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xB8;
TL0=0x00;
cnt++;
if(cnt>=50)
{
cnt=0;
P0=LED[sec];
sec++;
if(sec>=16)
sec=0;
}
}
}
}