『壹』 mcs 51系列單片機
1.coms工藝
2.利用編程器將用戶程序送人單片機的存儲器,檢查程序,修改程序,監視單片機的工作狀態。
3.51有5個中斷源
4.Mcs-51是8位單片機;I/O的特點有具有雙向通道,數據鎖存,輸入緩沖;P3.0和P3.1分別是串列輸入口和WR串列輸出口;作為輸入時應該注意*****。
5.Mcs-51單片機中振盪電路,片內有一個高增益反向放大器,用於構成振盪器。外接晶振,反相器的輸入端和輸出端跨接石英晶體和兩個電容就構成了穩定的自激振盪器。
6.51單片機的封裝引腳有三種類型:40腳DIP,44腳PLCC,48腳DIP,52腳PLCC,68腳PLCC。引腳定義:1--8:P0.0--0.7,9:RST/Vpd,10--17:P3.0-P3.7,18:XTAL2,19:XTAL1,20:Vss,21--28:P2.0-P2.7,29:~PSEN ,30:ALE/~PROG,31:~EA/pp,32--39:P0.7-P0.0,40:Vcc。
7.單片機片內,片外存儲器的選擇:(程序存儲器)由硬體控制信號~EA/Vpp決定,(數據存儲器)由軟體指令是MOVX還是MOV決定;
8.MCS-51的程序存儲器用於存放運算中間結果。
9.PSW是一個8位的專用寄存器,用於存程序運行中的各種狀態信息。
10.決定程序執行順序的寄存器是程序計數器PC。
11.ALE引腳的特點:(訪問外部存儲器時)信號上升沿可作16為地址低8位的所存信號,信號在兩個機器周期中出現一次;(不訪問時)向外輸出振盪頻率1/6的脈沖信號,可作其他外部介面的時鍾信號。通過該信號可以判斷 CPU是否正常工作
12.MOVC的功能:用於讀取程序存儲器表格的數據傳送
13:51的指令寄存器是對指令寄存器中的指令進行解碼,將指令轉變為執行此指令所需的電信號。
完整的指令格式:由操作碼和操作數組成
DAC0832的輸入電平與TTL電平兼容。
AD與DA的作用是:AD的作用是把模擬信號轉換成數字信號,DA的作用是把數字信號轉換成模擬信號。 0809是8位的AD轉換器及有11個模擬輸入通道,4位地址輸入選擇。17. DAC0832是電流輸出型數模轉換晶元,解析度8位,三種工作方式:直通,單緩沖,雙緩沖。
單片機的復位電路的特點:簡單而重要,上電復位靠電容充電,按鍵復位靠RC微分電路產生正脈沖和電阻與VCC電源接通。是第9引腳復位。單片機開始工作前需要復位,單片機受到干擾後程序跑飛需要復位。
單片機最小系統硬體設計圖。由復位電路、晶振電路和單片機組成,單片機~EA端一般接高。
MCS—51單片機最小系統的振盪周期,機器周期,時鍾周期的關系:12個振盪周期=1個機器周期=6個時鍾周期。
8051在存儲結構上採用哈佛結構。
串列通信中按數據流的方向分成哪三種基本的傳送方式,
8051與8031的區別是:有無ROM存儲器。
程序狀態字寄存器PSW的特點:保存指令執行結果的特徵信息。由硬體自動生成。
計算機匯流排的分類:數據匯流排,地址匯流排,控制匯流排。或片內匯流排,片外匯流排。
80C51單片機的程序存儲器最大定址范圍256B。
編程:跑馬燈程序編寫:8個發光二極體流水燈程序編寫
LED跑馬燈(從右至左)
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
void DelayMS(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<255;i++);
}
}
void main()
{
P1=0xfe;
while(1)
{ if(P1==0x7f)
P1=0xfe;
else
P1=_crol_(P1,1);
DelayMS(80);
}
}
LED跑馬燈(從左至右)
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
void DelayMS(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<255;i++);
}
}
void main()
{
P1=0x7f;
while(1)
{ if(P1==0xfe)
P1=0x7f;
else
P1=_cror_(P1,1);
DelayMS(40);
}
}
LED跑馬燈(左右循環)
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
void DelayMS(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<255;i++);
}
}
void main()
{
uchar i;
P1=0x7f;
while(1)
{
for(i=0;i<7;i++)
{P1=_cror_(P1,1);
DelayMS(40); }
for(i=0;i<7;i++)
{P1=_crol_(P1,1);
DelayMS(40); }
}
}
單個LED的閃爍
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED = P1^0;
void DelayMS(uint x)
{
uchar i;
while(x--)
{
for(i=120;i>0;i--);
}
}
void main()
{
while(1)
{
LED = ~LED;
DelayMS(150);
}
}
連綿燈
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
void DelayMS(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<255;i++);
}
}
void main()
{
P1=0x0e;
while(1)
{ if(P1==0xc1)
P1=0x0e;
else
P1=_crol_(P1,1);
DelayMS(80);
}
}
/* 花樣流水燈程序 間隔300ms先奇數亮再偶數亮,循環三次;一個燈上下循環三次;兩個分別從兩邊往中間流動三次;再從中間往兩邊流動三次;8個全部閃爍3次;關閉發光管,程序停止。*//*********************************************************/#include<reg52.h> //52單片機頭文件#include <intrins.h> //包含有左右循環移位子函數的庫#define uint unsigned int //宏定義#define uchar unsigned char //宏定義void delay(uint z) //延時函數,z的取值為這個函數的延時ms數,如delay(200);大約延時200ms.{ //delay(500);大約延時500ms. uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }void main() //主函數{ uchar a,i,j; for(j=0;j<3;j++) //寄偶交替 { P1=0x55; //點亮小燈 delay(300); //延時300毫秒 P1=0xaa; delay(300); //延時300毫秒 } for(j=0;j<3;j++) //流水燈 { a=0xfe; for(i=0;i<8;i++) { P1=a; //點亮小燈 delay(300); //延時300毫秒 a=_crol_(a,1); } } P1=0xff; for(j=0;j<3;j++) //從兩邊往中間流 { P1=0x7e; //點亮小燈
delay(300); //延時300毫秒 P1=0xbd; delay(300); //延時300毫秒 P1=0xdb; //點亮小燈 delay(300); //延時300毫秒 P1=0xe7; delay(300); //延時300毫秒 } P1=0xff; for(j=0;j<3;j++) //從中間往兩邊流 { P1=0xe7; //點亮小燈 delay(300); //延時300毫秒 P1=0xdb; delay(300); //延時300毫秒 P1=0xbd; //點亮小燈 delay(300); //延時300毫秒 P1=0x7e; delay(300); //延時300毫秒 } P1=0xff; for(j=0;j<6;j++) //全部閃爍 { P1=~P1; //點亮小燈 delay(300); //延時300毫秒 } P1=0xff; while(1);} a=_crol_(a,1); } } for(j=0;j<3;j++) { a=0xfa; for(i=0;i<5;i++) { P1=a; delay(300); a=_crol_(a,1); } } P1=0xff; for(j=0;j<3;j++) //從兩邊往中間流 { P1=0x7e; //點亮小燈 delay(300); //延時300毫秒 P1=0xbd; delay(300); //延時300毫秒 P1=0xdb; //點亮小燈 delay(300); //延時300毫秒 P1=0xe7; delay(300); //延時300毫秒 } P1=0xff; for(j=0;j<3;j++) //從中間往兩邊流 { P1=0xe7; //點亮小燈 delay(300); //延時300毫秒 P1=0xdb; delay(300); //延時300毫秒 P1=0xbd; //點亮小燈 delay(300); //延時300毫秒 P1=0x7e; delay(300); //延時300毫秒 } for(j=0;j<5;j++) { P1=0x66; delay(300); P1=0x99; delay(300); } P1=0xff; for(j=0;j<6;j++) //全部閃爍 { P1=~P1; //點亮小燈 delay(300); //延時300毫秒 } P1=0xff; while(1);}
『貳』 為什麼51單片機引腳懸空時候電壓是5v,接上外設後卻只有1.6v了呢
單片機引腳在高電平時輸出的電流是很小的,所以直接連接LED的亮度很低,但是單片機在輸出低電平時可以允許更大的電流的通過,所以你把LED反著接,這樣效果就好了。
像這樣:
『叄』 基於51單片機的可控硅調壓調光程序-帶過零檢測
程序:
#include<reg52.h>
#include<intrins.h>
sbitledRS=P1^0;
sbitledRW=P1^1;
sbit ledE=P1^2;
sbit keyjia=P2^7;
sbitkeyjian=P2^6;
sbitcontrolLD=P1^3;
bitflag1=1;
bitflag2=1;
unsigned
char code table[]=" guang liang
";
unsignedchar code table1[]=" 00 ";
intnum,flag=0,count=0;
charliang=3;
voiddelaykt(void) //導通延時
{
unsigned char a;
for(a=2;a>0;a--);
}
voiddelay(int z) //可調延時
{
unsigned x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void
delay9ms(void) //誤差
-0.43402777778us 延時9ms
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=224;b>0;b--)
for(a=17;a>0;a--);
}
voidwrite_com(unsigned com) //寫指令
{
ledRS=0;
P0=com;
delay(10);
ledE=1;
delay(20);
ledE=0;
}
voidwrite_date(unsigned date) //寫數據
{
ledRS=1;
P0=date;
delay(10);
ledE=1;
delay(20);
ledE=0;
}
voidwrite_liang(unsigned liang) //寫亮度
{
int shi,ge;
shi=(liang-3)/10;
ge=(liang-3)%10;
write_com(0x80+0x40+7);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidinit() //初始化
{
controlLD=1; //觸發控制初始化
ledRW=0; //液晶初始化
ledE=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delaykt();
}
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_date(table1[num]);
delaykt();
}
EA=1; //外部中斷設置
EX0=1;
IT0=1;
}
voidkeyscanf() //鍵盤判斷
{
if(keyjia==0) //加鍵判斷
{
delaykt();
if(keyjia==0)
{
if(flag1==1)
{
flag1=0;
liang++;
if(liang==10)
liang=3;
write_com(0x80+0x40+7);
write_liang(liang);
}
}
}
else if(keyjia!=0)
{
delaykt();
if(keyjia!=0)
flag1=1;
}
if(keyjian==0) //減鍵判斷
{
delaykt();
if(keyjian==0)
{
if(flag2==1)
{
flag2=0;
liang--;
if(liang==2)
liang=9;
write_com(0x80+0x40+7);
write_liang(liang);
}
}
}
else if(keyjian!=0)
{
delaykt();
if(keyjian!=0)
flag2=1;
}
}
voidzhongan() interrupt 0 //外部中斷
{
flag=1;
}
voidtimepd() //同步標志判斷與定時器設置
{
if(flag==1)
{
flag=0;
TMOD=0x01;
TH0=(65536-1000*(10-liang))/256;
TL0=(65536-1000*(10-liang))%256;
ET0=1;
TR0=1;
}
}
voidtime0() interrupt 1 //定時中斷程序
{
count=1;
}
voidchufa() //MOS3020觸發
{
if(count==1)
{
count=0;
controlLD=0;
delaykt();
controlLD=1;
delay9ms();
controlLD=0;
delaykt();
controlLD=1;
}
}
voidmain()
{
init();
while(1)
{
keyscanf();
timepd();
chufa();
}
}