Ⅰ 璋佹湁鐢ㄥ崟鐗囨満鎺у埗浼犳劅鍣ㄧ浉鍏崇殑鐢佃礬鍥俱佸疄渚嬶紝鏈濂芥槸綰㈠栥佹俯搴︽箍搴︽柟闈㈢殑錛屾湁鐨勫彂涓涓
鍩轟簬鍗曠墖鏈虹殑綰㈠栭庢墖閬ユ帶
甯傚満涓婇攢鍞鐨勫甫閬ユ帶鐨勯庢墖浠鋒牸鏅閬嶆瘮杈冩槀璐碉紝濡傛灉鑳界敤鏅閫氱殑鐢佃嗙孩澶栫嚎閬ユ帶鍣ㄦ潵閬ユ帶椋庢墖璋冩。杞閫燂紝瀵逛簬DIY浠鏉ヨ達紝涓嶄絾鍙浠ヨ妭綰﹂噾閽憋紝榪樺彲浠ユ彁楂樿嚜宸辯殑鍔ㄦ墜鑳藉姏錛屼綍涔愯屼笉涓哄憿錛
鏈鐢佃礬閲囩敤浠鋒牸浣庡粔鐨凙T89C2051鍗曠墖鏈轟負涓繪帶CPU錛屼竴浣撳寲鎺ュ彈澶存帴鍙楅仴鎺у櫒SSA3010T鍙戝嚭鐨勭紪鐮侊紝閫丆PU瑙g爜鍚庯紝CPU鎺у埗鐩稿簲鐨勫崟鐗囨満鍔ㄤ綔錛
鍏蜂綋鐨勫師鐞嗗浘濡備笅錛
涓哄彊榪版柟渚胯搗瑙侊紝涓婂浘鍙鐢誨嚭浜哖3_3寮曡剼鐨勭浉搴旇繛鎺ョ數璺錛岃繕鏈2涓鍙鎺ュ湪P3_0鍜孭3_5涓娿傚垎鍒鎺у埗椋庢墖鐨勯珮銆佷腑銆佷綆妗c7孌靛叡闃蟲暟鐮佺℃樉紺虹浉搴旂殑妗f暟錛屽綋鎸変笅閬ユ帶鍣ㄧ殑1銆2銆3閿錛屽垎鍒鏄劇ず1銆2銆3銆傛寜涓嬮仴鎺у櫒OFF閿涓嶆樉紺哄苟鍏抽棴椋庢墖鐨勮繍琛岋紒
綰㈠栫嚎涓浣撳寲鎺ュ彈澶村紩鑴氬備笅錛
1涓篏ND2涓篤CC3涓篋ATA
SAA3010T鐢佃嗛仴鎺у櫒鐨勬暟鎹鐮佸艱〃濡備笅錛
*****************************************************
*[寮鍏砞55D2[闈欓煶]55D3
*[1]55AB[2]55AC[3]55AD[4]55B2
*[5]55B3[6]55B4[7]55B5[8]55CA
*[9]55CB[0]55AA[鍗/鍙宂55CC[璋冭皭]5554
*[鑺傜洰+]56AA[鑺傜洰-]56AB[寰璋+]56CD[寰璋-]56D2
*[闊抽噺+]552A[瀛樺偍]56CB[鍙鍥瀅55D5
*[闊抽噺-]552B[鐖卞ソ]55D4[瀹氭椂]56B4
*[瀵規瘮+]5552[鑹插僵+]5532[浜搴+]5526[褰曞儚]564A
*[瀵規瘮-]5553[鑹插僵-]5533[浜搴-]55D2[鐢佃哴5655
*****************************************************
C51鎺у埗紼嬪簭鍏蜂綋濡備笅錛
/*------------------------------------------------------------------------------------------------
鏈紼嬪簭閲囩敤SAA3010T鐢佃嗛仴鎺у櫒
鑻ユ病鏈塖AA3010T鐨勯仴鎺у櫒錛岃昏呭彲鑾風煡鐩稿簲鐨勭紪鐮侊紝
鏇存敼CASE璇鍙ラ噷鐨勭浉搴旂殑鏁版嵁錛屽嵆鍙錛
榪欓噷涓嶅湪鍙欒堪濡備綍鑾風煡緙栫爜錛屾湜璇昏呰皡瑙o紒
--------------------------------------------------------------------------------------------------*/
#include<AT89x51.h>
staticunsignedchardataIRCode[3],IRCON,IRCON2;
staticunsignedchardataDT;
voidmain(void)
{
unsignedintde;
TMOD=0x01;//瀹氭椂鍣0鏂瑰紡1
EA=1;//鍏佽窩PU涓鏂
IT0=1;//INT0涓嬮檷娌挎湁鏁
EX0=1;//寮INT0涓鏂
P3_3=0x00;
P3_0=0x00;
P3_5=0x00;
P1=0Xc0;//涓婄數澶嶄綅鏄劇ず鈥0鈥
do
{
for(de=0;de<8000;de++)
P3_6=1;//LED鐐逛寒
for(de=0;de<8000;de++)
P3_6=0;//LED鐔勭伃
if(DT)
{
EX0=0;//鍏抽棴澶栦腑鏂
for(de=0;de<30000;de++)//鎸夐敭鍊兼g『鍚庝細鏈変竴涓寤舵椂錛岄槻姝㈤噸澶嶆寜閿
P3_6=1;
for(de=0;de<30000;de++)
P3_6=0;
DT=0;
}
EX0=1;
}while(1);
}
//瀹氭椂鍣0涓鏂澶勭悊
voidtimeint(void)interrupt1using2
{
TH0=0xFC;//TH0=0XFC;TL0=0XE0
TL0=0xE0;//璁懼畾鏃跺間負800us
if(IRCON<3)
{
if(IRCON2<8)//涓鏂涓嬈¤諱竴嬈¢仴鎺ф帴鏀跺ご鐨勭姸鎬,姣忎簩嬈′負閬ユ帶緙栫爜涓鐨勪竴涓浣
{
IRCON2++;
IRCode[IRCON]=IRCode[IRCON]<<1;//姣忚諱竴嬈℃斁鍏ュ彉閲忎腑鐨勪簩榪涘埗鐨勪竴涓浣嶏紝姣忔″乏縐諱竴浣
IRCode[IRCON]=IRCode[IRCON]|P3_2;//姣忓叓嬈″~婊′竴涓瀛楄妭錛屼竴涓瀛楄妭瀛樻斁閬ユ帶緙栫爜4涓浣
}
else
{
IRCON++;//濉婊′竴涓瀛楄妭錛屾寚鍚戜笅涓涓鍙橀噺
IRCON2=0;//璁℃暟娓呴浂
}
}
else
{
TR0=0;//鍏抽棴瀹氭椂鍣
ET0=0;//瀹氭椂鍣0涓鏂鍏抽棴
if((IRCode[1]!=0xFF)&&(IRCode[2]!=0xFF))
{
if(IRCode[1]==0x55)
{
switch(IRCode[2])
{
case0xAB:P1=0Xf9;P3_3=0x01;P3_0=0x00;P3_5=0x00;DT=1;break;
case0xAC:P1=0Xa4;P3_0=0x01;P3_5=0x00;P3_3=0x00;DT=1;break;
case0xAD:P1=0Xb0;P3_5=0x01;P3_3=0x00;P3_0=0x00;DT=1;break;
case0xD2:P1=0xff;P3_3=0x00;P3_0=0x00;P3_5=0x00;DT=1;break;
default:break;
}//switch
}
}
}
}
//INT0涓鏂
voidINT0Fun(void)interrupt0using2
{
EX0=0;//澶栭儴涓鏂0鍏抽棴
ET0=1;//瀹氭椂鍣0涓鏂鎵撳紑
TH0=0xFC;
TL0=0xE0;//璁懼畾鏃跺間負800us
for(IRCON=0;IRCON<3;IRCON++)
IRCode[IRCON]=0;
IRCON=0;
IRCON2=0;//璁℃暟娓呴浂
TR0=1;//寮濮嬭℃暟
}
瀹炵墿鍥劇墖濡備笅錛
鑱鏄庣殑璇昏呭彲浠ュ啀澧炲姞鍑犱釜閿鏉ヨ懼畾椋庢墖榪愯岀殑鏃墮棿錛屾渶鍚庢彁閱掑ぇ瀹朵竴鐐癸細鍥犳秹鍙婁簡220V鐨勯珮鍘嬶紝鎵浠ヤ竴瀹氳佹敞鎰忎漢韜瀹夊叏錛侊紒錛
鍗曠墖鏈篊51鎺у埗紼嬪簭鍙傝冮壌鎴掍簡紓佸姩鍔涙槑嫻╃珯闀跨殑錛屽啀姝ゆ繁琛ㄦ劅璋錛
Ⅱ 如何用單片機控制液晶顯示器呀,怎麼接線……
液晶顯示器有字元型,如1602,這個液晶顯示器目前是統一的,引腳和命令字都 是統一的。接線如下圖所示
Ⅲ 鎬ユ眰鍗曠墖鏈鴻捐″疄渚
#include 鈥淜EY.H鈥
void main( void )
{ P1_0 = 1; //浣滀負杈撳叆寮曡剼錛屽繀欏誨厛杈撳嚭楂樼數騫
while( 1 ) //姘歌繙涓虹湡錛屽嵆姝誨驚鐜
{ if( P1_0 == 0 ) //濡傛灉鎸夐敭錛屽垯涓轟綆鐢靛鉤
{ keyPut( 6 ); //淇濆瓨鎸夐敭緙栧彿鍊間負鎸夐敭闃熷垪
while( P1_0 == 0 ); //濡傛灉涓鐩存寜鐫閿錛屽垯涓嶅仠鍦版墽琛岃ュ驚鐜錛屽疄闄呮槸絳夊緟鏉鵑敭
}
if( keyHit() != 0 ) //濡傛灉闃熷垪涓鏈夋寜閿
P2=Seg7Code[ keyGet() ]; //浠庨槦鍒椾腑鍙栧嚭鎸夐敭鍊礆紝騫舵樉紺哄湪鏁扮爜綆′笂
}
}
渚嬩簩錛氬湪渚嬩竴涓鑰冭檻鎸夐敭20ms鎶栧姩闂棰樸
#include <at89x52.h>
#include 鈥淜EY.H鈥
void main( void )
{ P1_0 = 1; //浣滀負杈撳叆寮曡剼錛屽繀欏誨厛杈撳嚭楂樼數騫
while( 1 ) //姘歌繙涓虹湡錛屽嵆姝誨驚鐜
{ if( P1_0 == 0 ) //濡傛灉鎸夐敭錛屽垯涓轟綆鐢靛鉤
{ delay20ms(); //寤舵椂20ms錛岃煩榪囨帴涓嬫姈鍔
keyPut( 6 ); //淇濆瓨鎸夐敭緙栧彿鍊間負鎸夐敭闃熷垪
while( P1_0 == 0 ); //濡傛灉涓鐩存寜鐫閿錛屽垯涓嶅仠鍦版墽琛岃ュ驚鐜錛屽疄闄呮槸絳夊緟鏉鵑敭
delay20ms(); //寤舵椂20ms錛岃煩榪囨澗寮鎶栧姩
}
if( keyHit() != 0 ) //濡傛灉闃熷垪涓鏈夋寜閿
P2=Seg7Code[ keyGet() ]; //浠庨槦鍒椾腑鍙栧嚭鎸夐敭鍊礆紝騫舵樉紺哄湪鏁扮爜綆′笂
}
}
Ⅳ 大家幫忙找一些51單片機的基本C語言程序例子,最好帶說明,謝啦
中斷控製程序:
#include <AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
#define port_count P2 //P2接8LED介面
//將計數器的二進制值用8個LED顯示出來
uchar count;//計數器(存儲中斷次數)
void main(void)
{
count=0; //清零計數器
port_count=~count;//清零P2口
IT0=1; //INT0設為邊沿觸發方式�IT0=0則為電平觸發方式
EX0=1; //開INT0中斷
EA=1; //開系統中斷
while(1); //等待中斷處理
}
//INT0中斷處理函數
void int0_interrupt() interrupt 0 //INT0中斷號0
{
count++;
port_count=~count; //當達到255時,溢出,又從0開始
}
I/O控製程序:
#include <AT89X52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define flowlight P2
void delay10ms()
{uchar a,b;
for(a=200;a>0;a--)
for(b=225;b>0;b--);
}
void main()
{
uchar flag=0;//判斷移動方向 flag==0 左移 flag==1 右移
uchar port_state=0x01;
flowlight=~port_state;
while(1)
{
delay10ms();
if(port_state==0X80&&flag==0)
{
flag=1; //流水燈左移到第八位又移回來 ~1000 0000
}
else
if(port_state==0X01&&flag==1)
{
flag=0; //流水燈右移到第1位又移回來 ~0000 0001
}
if(flag==0)
{
port_state=port_state<<1;
flowlight=~port_state;
}
else
{
port_state=port_state>>1;
flowlight=~port_state;
}
}
串口通信程序:
主機程序:
#include <AT89X52.H>
#define NODE_ADDR 3 //目的節點地址
#define COUNT 10 //發送緩沖區buffer大小
typedef unsigned char uchar;
uchar buffer[COUNT]; //定義buffer
int pt; //設置指針
main()//////////////////////////////////////////發送程序
{
//buffer初始化
pt=0;
while(pt<COUNT)
{
buffer[pt]='1'+pt; //[buffer]=0X31,[buffer+1]= 0X32,[buffer+2] 0X33........
pt++;
}
////初始化串口和T1(波特率發生器)/////////PCON預設為0
PCON=0X00;
SCON=0Xc0; //SCON=1100 0000B,置串口為方式3, SM2=0,REN=0,主機不接收地址幀
TMOD=0X20; //20H=0010 0000B,置T1為方式2,TR1控制T1的開關,定時器方式
TH1=253;TL1=253; //方式2為自動重裝///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //啟動T1
ET1=0; //關T1中斷 由於自動重裝
ES=1; //開串口中斷
EA=1; //開系統中斷
pt=0;
///////////////發送地址幀
TB8=1; //地址幀標志
SBUF=NODE_ADDR; //發送目的節點地址
while(pt<COUNT); //等待發送完全部數據
while(1);//不執行任何操作
} //end main
/////發送完中斷函數
void send()interrupt 4
{
TI=0; //清發送中斷標志
if(pt<COUNT)
{
//發送一幀數據
TB8=0;//數據幀標志
SBUF=buffer[pt]; //啟動發送
pt++;//指針指向下一單元
}
else
{
ES=0; //關串口中斷
EA=0; //關系統中斷
return; //若發送完則停止發送並返回
}
}
接收程序:
#include<reg52.h>
#define uchar unsigned char
#define NODE_ADDR 3 //本機節點地址
#define COUNT 10 //定義接收緩沖區buffer大小
uchar buffer[COUNT]; //定義buffer
int pt; //當前位置指針
void send_char_com(unsigned char ch); //向串口發送一個字元的函數聲明
void delay(void);
main() ////////////////串列非同步從機接收程序
{
PCON=0X00; //初始化串口和T1(波特率發生器)/////////PCON預設為0
SCON=0XF0; //SCON=1111 0000B,方式3,SM2=1,REN=1,允許接收地址幀
TMOD=0X20; //20H=0010 0000B,置T1為方式2,TR1控制T1的開關,定時器方式
TH1=253;TL1=253; //方式2為自動重裝///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //啟動T1
ET1=0; //關T1中斷 由於自動重裝
ES=1; //開串口中斷
EA=1; //開系統中斷
pt=0;
while(pt<COUNT); //等待接收地址幀和全部數據幀
delay() ;
//接收完後返回數據
SCON=0XC0; //SCON=1100 0000B,置串口為方式3, SM2=0,REN=0,主機不接收地址幀
EA=0;
for(pt=0;pt<COUNT;pt++)
{
send_char_com(buffer[pt]);
}
while(1);
} //end main
///////////串口接收中斷函數
void receive()interrupt 4 using 3
{
RI=0; //清除接收中斷標志
if(RB8==1) //地址幀
{//若為本機地址,則置SM2=0,以便接收數據
if(SBUF==NODE_ADDR)
{
SM2=0;
}
}
/////RB8=0,數據幀
else if(RB8==0)
{buffer[pt]=SBUF; //數據幀送buffer
pt++;
if(pt>=COUNT)
SM2=1; //若接收完全部數據幀,則通信結束;置SM2=1,准備下一次通信
}
}
//向串口發送一個字元
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
///////////////////////////////////////////////////////////////////////////////////
void delay(void)
{uchar i=100;
while(i--);
}
Ⅳ 單片機中bit函數如何使用 在什麼情況下使用 舉個例子 如何使用 謝謝
1、可以作為參數傳遞:比如
uchar test(bit flag)
{
if(flag)
{//傳遞來的是1則返回3,否則返回2
return 3;
}
else
{
return 2;
}
}
main()
{
uchar x;
bit flag = 1;
x = test(falg);
}
2、可以作為函數的返回值
bit test1(uchar a,uchar b)
{
if(a>b)
{//如果a>b則返回真,否則返回假
return 1;
}
else
{
return 0;
}
}
main()
{
bit flag;
flag = test1(2,3);
}
C51中沒有位變數指針一說,比如 bit *flag1;的定義就是非法的。除此之外使用中和其它類型沒什麼區別。
應用最多的情況:執行一個函數,只是想知道操作是否成功,這時就可以用bit變數作為返回值,這樣佔用資源少,判斷起來也快。
當然,如果返回值是char型,判斷速度上和bit型差不多,但如果是int型,由於是雙位元組,就要多花些時間了。
追問:
你做過595的程序嗎 那裡用一位數據線輸出8位數據 就用到bit
bit a;
bit testbit(unsigned char a,char n)
{
if(((0x01<<n)&a)==0)
{
return 0;
}else
return 1;
}
Ⅵ 單片機的具體應用例子
1、節能控制:
單片機可以控制能耗的節奏,例如:收集睡眠和運動步數等數字,以分鍾級的頻率進行上報;信息未上報時,設備處於低能耗的狀態,信息上報時,會出現一些網路傳輸方面的消耗,單片機可以控制能耗的節奏,將大部分時間控制在低能耗的狀態下,可以使得待機時間長達七十二小時以上。
2、智能語音設備:
例如:在導航智能電子設備中,可以將其中的一些道路名稱、距離等進行提取,然後進行播報;同時,還可以選擇不同的名人口吻進行播報,真正實現智能化的定製操作,更好地滿足用戶的需求;
3、報警控制:
例如:家裡經常使用的火災報警器,就是在外界環境達到一定條件下開啟智能報警的設備,如果室內的煙霧濃度到達某種水平,或者是收集外界的數據達到某種狀態時,就會自動觸發報警設置,從而實現智能報警的功能。
4、工廠生產檢測:
例如:在一些工廠中,經常會安裝一些設備,對工廠的生產環境進行監控,當出現某些異常數據時,就會發生報警,為確保設備的正常運作,設備維護人員需要及時進行處理,避免產生較大的故障。
5、家電領域:
其中家用電器就是其應用中的一個領域,用單片機取代傳統的家用電器中機械控制部件,並實現家電智能化。由此確定了單片機在家用電器中的重要地位。如:智能電飯煲、智能洗衣機、智能電視等都有單片機的應用。