Ⅰ 單片機程序
#include<reg51.h>
sbitkey=P3^2;
.......
voidmain()//主程序入口
{
TMOD=0X01;//選擇單片機T0定時器M1工作方式
TH0=0XFc; //1ms定時TL0=(65536-921)%256=103=0x67
TL0=0X67;//晶振頻率是11·0592M,可算出,計數脈沖個數是921個;TH0=(65536-921)/256=252=0xFC;
TR0=1;//定時器/計數器----啟動
ET0=1;//定時器0的中斷允許開關
EA=1; //開總中斷
IT1=1;//設定外部中斷1為低邊緣觸發類型
//stop();先屏蔽這個,測試按鍵
while(1)//程序主循環
{
if(key==0)
{
delay_nms(10);
if(key==0)
{
temp++;
while(key==0);
}
}
if(temp>3)
{
temp=1;
}
ShowPort=LedShowData[temp];//這個函數不知有沒有問題,你查一下。
Ⅱ 求52單片機程序代碼
程序代碼如下:
#include<reg51.h>
sbitK1=P1^0;
sbitK2=P1^1;
voiddelay(inta)
{
inti;
while(a--)for(i=0;i<120;i++);
}
main()
{
unsignedcharkeyval=0,led=0xfe;
while(1)
{
if(K1==0)
{
delay(10);
if(K1==0)
{
keyval==1;
while(K1==0);
}
}
if(K2==0)
{
delay(10);
if(K2==0)
{
keyval==2;
while(K2==0);
}
}
if(keyval==1)P0=0xfe;
if(keyval==2)
{
P0=led;
led=_crol_(led,1);
delay(200);
}
}
}
Ⅲ 單片機的程序
你可能編譯器不對,也有可能晶元選的不對,你的這個系統,晶元選AT89C2051足夠你用了,用AT89C51 AT89S51……等晶元都是可以的。
以後如果你對51單片機不是很熟悉的話,前面幾行最好就照我的這個寫法寫:
$MOD51 ;8051單片機匯編語言的頭文件
ORG 00H ;定義地址為00H
AJMP START;跳到START,跳過所有的中斷源入口
ORG 040H ;定義地址
START:
MOV SP,#60H ;初始化堆棧。因為51單片機上電時默認堆棧指針是07H, 這個地
;址不是很好,所以要初始化一下。
……
……
……;省略號處請補上自己需要的代碼
END
下面我用Atmel的assemble編譯的結果。編譯通過了。
010 PAGE 1
1 $MOD51
0000 2 ORG 0000H
0000 0143 3 AJMP START
0040 4 ORG 40H
0040 758160 5 MOV SP,#60H
0043 6 START:
0043 7590FF 7 MOV P1,#0FFH
0046 E590 8 MOV A,P1
0048 F540 9 MOV 40H,A ;暫存於40H
004A 116A 10 ACALL DL10MS ;去抖延時
004C E590 11 MOV A,P1
004E B54009 12 CJNE A,40H,PASS
0051 B4FE0B 13 CJNE A,#0FEH,LAMP1 ;第一鍵?
0054 75A0FF 14 MOV P2,#0FFH
0057 758000 15 MOV P0,#00H ;點亮第一行發光二極體
005A 12006A 16 PASS: LCALL DL10MS ;延時
005D 0143 17 AJMP START
005F B4FDF8 18 LAMP1: CJNE A,#0FDH,PASS ;第二鍵?
0062 7580FF 19 MOV P0,#0FFH
0065 75A000 20 MOV P2,#00H
0068 015A 21 AJMP PASS
22 ;延時子程序:
006A 7F08 23 DL10MS:MOV R7,#08h
006C 7EF9 24 LOOP1: MOV R6,#0F9H
006E 00 25 LOOP2: NOP
006F 00 26 NOP
0070 DEFC 27 DJNZ R6,LOOP2
0072 DFF8 28 DJNZ R7,LOOP1
0074 22 29 RET
30 END
VERSION 1.2h ASSEMBLY COMPLETE, 0 ERRORS FOUND
010 PAGE 2
DL10MS . . . . . . . . . . . . . C ADDR 006AH
LAMP1. . . . . . . . . . . . . . C ADDR 005FH
LOOP1. . . . . . . . . . . . . . C ADDR 006CH
LOOP2. . . . . . . . . . . . . . C ADDR 006EH
P0 . . . . . . . . . . . . . . . D ADDR 0080H PREDEFINED
P1 . . . . . . . . . . . . . . . D ADDR 0090H PREDEFINED
P2 . . . . . . . . . . . . . . . D ADDR 00A0H PREDEFINED
PASS . . . . . . . . . . . . . . C ADDR 005AH
SP . . . . . . . . . . . . . . . D ADDR 0081H PREDEFINED
START. . . . . . . . . . . . . . C ADDR 0043H
Ⅳ 有關單片機程序。。。
1 單片機的程序從編寫到下載到單片機,主要分為幾個部分:編輯、編譯、鏈接、下載
我們通常用的Keil,實際上是把上述四個過程集成到一塊了,是傻瓜式軟體,表面上看是一體的,
其實則不然。而我們寫大型程序,比如寫Android,以上的過程是分開的。
2 編譯器與下載器之間沒有通訊,我們之所以能用有的開發環境下載程序,比如用Keil下載,實際上是Keil調用了下載部分的程序,而不是編譯和下載之間的關系。
3 單片機下載分為三個部分,PC機上的軟體,下載器,單片機。 當然,有的單片機沒有下載器。
PC上軟體的作用就是把Hex文件轉換成Bin文件,然後通過廠家協議下載到單片機,或者直接把Bin文件下載到單片機。
對於沒有下載器的,比如STC系列單片機,它的通信由兩部分組成:PC軟體和單片機內部的ISP
對於有下載器的,比如AVR,STM32的JTAG,通信由三部分組成,PC<---->下載器<--->單片機的ISP.
4 對於不經過下載器的單片機,每個廠家的單片機的ISP是不一樣的,因此,你要想知道通信協議,可以用BUS HOUNDER自己去捕捉,我曾經捕捉過STM32的ISP協議,當然,失敗了,因為程序不同,協議不太一樣,主要是有個校驗和問題。
5 對於要經過下載器的單片機,比如AVR,就比較麻煩,除了用BUSHOUND,還要有專門的邏輯分析儀去捕捉下載器與單片機之間的協議。
總結:想要捕捉單片機的下載協議,並不是個簡單的工作,需要有深厚的技術基礎。
Ⅳ 單片機程序,急需!
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TOMD,#02H
MOV TH0,#6
MOV TL0,#6
SETB TR0
SETB EA
SETB ET0
MOV R2,#0
MOV R3,#0
MOV R6,#0
MOV R7,#0
LCALL DISPLAY
LOOP:
JNB TF0,$
CLR TR0
INC R7
CJNE R7,#200,LOOP
MOV R7,#0
INC R6
CJNE R6,#20,LOOP
MOV R6,#0
INC R3
LCALL DISPLAY
CJNE R3,#10,LOOP
MOV R3,#0
INC R2
LCALL DISPLAY
CJNE R2,#10,LOOP
MOV R2,#0
LCALL DISPLAY
LJMP LOOP
END
DISPLAY:
MOV DPTR,#TABLE
MOV A,R2
MOVC A,@A+DPTR
MOV P0,A
MOV A,R3
MOVC A,@A+DPTR
MOV P2,A
RET
;---------------------------------------
TABLE: ; 共陰極數碼管顯示代碼表
DB 0FCH ;"0" 00H
DB 60H ;"1" 01H
DB 0DAH ;"2" 02H
DB 0F2H ;"3" 03H
DB 66H ;"4" 04H
DB 0B6H ;"5" 05H
DB 0BEH ;"6" 06H
DB 0E0H ;"7" 07H
DB 0FEH ;"8" 08H
DB 0F6H ;"9" 09H
Ⅵ 單片機程序設計
51單片機?自學已經足夠了、用心點、別一開始就想著要依賴別人、你要想著靠自己也可以學好——而且單片機挺好玩的、學起來很有樂趣的、會越來越想學的——建議你買個實驗板——
Ⅶ 求單片機c經典程序!!!
這是數字溫度計的程序,從DS18B20數字溫度感測器中讀取溫度,然後顯示在數碼管上!DS18B20數字溫度感測器採用了單匯流排通訊方式(即採用一根線完成所有信號的傳送),並且對時序要求比較高,看程序時要結合DS18B20數字溫度感測器的時序圖去看。
#include<reg52.h>
#include<intrins.h>
sbit sjx=P1^6; //ds18b20數據線介面位聲明
sbit x1=P1^0;
sbit x2=P1^1;
sbit x3=P1^2;
sbit x4=P1^3;
unsigned char wei1,wei2,wei3,zf;
unsigned int wen,zijie=0;
unsigned char wdjc[2]={0,0};
int bb=0;
unsigned char code xianshima[] //0~9的顯示碼
={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,};
void xianshi(); //顯示子程序聲明
void yanshi(unsigned int z); //延時子程序聲明
void reset(); //復位子程序聲明
void chushihua (); //初始化子程序聲明
void quwen(); //讀取溫度子程序聲明
void xie(char); //向18b20寫位元組子程序聲明
unsigned int (); //從18b20讀位元組子程序聲明
void yanshi_18B20(unsigned int); //18b20延時子程序聲明
main() //主函數
{
chushihua();
quwen();
yanshi(1000);
EA=1; //總中斷允許
ET0=1; //定時器0中斷允許
TMOD=0x01;
TH0=(65535-15535)/256;
TL0=(65535-15535)%256;
TR0=1; //定時器0啟動
// chushihua();
while(1) //使程序循環
{
// chushihua(); //調用初始化子程序
// quwen(); //調用讀取溫度子程序
xianshi(); //調用顯示子程序
}
}
void chushihua (void) //初始化子程序
{
reset(); //復位
xie(0xCC); //跳過序列號
xie(0x44); //溫度轉換命令
}
void quwen(void) //讀取溫度子程序
{
int k,i;
int wd; //存放讀取的溫度值 將其除以16即為得到的值
reset(); //復位
k++; //延時4us
xie(0xCC); //跳過序列號
k++; //延時4us
xie(0xBE); //發出讀指令
k++;k++; //延時8us
wdjc[0]=(); //讀取低位元組
wdjc[1]=(); //讀取高位元組
i=wdjc[1]; //把第二個位元組先存至低8位
i<<=8; //把第二個位元組移到高八位上去
i|=wdjc[0]; //把第一個位元組放到底八位上去
if( (wdjc[1]&0x08)) //去除的到數據的數據位,得到符號位
{
wd=0xffff-i+1; //如果為負溫則去除其補碼
zf=0; //表示溫度為負數
}
else
{
wd=i; //如果為正溫度則只直接賦予wd
zf=1; //表示溫度為正數
}
wen=wd*10/16; //獲取的溫度轉換成十進制溫度數值的10倍
}
/*
數碼管接線說明:
P2口接共陰極數碼管段選(從低位到高位依次接數碼管的a~h)
P1.0接數碼管第一位的陰極,P1.1接數碼管第二位的陰極,
P1.2接數碼管第三位的陰極,P1.3接數碼管第四位的陰極。
*/
void xianshi() //顯示子程序
{
wei1=wen/100%1000%100%10;
wei2=wen/10%10000%1000%100%10;
wei3=wen/1%100000%10000%1000%100%10;
if(zf==0){x1=0;x2=1;x3=1;x4=1;P2=0x40;} //正負號顯示
yanshi(5);
x1=1;x2=0;x3=1;x4=1;
P2=xianshima[wei1];
yanshi(5);
x1=1;x2=1;x3=0;x4=1;
P2=xianshima[wei2]+0x80; //小數點顯示+80H
yanshi(5);
x1=1;x2=1;x3=1;x4=0;
P2=xianshima[wei3];
yanshi(5);
}
void yanshi(unsigned int z) //延時子程序
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void yanshi_18B20(unsigned int ys) //18b20延時子程序
{
for(;ys>0;ys--);
}
void reset() //18b20復位子程序
{
sjx = 0;
yanshi_18B20(44);
sjx = 1;
yanshi_18B20(15);
}
unsigned int () //讀18b20子程序
{
unsigned char i;
for (i=8;i>0;i--)
{
zijie>>=1;
sjx = 0;
_nop_();_nop_();_nop_();_nop_();
sjx = 1;
if(sjx)
{
zijie|=0x80;
}
yanshi_18B20(4);
}
return(zijie);
}
void xie(char xzj) //寫18b20子程序
{
unsigned char i,j;
for (i=8; i>0; i--)
{
sjx = 0;
j++;
sjx = xzj&0x01;
yanshi_18B20(8);
sjx = 1;
j++;
xzj>>=1;
}
}
void time0() interrupt 1 //中斷服務程序
{
TH0=50000/256;
TL0=50000%256;
bb++;
if(bb==50)
{
bb=0;
chushihua();
quwen();
}
}
Ⅷ 求 單片機簡單的C語言程序例子(越多越好)
我前幾天剛在網上看到的,不知道對你有沒有用》
1. 閃爍燈
1. 實驗任務
如圖4.1.1所示:在P1.0埠上接一個發光二極體L1,使L1在不停地一亮一滅,一亮一滅的時間間隔為0.2秒。
2. 電路原理圖
圖4.1.1
3. 系統板上硬體連線
把「單片機系統」區域中的P1.0埠用導線連接到「八路發光二極體指示模塊」區域中的L1埠上。
4. 程序設計內容
(1). 延時程序的設計方法
作為單片機的指令的執行的時間是很短,數量大微秒級,因此,我們要求的閃爍時間間隔為0.2秒,相對於微秒來說,相差太大,所以我們在執行某一指令時,插入延時程序,來達到我們的要求,但這樣的延時程序是如何設計呢?下面具體介紹其原理:
如圖4.1.1所示的石英晶體為12MHz,因此,1個機器周期為1微秒
機器周期 微秒
MOV R6,#20 2個機器周期 2
D1: MOV R7,#248 2個機器周期 2 2+2×248=498 20×
DJNZ R7,$ 2個機器周期 2×248 498
DJNZ R6,D1 2個機器周期 2×20=40 10002
因此,上面的延時程序時間為10.002ms。
由以上可知,當R6=10、R7=248時,延時5ms,R6=20、R7=248時,延時10ms,以此為基本的計時單位。如本實驗要求0.2秒=200ms,10ms×R5=200ms,則R5=20,延時子程序如下:
DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET
(2). 輸出控制
如圖1所示,當P1.0埠輸出高電平,即P1.0=1時,根據發光二極體的單向導電性可知,這時發光二極體L1熄滅;當P1.0埠輸出低電平,即P1.0=0時,發光二極體L1亮;我們可以使用SETB P1.0指令使P1.0埠輸出高電平,使用CLR P1.0指令使P1.0埠輸出低電平。
5. 程序框圖
如圖4.1.2所示
圖4.1.2
6. 匯編源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延時子程序,延時0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C語言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延時0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void){while(1){L1=0;delay02s();L1=1;delay02s();}}
2. 模擬開關燈
1. 實驗任務
如圖4.2.1所示,監視開關K1(接在P3.0埠上),用發光二極體L1(接在單片機P1.0埠上)顯示開關狀態,如果開關合上,L1亮,開關打開,L1熄滅。
2. 電路原理圖
圖4.2.1
3. 系統板上硬體連線
(1). 把「單片機系統」區域中的P1.0埠用導線連接到「八路發光二極體指示模塊」區域中的L1埠上;
(2). 把「單片機系統」區域中的P3.0埠用導線連接到「四路撥動開關」區域中的K1埠上;
4. 程序設計內容
(1). 開關狀態的檢測過程
單片機對開關狀態的檢測相對於單片機來說,是從單片機的P3.0埠輸入信號,而輸入的信號只有高電平和低電平兩種,當撥開開關K1撥上去,即輸入高電平,相當開關斷開,當撥動開關K1撥下去,即輸入低電平,相當開關閉合。單片機可以採用JB BIT,REL或者是JNB BIT,REL指令來完成對開關狀態的檢測即可。
(2). 輸出控制
如圖3所示,當P1.0埠輸出高電平,即P1.0=1時,根據發光二極體的單向導電性可知,這時發光二極體L1熄滅;當P1.0埠輸出低電平,即P1.0=0時,發光二極體L1亮;我們可以使用SETB P1.0指令使P1.0埠輸出高電平,使用CLR P1.0指令使P1.0埠輸出低電平。
5. 程序框圖
圖4.2.2
6. 匯編源程序 ORG 00HSTART: JB P3.0,LIGCLR P1.0SJMP STARTLIG: SETB P1.0SJMP STARTEND
7. C語言源程序#include <AT89X51.H>sbit K1=P3^0;sbit L1=P1^0;void main(void){while(1){if(K1==0){L1=0; //燈亮}else{L1=1; //燈滅}}}
3. 多路開關狀態指示
1. 實驗任務
如圖4.3.1所示,AT89S51單片機的P1.0-P1.3接四個發光二極體L1-L4,P1.4-P1.7接了四個開關K1-K4,編程將開關的狀態反映到發光二極體上。(開關閉合,對應的燈亮,開關斷開,對應的燈滅)。
2. 電路原理圖
圖4.3.1
3. 系統板上硬體連線
(1. 把「單片機系統」區域中的P1.0-P1.3用導線連接到「八路發光二極體指示模塊」區域中的L1-L4埠上;
(2. 把「單片機系統」區域中的P1.4-P1.7用導線連接到「四路撥動開關」區域中的K1-K4埠上;
4. 程序設計內容
(1. 開關狀態檢測
對於開關狀態檢測,相對單片機來說,是輸入關系,我們可輪流檢測每個開關狀態,根據每個開關的狀態讓相應的發光二極體指示,可以採用JB P1.X,REL或JNB P1.X,REL指令來完成;也可以一次性檢測四路開關狀態,然後讓其指示,可以採用MOV A,P1指令一次把P1埠的狀態全部讀入,然後取高4位的狀態來指示。
(2. 輸出控制
根據開關的狀態,由發光二極體L1-L4來指示,我們可以用SETB P1.X和CLR P1.X指令來完成,也可以採用MOV P1,#1111XXXXB方法一次指示。
5. 程序框圖
讀P1口數據到ACC中
ACC內容右移4次
ACC內容與F0H相或
ACC內容送入P1口
<![endif]-->
圖4.3.2
6. 方法一(匯編源程序)ORG 00HSTART: MOV A,P1ANL A,#0F0HRR ARR ARR ARR AORl A,#0F0HMOV P1,ASJMP STARTEND7. 方法一(C語言源程序)#include <AT89X51.H>unsigned char temp;void main(void){while(1){temp=P1>>4;temp=temp | 0xf0;P1=temp;}}8. 方法二(匯編源程序)ORG 00HSTART: JB P1.4,NEXT1CLR P1.0SJMP NEX1NEXT1: SETB P1.0NEX1: JB P1.5,NEXT2CLR P1.1SJMP NEX2NEXT2: SETB P1.1NEX2: JB P1.6,NEXT3CLR P1.2SJMP NEX3NEXT3: SETB P1.2NEX3: JB P1.7,NEXT4CLR P1.3SJMP NEX4NEXT4: SETB P1.3NEX4: SJMP STARTEND9. 方法二(C語言源程序)#include <AT89X51.H>void main(void){while(1){if(P1_4==0){P1_0=0;}else{P1_0=1;}if(P1_5==0){P1_1=0;}else{P1_1=1;}if(P1_6==0){P1_2=0;}else{P1_2=1;}if(P1_7==0){P1_3=0;}else{P1_3=1;}}}
先給你,傳不上 太多了
Ⅸ 51單片機源程序設計
先實現一個功能吧,按K1數碼管顯示加1,LED燈左移一位。
#include<reg51.h>
#include<intrins.h>
#defineucharunsignedchar
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽級數碼管碼表0-9
ucharkey;
voidext0()interrupt0
{
key++;
P1=_crol_(0xfe,key);
P0=table[key];
}
main()
{
EX0=1;
IT0=1;
EA=1;
while(1);
}