導航:首頁 > 編程語言 > 單片機電子表編程實例

單片機電子表編程實例

發布時間:2023-05-19 10:00:21

⑴ 兩位秒錶 51單片機程序編程

你好:

三個警告應該是void int_initial()與void timer0_initial()前邊不用加void,然後就是Display()這個函數沒有用。

其次我想說,TMOD=0x01就行了,因為程序里邊只用到了定時器0,其他的狀態不管,甚至可以說把其他定時器關掉。,也用不著TMOD&=0xfd。
然後中斷函數要盡量精簡、短小實干、不宜過長,因為中斷本身就打擾了main函數的正常運行,而且中斷內容太多反而容易在下次中斷到來時還沒處理完,就會棧溢出。養成好的習慣,中斷就對最基本的時間計次就行,其餘的都拋給main函數吧。
EA、ET0盡量就和定時器0一起初始化,你這習慣看著別扭。可讀性略低。
中斷里不要聲明變數,你用個全局變數就OK。
希望我的回答能幫助到你。

⑵ 用單片機的匯編語言編寫一個(十秒秒錶 的編程)

這伍答是一個秒錶,有腔顫慧按鍵實現 啟動、暫停核清零功能洞畝。
#include <reg51.H>
sbit P3_5 =P3^5;
unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00};
unsigned char second;
unsigned char keycnt;
unsigned int tcnt;

void main(void)
{
unsigned char i,j;

TMOD=0x02;
ET0=1;
EA=1;
second=0;
P1=dispcode[second/10];
P2=dispcode[second%10];
while(1)
{
if(P3_5==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
if(P3_5==0)
{
keycnt++;
switch(keycnt)
{
case 1:
TH0=0x06;
TL0=0x06;
TR0=1;
break;
case 2:
TR0=0;
break;
case 3:
keycnt=0;
second=0;
P1=dispcode[second/10];
P2=dispcode[second%10];
break;
}
while(P3_5==0);
}
}
}
}

void t0(void) interrupt 1 using 0
{
tcnt++;
if(tcnt==4000)
{
tcnt=0;
second++;
if(second==100)
{
second=0;
}
P1=dispcode[second/10];
P2=dispcode[second%10];
}
}

⑶ 單片機c語言編程100個實例

51單片機C語言編程實例 基礎知識:51單片機編程基礎 單片機的外部結構: 1. DIP40雙列直插; 2. P0,P1,P2,P3四個8位準雙向I/O引腳;(作為I/O輸入時,要先輸出高電平) 3. 電源VCC(PIN40)和地線GND(PIN20); 4. 高電平復位RESET(PIN9);(10uF電容接VCC與RESET,即可實現上電復位) 5. 內置振盪電路,外部只要接晶體至X1(PIN18)和X0(PIN19);(頻率為主頻的12倍) 6. 程序配置EA(PIN31)接高電平VCC;(運行單片機內部ROM中的程序) 7. P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1 單片機內部I/O部件:(所為學習單片機,實際上就是編程式控制制以下I/O部件,完成指定任務) 1. 四個8位通用I/O埠,對應引腳P0、P1、P2和P3; 2. 兩個16位定時計數器;(TMOD,TCON,TL0,TH0,TL1,TH1) 3. 一個串列通信介面;(SCON,SBUF) 4. 一個中斷控制器;(IE,IP) 針對AT89C52單片機,頭文件AT89x52.h給出了SFR特殊功能寄存器所有埠的定義。 C語言編程基礎: 1. 十六進製表示位元組0x5a:二進制為01011010B;0x6E為01101110。 2. 如果將一個16位二進數賦給一個8位的位元組變數,則自動截斷為低8位,而丟掉高8位。 3. ++var表示對變數var先增一;var—表示對變數後減一。 4. x |= 0x0f;表示為 x = x | 0x0f; 5. TMOD = ( TMOD & 0xf0 ) | 0x05;表示給變數TMOD的低四位賦值0x5,而不改變TMOD的高四位。 6. While( 1 ); 表示無限執行該語句,即死循環。語句後的分號表示空循環體,也就是{;} 在某引腳輸出高電平的編程方法:(比如P1.3(PIN4)引腳) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P1.3 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P1_3 = 1; //給P1_3賦值1,引腳P1.3就能輸出高電平VCC 5. While( 1 ); //死循環,相當 LOOP: goto LOOP; 6. } 注意:P0的每個引腳要輸出高電平時,必須外接上拉電阻(如4K7)至VCC電源。 在某引腳輸出低電平的編程方法:(比如P2.7引腳) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P2.7 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P2_7 = 0; //給P2_7賦值0,引腳P2.7就能輸出低電平GND 5. While( 1 ); //死循環,相當 LOOP: goto LOOP; 6. } 在某引腳輸出方波編程方法:(比如P3.1引腳) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P3.1 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. While( 1 ) //非零表示真,如果為真則執行下面循環體的語句 5. { 6. P3_1 = 1; //給P3_1賦值1,引腳P3.1就能輸出高電平VCC 7. P3_1 = 0; //給P3_1賦值0,引腳P3.1就能輸出低電平GND 8. } //由於一直為真,所以不斷輸出高、低、高、低……,從而形成方波 9. } 將某引腳的輸入電平取反後,從另一個引腳輸出:( 比如 P0.4 = NOT( P1.1) ) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P0.4和P1.1 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P1_1 = 1; //初始化。P1.1作為輸入,必須輸出高電平 5. While( 1 ) //非零表示真,如果為真則執行下面循環體的語句 6. { 7. if( P1_1 == 1 ) //讀取P1.1,就是認為P1.1為輸入,如果P1.1輸入高電平VCC 8. { P0_4 = 0; } //給P0_4賦值0,引腳P0.4就能輸出低電平GND 2 51單片機C語言編程實例 9. else //否則P1.1輸入為低電平GND 10. //{ P0_4 = 0; } //給P0_4賦值0,引腳P0.4就能輸出低電平GND 11. { P0_4 = 1; } //給P0_4賦值1,引腳P0.4就能輸出高電平VCC 12. } //由於一直為真,所以不斷根據P1.1的輸入情況,改變P0.4的輸出電平 13. } 將某埠8個引腳輸入電平,低四位取反後,從另一個埠8個引腳輸出:( 比如 P2 = NOT( P3 ) ) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P2和P3 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P3 = 0xff; //初始化。P3作為輸入,必須輸出高電平,同時給P3口的8個引腳輸出高電平 5. While( 1 ) //非零表示真,如果為真則執行下面循環體的語句 6. { //取反的方法是異或1,而不取反的方法則是異或0 7. P2 = P3^0x0f //讀取P3,就是認為P3為輸入,低四位異或者1,即取反,然後輸出 8. } //由於一直為真,所以不斷將P3取反輸出到P2 9. } 注意:一個位元組的8位D7、D6至D0,分別輸出到P3.7、P3.6至P3.0,比如P3=0x0f,則P3.7、P3.6、P3.5、P3.4四個引腳都輸出低電平,而P3.3、P3.2、P3.1、P3.0四個引腳都輸出高電平。同樣,輸入一個埠P2,即是將P2.7、P2.6至P2.0,讀入到一個位元組的8位D7、D6至D0。 第一節:單數碼管按鍵顯示 單片機最小系統的硬體原理接線圖: 1. 接電源:VCC(PIN40)、GND(PIN20)。加接退耦電容0.1uF 2. 接晶體:X1(PIN18)、X2(PIN19)。注意標出晶體頻率(選用12MHz),還有輔助電容30pF 3. 接復位:RES(PIN9)。接上電復位電路,以及手動復位電路,分析復位工作原理 4. 接配置:EA(PIN31)。說明原因。 發光二極的控制:單片機I/O輸出 將一發光二極體LED的正極(陽極)接P1.1,LED的負極(陰極)接地GND。只要P1.1輸出高電平VCC,LED就正向導通(導通時LED上的壓降大於1V),有電流流過LED,至發LED發亮。實際上由於P1.1高電平輸出電阻為10K,起到輸出限流的作用,所以流過LED的電流小於(5V-1V)/10K = 0.4mA。只要P1.1輸出低電平GND,實際小於0.3V,LED就不能導通,結果LED不亮。 開關雙鍵的輸入:輸入先輸出高 一個按鍵KEY_ON接在P1.6與GND之間,另一個按鍵KEY_OFF接P1.7與GND之間,按KEY_ON後LED亮,按KEY_OFF後LED滅。同時按下LED半亮,LED保持後松開鍵的狀態,即ON亮OFF滅。 代碼 1. #include <at89x52.h> 2. #define LED P1^1 //用符號LED代替P1_1 3. #define KEY_ON P1^6 //用符號KEY_ON代替P1_6 4. #define KEY_OFF P1^7 //用符號KEY_OFF代替P1_7 5. void main( void ) //單片機復位後的執行入口,void表示空,無輸入參數,無返回值 6. { 7. KEY_ON = 1; //作為輸入,首先輸出高,接下KEY_ON,P1.6則接地為0,否則輸入為1 8. KEY_OFF = 1; //作為輸入,首先輸出高,接下KEY_OFF,P1.7則接地為0,否則輸入為1 9. While( 1 ) //永遠為真,所以永遠循環執行如下括弧內所有語句 10. { 11. if( KEY_ON==0 ) LED=1; //是KEY_ON接下,所示P1.1輸出高,LED亮 12. if( KEY_OFF==0 ) LED=0; //是KEY_OFF接下,所示P1.1輸出低,LED滅 13. } //松開鍵後,都不給LED賦值,所以LED保持最後按鍵狀態。 14. //同時按下時,LED不斷亮滅,各佔一半時間,交替頻率很快,由於人眼慣性,看上去為半亮態 15. } 數碼管的接法和驅動原理 一支七段數碼管實際由8個發光二極體構成,其中7個組形構成數字8的七段筆畫,所以稱為七段數碼管,而餘下的1個發光二極體作為小數點。作為習慣,分別給8個發光二極體標上記號:a,b,c,d,e,f,g,h。對應8的頂上一畫,按順時針方向排,中間一畫為g,小數點為h。 我們通常又將各二極與一個位元組的8位對應,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7),相應8個發光二極體正好與單片機一個埠Pn的8個引腳連接,這樣單片機就可以通過引腳輸出高低電平控制8個發光二極的亮與滅,從而顯示各種數字和符號;對應位元組,引腳接法為:a(Pn.0),b(Pn.1),c(Pn.2),d(Pn.3),e(Pn.4),f(Pn.5),g(Pn.6),h(Pn.7)。 如果將8個發光二極體的負極(陰極)內接在一起,作為數碼管的一個引腳,這種數碼管則被稱為共陰數碼管,共同的引腳則稱為共陰極,8個正極則為段極。否則,如果是將正極(陽極)內接在一起引出的,則稱為共陽數碼管,共同的引腳則稱為共陽極,8個負極則為段極。 以單支共陰數碼管為例,可將段極接到某埠Pn,共陰極接GND,則可編寫出對應十六進制碼的七段碼表位元組數據

⑷ 單片機電子表程序

匯編如下:
S_SET BIT P3.4 ;秒增加1按鈕位
M_SET BIT P3.5 ;分增加1按鈕位
H_SET BIT P3.7 ;小時增加1按鈕位
SECOND EQU 30H ;秒計數值變數
MINUTE EQU 31H ;分計數值變數
HOUR EQU 32H ;小時計數值變數
TCNT EQU 34H ; 1秒定時計數器

ORG 00H ;起始地址
JMP START
ORG 0BH ;Timer0中斷向量地址
JMP INT_T0

START:
MOV DPTR,#TABLE ;裝七段數碼管段碼數據表TABLE
MOV HOUR,#0 ;計數值全部清0
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
MOV TMOD,#01H ;Timer 0作定時器,模式1
MOV TH0,#(65536-50000)/256 ;定時50毫秒
MOV TL0,#(65536-50000)MOD 256
MOV IE,#82H ;中斷使能
SETB TR0 ;啟動Timer 0

;以下是判斷秒、分、小時增加1按鈕是否被按下
A1:
CALL DISPLAY
JNB S_SET,S1 ;判斷秒按鈕
JNB M_SET,S2 ;判斷分按鈕
JNB H_SET,S3 ;判斷小時按鈕
JMP A1 ;循環檢測

S1:
CALL DELAY ;去抖動
JB S_SET,A1
INC SECOND ;秒位計數值加1
MOV A,SECOND ;A=SECOND
CJNE A,#60,J0 ;判斷是否到60秒
MOV SECOND,#0 ;如果到了就清0秒位計數值
JMP K1 ;跳到K1段

S2:
CALL DELAY
JB M_SET,A1

K1:
INC MINUTE ;分位計數值加1
MOV A,MINUTE ;A=MINUTE
CJNE A,#60,J1 ;判斷是否到60分
MOV MINUTE,#0 ;如果到了就清0分位計數值
JMP K2

S3:
CALL DELAY
JB H_SET,A1

K2:
INC HOUR ;小時計數值加1
MOV A,HOUR ;A=HOUR
CJNE A,#24,J2 ;判斷是否到24小時
MOV HOUR,#0 ;如果到了就清0秒、分、小時位計數值
MOV MINUTE,#0
MOV SECOND,#0
JMP A1

;以下程序等待秒、分、小時按鈕放開
J0:
JB S_SET,A1
CALL DISPLAY
JMP J0

J1:
JB M_SET,A1
CALL DISPLAY
JMP J1

J2:
JB H_SET,A1
CALL DISPLAY
JMP J2

;Timer0中斷服務子程序, 進行秒、分、小時的計時
INT_T0:
MOV TH0,#(65536-50000)/256 ;裝計數初始值
MOV TL0,#(65536-50000)MOD 256
INC TCNT ;1秒計數器增加1
MOV A,TCNT ;A=TCNT
CJNE A,#20,RETUNE ;計時1秒
INC SECOND ;秒計數器增加1
MOV TCNT,#0 ;清零TCNT
MOV A,SECOND ;A=SECOND
CJNE A,#60,RETUNE ;計時60秒
INC MINUTE ;分計數器增加1
MOV SECOND,#0 ;清零秒
MOV A,MINUTE ;A=MINUTE
CJNE A,#60,RETUNE ;計時60分
INC HOUR ;小時計數器增加1
MOV MINUTE,#0 ;清零分
MOV A,HOUR ;A=HOUR
CJNE A,#24,RETUNE ;計時24小時
MOV HOUR,#0 ;秒、分、小時計數值清0
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
RETUNE:
RETI ; 中斷服務子程序結束

;以下為七段數碼管顯示的子程序
DISPLAY:
MOV A,SECOND ;A=SECOND,顯示秒
MOV B,#10 ;B=10
DIV AB ;A除以B
MOV P2,#00100000B ;使能秒的十位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管

MOV A,B ;A=B
MOV P2,#00000000B ;使能秒的個位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管

MOV A,MINUTE ;A=MINUTE,顯示分
MOV B,#10 ;B=10
DIV AB ;A除以B
MOV P2,#01100000B ;使能分的十位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管

MOV A,B ;A=B
MOV P2,#01000000B ;使能分的個位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管

MOV A,HOUR ;A=HOUR,顯示小時
MOV B,#10 ;B=10
DIV AB ;A除以B
MOV P2,#10100000B ;使能小時的十位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管

MOV A,B ;A=B
MOV P2,#10000000B ;使能小時的個位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管
RET

TABLE: ;七段數碼管顯示碼表
DB 40H,79H,24H,30H,19H
DB 12H,02H,78H,00H,10H

DELAY: ;延時子程序
MOV R6,#2
D1:
MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET

END

⑸ 基於51單片機的數字電子表的設計

Second EQU R0
Minute EQU R1
Hour EQU R2
Times EQU R3
KeyVal EQU 21H ;儲存鍵值
Key_Res BIT KeyVal.0
Key_Sta BIT KeyVal.1
Key_Add BIT KeyVal.2
Key_Sub BIT KeyVal.3
Key_Sto BIT KeyVal.4
Key_Shift BIT KeyVal.5
;——————————————————————————————————————
ORG 0000H ;主函數入口
SJMP MAIN ;跳轉到主函數
ORG 000BH ;定時器0中斷入口
LJMP INT_Timer50 ;斷定時50ms服務程序;///////////主函數部分//////////;—————初始化部分————
MAIN:
MOV DPTR,#Table ;共陰字型碼表首地址
MOV Second,#0 ;秒單元值零{Second,Minute,Hour
MOV Minute,#0 ;分單元值零{定義為秒
MOV Hour,#0 ;時單元值零{分,時變數
MOV IE,#082H ;打開定時器0中斷
MOV TMOD,#01H ;讓定時器0工作在1方式 Start:
MOV KeyVal,#0FFH ;初始化鍵值為ffh
MOV Times,#0 ;記錄調用中斷的次數,20次為1s
MOV TH0,#3CH
MOV TL0,#0B0H ;時間常數50ms

;——————初始化完成————

LOOP:
LCALL DisplayTime ;顯示當時的時間
MOV A,P0
CJNE A,#0FFH,Read_Key ;按下鍵時讀鍵
LCALL Deal_Key ;抬起鍵時處理按鍵消息
SJMP LOOP
Read_Key :
MOV KeyVal,A ;記下按鍵值
SJMP LOOP ;//////////////主程序結束///////////;/////////按鍵處理子程序///////////
Deal_Key:
JB Key_Shift,KEY00 ;沒按shift轉向復位鍵
INC R4 ;當按加減時首先調整小時,按下shift後
MOV A,R4 ;調整分,再按shift後調整秒,再按shift後
MOV B,#3 ;回到調整小時
DIV AB ;實現按鍵循環控制
MOV R4,B
SJMP EXIT
KEY00:
JB Key_Res,KEY01
SJMP MAIN
KEY01:
JB Key_Sta,SetHour
SETB TR0
SJMP Start
SetHour:
CJNE R4,#0,SetMinute
LCALL DealHour
SJMP EXIT
SetMinute:
CJNE R4,#1,SetScond
LCALL DealMinute
SJMP EXIT
SetScond:
CJNE R4,#2,EXIT
LCALL DealSecond
EXIT:
MOV KeyVal ,#0FFH ;退出時復位鍵值,不然影響下次判斷
RET
;//////////////////////////////////////
DealHour:
JB Key_Add,KEY04
CLR TR0
INC Hour
KEY04:
JB Key_Sub,KEY05
CLR TR0
DEC Hour
KEY05:
JB Key_Sto,EXIT
CLR TR0
RET
;/////////////////////////////////////
DealMinute:
JB Key_Add,KEY004
CLR TR0
INC Minute
KEY004:
JB Key_Sub,KEY005
CLR TR0
DEC Minute
KEY005:
JB Key_Sto,EXIT
CLR TR0
RET
;////////////////////////////////////
DealSecond:
JB Key_Add,KEY040
CLR TR0
INC Second
KEY040:
JB Key_Sub,KEY050
CLR TR0
DEC Second
KEY050:
JB Key_Sto,EXIT
CLR TR0
RET
;//////////////計時子程序//////////
DisplayTime: ;//實現對時間的進位處理
CJNE Second,#60,Min
MOV Second,#0 ;六十秒到後秒單元清零
INC Minute ;且分單元加一
Min:CJNE Minute,#60,HOU
MOV Minute,#0 ;六十分鍾到後分單元清零
INC Hour ;且時單元加一
HOU:CJNE Hour,#24,DIS
MOV Hour,#0 ;24小時到後時單元清零
DIS:MOV A,Second
LCALL Display ;動態顯示時間
RET;////////顯示子程序////////////
;顯示秒的部分
Display:
MOV A,Second ;秒送累加器
MOV B,#10
DIV AB ;除10,A=十位,B=個位
MOV P1,#0EFH ; 打開秒的十位數碼管
MOVC A,@A+DPTR
MOV P2,A
MOV 20H,#1 ;傳遞給延時函數的參數
LCALL delay ;調用延時函數
MOV P1,#0DFH ;打開秒的個位數碼管
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
MOV 20H,#2
LCALL delay
;顯示分的部分
MOV A,Minute
MOV B,#10
DIV AB
MOV P1,#0FBH; P1控制顯示哪個數碼管
MOVC A,@A+DPTR
MOV P2,A
MOV 20H,#1
LCALL delay
MOV P1,#0F7H;
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
MOV 20H,#2
LCALL delay
;顯示小時的部分
MOV A,Hour
MOV B,#10
DIV AB
MOV P1,#0FEH; P1控制顯示哪個數碼管
MOVC A,@A+DPTR
MOV P2,A
MOV 20H,#1
LCALL delay
MOV P1,#0FDH;
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
MOV 20H,#2
LCALL delayRET
;///////////延時子程序//////////
delay:
MOV R7,#15 ;1T
DEL1:MOV R6,20H ;1T
DEL2:NOP ;1T
NOP ;1T
DJNZ R6,DEL2 ;2T
DJNZ R7,DEL1 ;2T
RET ;2T
;//////////中斷服務子程序/////////
INT_Timer50:
MOV TH0,#3CH
MOV TL0,#0B0H ;重置時間常數

INC Times ;次數加一
CJNE Times,#20,ExitS ;不等20直接返回
INC Second ;一秒到,秒加{大家在處理秒時盡量放到中斷函數
MOV Times,#0 ;次數清零 {,這樣處理更准卻,不信你可以放外面試試
ExitS: RETI
;////////////////////////////////////////// Table:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END

⑹ 《單片機C語言程序設計實訓100例——基於8051+Proteus模擬》 第03篇源代碼

單片機c語言編程100個實例目錄1
函數的使用和熟悉
實例3:用單片機控制第一個燈亮
實例4:用單片機控制一個燈閃爍:認識單片機的工作頻率
實例5:將 P1口狀態分別送入P0、P2、P3口:認識I/O口的引腳功能
實例6:使用P3口流水點亮8位LED
實例7:通過對P3口地址的操作流水點亮8位LED
實例8:用不同數據類型控制燈閃爍時間
實例9:用P0口、P1 口分別顯示加法和減法運算結果
實例10:用P0、P1口顯示乘法運算結果
實例11:用P1、P0口顯示除法運算結果
實例12:用自增運算控制P0口8位LED流水花樣
實例13:用P0口顯示邏輯"與"運算結果
實例14:用P0口顯示條件運算結果
實例15:用P0口顯示按位"異或"運算結果
實例16:用P0顯示左移運算結果
實例17:"萬能邏輯電路"實驗
實例18:用右移運算流水點亮P1口8位LED
實例19:用if語句控制P0口8位LED的流水方向
實例20:用swtich語句的控制P0口8位LED的點亮狀態
實例21:用for語句控制蜂鳴器鳴笛次數
實例22:用while語句控制LED
實例23:用do-while語句控制P0口8位LED流水點亮
實例24:用字元型數組控制P0口8位LED流水點亮
實例25: 用P0口顯示字元串常量
實例26:用P0 口顯示指針運算結果
實例27:用指針數組控制P0口8位LED流水點亮
實例28:用數組的指針控制P0 口8 位LED流水點亮
實例29:用P0 、P1口顯示整型函數返回值
實例30:用有參函數控制P0口8位LED流水速度
實例31:用數組作函數參數控制流水花樣
實例32:用指針作函數參數控制P0口8位LED流水點亮
實例33:用函數型指針控制P1口燈花樣
實例34:用指針數組作為函數的參數顯示多個字元串
單片機c語言編程100個實例目錄2
實例35:字元函數ctype.h應用舉例
實例36:內部函數intrins.h應用舉例
實例37:標准函數stdlib.h應用舉例
實例38:字元串函數string.h應用舉例
實例39:宏定義應用舉例2
實例40:宏定義應用舉例2
實例41:宏定義應用舉例3
* 中斷、定時器中斷、定時器 *中斷、定時器*中斷、定時器 /
實例42:用定時器T0查詢方式P2口8位控制LED閃爍
實例43:用定時器T1查詢方式控制單片機發出1KHz音頻
實例44:將計數器T0計數的結果送P1口8位LED顯示
實例45:用定時器T0的中斷控制1位LED閃爍
實例46:用定時器T0的中斷實現長時間定時
實例47:用定時器T1中斷控制兩個LED以不同周期閃爍
實例48:用計數器T1的中斷控制蜂鳴器發出1KHz音頻
實例49:用定時器T0的中斷實現"渴望"主題曲的播放
實例50-1:輸出50個矩形脈沖
實例50-2:計數器T0統計外部脈沖數
實例51-2:定時器T0的模式2測量正脈沖寬度
實例52:用定時器T0控制輸出高低寬度不同的矩形波
實例53:用外中斷0的中斷方式進行數據採集
實例54-1:輸出負脈寬為200微秒的方波
實例54-2:測量負脈沖寬度
實例55:方式0控制流水燈循環點亮
實例56-1:數據發送程序
實例56-2:數據接收程序
實例57-1:數據發送程序
實例57-2:數據接收程序
實例58:單片機向PC發送數據
實例59:單片機接收PC發出的數據
*數碼管顯示*數碼管顯示 數碼管顯示數碼管顯示*/
實例60:用LED數碼顯示數字5
實例61:用LED數碼顯示器循環顯示數字0~9
實例62:用數碼管慢速動態掃描顯示數字"1234"
實例63:用LED數碼顯示器偽靜態顯示數字1234
實例64:用數碼管顯示動態檢測結果
實例65:數碼秒錶設計
實例66:數碼時鍾設計
實例67:用LED數碼管顯示計數器T0的計數值
實例68:靜態顯示數字「59」
單片機c語言編程100個實例目錄3
鍵盤控制*鍵盤控制* *鍵盤控制 *鍵盤控制 */
實例69:無軟體消抖的獨立式鍵盤輸入實驗
實例70:軟體消抖的獨立式鍵盤輸入實驗
實例71:CPU控制的獨立式鍵盤掃描實驗
實例72:定時器中斷控制的獨立式鍵盤掃描實驗
實例73:獨立式鍵盤控制的4級變速流水燈
實例74:獨立式鍵盤的按鍵功能擴展:"以一當四"
實例75:獨立式鍵盤調時的數碼時鍾實驗
實例76:獨立式鍵盤控制步進電機實驗
實例77:矩陣式鍵盤按鍵值的數碼管顯示實驗
//實例78:矩陣式鍵盤按鍵音
實例79:簡易電子琴
實例80:矩陣式鍵盤實現的電子密碼鎖
液晶顯示LCD*液晶顯示LCD *液晶顯示LCD * *液晶顯示LCD*液晶顯示LCD *液晶顯示LCD */
實例81:用LCD顯示字元'A'
實例82:用LCD循環右移顯示"Welcome to China"
實例83:用LCD顯示適時檢測結果
實例84:液晶時鍾設計
*一些晶元的使用*24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 紅外遙控/
實例85:將數據"0x0f"寫入AT24C02再讀出送P1口顯示
實例86:將按鍵次數寫入AT24C02,再讀出並用1602LCD顯示
實例87:對I2C匯流排上掛接多個AT24C02的讀寫操作
實例88:基於AT24C02的多機通信 讀取程序
實例89:基於AT24C02的多機通信 寫入程序
實例90:DS18B20溫度檢測及其液晶顯示
實例91:將數據"0xaa"寫入X5045再讀出送P1口顯示
實例92:將流水燈控制碼寫入X5045並讀出送P1口顯示
實例93:對SPI匯流排上掛接多個X5045的讀寫操作
實例94:基於ADC0832的數字電壓表
實例95:用DAC0832產生鋸齒波電壓
實例96:用P1口顯示紅外遙控器的按鍵值
實例97:用紅外遙控器控制繼電器
實例98:基於DS1302的日歷時鍾
實例99:單片機數據發送程序
實例100:電機轉速表設計
模擬霍爾脈沖

http://www.dzkfw.com.cn/myxin/51c_language.chm 單片機c語言一百例子

⑺ msp430超低功耗單片機 設計一個單片機簡易電子表

別想著人家免費拱手送給你,至少給出點誠意嘛……比如RMB10000元,畢竟現在物價很貴啊!

⑻ 急救!!!各位兄弟姐妹們誰懂單片機編程啊,幫幫我啊!用單片機編輯一個數字鍾的程序啊,要求如下:

給你一個我用液晶屏12864寫的程序,一個是功能鍵,按照順序按一下是第一位跳動,接下再按就是第二位,一次類推。第二個按鍵是控制加,第三個按鍵是控制減,你的數碼管和這個很類似,比這個還簡單,在這你也沒有要求數碼管是怎麼接的。你可以參考的。
#include<reg52.h>
#include<chushihua.h> //12864的初始化函數;
char gwnian,nian,yue,ri,xq,shi,fen,miao;
sbit DQ =P3^5; //定義DS18B20通信埠
sbit led_en_port = P2^5; /*發光二極體寄存器LE引腳*/
sbit sled_en_port = P3^6; /*數碼管寄存器LE引腳*/
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
uchar code mun_to_char[] = {"0123456789"}; /*數字轉換為ASCII字元碼*/
uchar table[]={"製作人:"};
uchar table2[]={"2009年11月28日晚"};
uchar table1[]={"江向陽"};
uchar table31[]={"年"};
uchar table32[]={"月"};
uchar table33[]={"日"};
uchar table4[]={"星期"};
uchar table51[]={"時"};
uchar table52[]={"分"};
uchar table53[]={"秒"};
uchar table6[]={"當前溫度:20.3"};
//uchar table61[]={"??度"};
uchar xq1[]={"一"};
uchar xq2[]={"二"};
uchar xq3[]={"叄"};
uchar xq4[]={"四"};
uchar xq5[]={"五"};
uchar xq6[]={"六"};
uchar xq7[]={"日"};

/***************寫星期函數*******************/
write_xq(uchar z)
{
uchar num;
write_com(0x90+5);
switch(z)
{
case 1: for(num=0;num<2;num++)
{
write_date(xq1[num]);
delay(1);
}
break;
case 2: for(num=0;num<2;num++)
{
write_date(xq2[num]);
delay(1);
}
break;
case 3: for(num=0;num<2;num++)
{
write_date(xq3[num]);
delay(1);
}
break;
case 4: for(num=0;num<2;num++)
{
write_date(xq4[num]);
delay(1);
}
break;
case 5: for(num=0;num<2;num++)
{
write_date(xq5[num]);
delay(1);
}
break;
case 6: for(num=0;num<2;num++)
{
write_date(xq6[num]);
delay(1);
}
break;
case 7: for(num=0;num<2;num++)
{
write_date(xq7[num]);
delay(1);
}
break;
}
}

/*************寫年月日函數**************/
void write_nyr(uchar date,uchar add)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}

/*************寫時分秒函數**************/
void write_sfm(uchar date,uchar add)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x88+add);
write_date(0x30+shi);
write_date(0x30+ge);
}

/*****************鍵盤掃描*****************/
void keyscan()
{
uchar keynum;
if(key1==0)
{
delay(5);
if(key1==0)
{
while(!key1);
delay(5);
while(!key1);
keynum++;
TR0=0;
if(keynum==1)
{
//TR0=0;
write_com(0x8D);
write_com(0x0f);

}
if(keynum==2)
{
//TR0=0;
write_com(0x8B);
write_com(0x0f);
}
if(keynum==3)
{
//TR0=0;
write_com(0x89);
write_com(0x0f);
}
if(keynum==4)
{
//TR0=1;
write_com(0x95);
write_com(0x0f);
}
if(keynum==5)
{
//TR0=1;
write_com(0x85);
write_com(0x0f);
}
if(keynum==6)
{
//TR0=1;
write_com(0x83);
write_com(0x0f);
}
if(keynum==7)
{
//TR0=1;
write_com(0x81);
write_com(0x0f);
}
if(keynum==8)
{
//TR0=1;
write_com(0x80);
write_com(0x0f);
}
if(keynum==9)
{
TR0=1;
keynum=0;
//write_com(0x95);
write_com(0x0c);
}
}
}
if(keynum==1)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
miao++;
if(miao==60)
miao=0;
write_sfm(miao,5);
write_com(0x8D);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
miao--;
if(miao==-1)
miao=59;
write_sfm(miao,5);
write_com(0x8D);
}
}
}
if(keynum==2)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
fen++;
if(fen==60)
fen=0;
write_sfm(fen,3);
write_com(0x8B);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
fen--;
if(fen==-1)
fen=59;
write_sfm(fen,3);
write_com(0x8B);
}
}
}
if(keynum==3)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
shi++;
if(shi==24)
shi=0;
write_sfm(shi,1);
write_com(0x89);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
shi--;
if(shi==-1)
shi=23;
write_sfm(shi,1);
write_com(0x89);
}
}
}
if(keynum==4)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
xq++;
if(xq==8)
xq=1;
write_xq(xq);
write_com(0x95);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
xq--;
if(xq==0)
xq=7;
write_xq(xq);
write_com(0x95);
}
}
}
if(keynum==5)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
ri++;
if(ri==31)
ri=1;
write_nyr(ri,5);
write_com(0x85);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
ri--;
if(ri==0)
ri=30;
write_nyr(ri,5);
write_com(0x85);
}
}
}
if(keynum==6)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
yue++;
if(yue==13)
yue=1;
write_nyr(yue,3);
write_com(0x83);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
yue--;
if(yue==0)
yue=12;
write_nyr(yue,3);
write_com(0x83);
}
}
}
if(keynum==7)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
nian++;
if(nian==100)
nian=0;;
write_nyr(nian,1);
write_com(0x81);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
nian--;
if(nian==-1)
nian=99;
write_nyr(nian,1);
write_com(0x81);
}
}
}
if(keynum==8)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
gwnian++;
if(gwnian==100)
gwnian=0;
write_nyr(gwnian,0);
write_com(0x80);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
gwnian--;
if(gwnian==-1)
gwnian=99;
write_nyr(gwnian,0);
write_com(0x80);
}
}
}
}

/************主函數********************/
void main()
{
uint num;
led_en_port = 0;/*關閉發光二極體顯示*/
sled_en_port = 0;/*關閉數碼管顯示*/
gwnian=20;
nian=9;
yue=11;
ri=28;
xq=6;
shi=23;
fen=58;
miao=45;
init(); //12864液晶初始化;

write_com(0x80);//設置初始顯示的坐標;
for(num=0;num<8;num++) /******在第一行顯示製作人*******/
{
write_date(table[num]);
delay(100);
}
write_com(0x93); //第二行的初始坐標;
for(num=0;num<6;num++) /**********在第二行顯示江向陽*******/
{
write_date(table1[num]);
delay(100);
}
write_com(0x88);//第三行的初始坐標
for(num=0;num<16;num++) /******在第三行顯示製作時間*******/
{
write_date(table2[num]);
delay(100);
}
for(num=50;num>0;num--) ///延時,第一屏的顯示時間 ;
delay(50000);
TMOD=0x01; //定時器0工作方式1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=0X01;
ET0=0X01;
TR0=0X01;
write_com(0x01);//清屏;
// delay(5);
// write_com(0x01);
write_com(0x80); //寫入初始的年月日數據(2009-11-28);
write_date('2');
write_date('0');
write_date('0');
write_date('9');
write_com(0x83);
write_date('1');
write_date('1');
write_com(0x85);
write_date('2');
write_date('8');
write_com(0x95);
for(num=0;num<2;num++) //寫入星期函數(周六);
{
write_date(xq6[num]);
}
write_com(0x89); //寫入初始的時分秒函數(23:58:45);
write_date('2');
write_date('3');
write_com(0x8B);
write_date('5');
write_date('8');
write_com(0x8D);
write_date('4');
write_date('5');
write_com(0x82);
for(num=0;num<2;num++) //固定顯示『年』
{
write_date(table31[num]);
delay(1);
}
write_com(0x84);
for(num=0;num<2;num++) //固定顯示『月』
{
write_date(table32[num]);
delay(1);
}
write_com(0x86); //固定顯示『日』
for(num=0;num<2;num++)
{
write_date(table33[num]);
delay(1);
}
write_com(0x92); //固定顯示『星期』
for(num=0;num<4;num++)
{
write_date(table4[num]);
delay(1);
}
write_com(0x8A); //固定顯示'時'
for(num=0;num<2;num++)
{
write_date(table51[num]);
delay(1);
}
write_com(0x8C); //固定顯示'分'
for(num=0;num<2;num++)
{
write_date(table52[num]);
delay(1);
}
write_com(0x8E); //固定顯示'秒'
for(num=0;num<2;num++)
{
write_date(table53[num]);
delay(1);
}
write_com(0x98); //固定顯示'當前溫度:20.3'
for(num=0;num<14;num++)
{
write_date(table6[num]);
delay(1);
}

/***************顯示溫度字元命令****************/
write_com(0x64); //開啟擴展指令顯示;
write_com(0x9f); //設置顯示地址 ;
write_date(0xA1); //顯示的字元編碼地址;
write_date(0xE6);
write_com(0x66); //關閉擴展功能;

while(1)
{
keyscan;
}
}
void timer0() interrupt 1
{
uchar count;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==18)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
ri++;
xq++;
if(xq==8)
{
xq=1;
}
if(ri==31)
{
ri=1;
yue++;
if(yue==13)
{
yue=1;
nian++;
if(nian==100)
{
nian=0;
gwnian++;
if(gwnian==100)
gwnian=0;
write_nyr(gwnian,0);
}
write_nyr(nian,1);
}
write_nyr(yue,3);
}
write_xq(xq);
write_nyr(ri,5);
}
write_sfm(shi,1);
}
write_sfm(fen,3);
}
write_sfm(miao,5);
}

}

⑼ 單片機C語言編程簡易數字電子時鍾

#include <AT89X52.h>
unsigned char X=10,sec,flag;
unsigned char key[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 數碼管顯示數字表
unsigned char key2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned char key1[]={0,0,0,0};//key1[0]=9 key1[1]=1 key1[2]=2 key1[3]=3
void delay02s(void);
void dislplay(void);
void dislplay1(void);
void tim1(void);
void main()
{

tim1();
while(1)
{
if(flag==0) dislplay();
else dislplay1();
}
}

void time1(void) interrupt 3
{
TR1=0;
X=X-1;
if(X==0)
{
flag=flag+1;
if(flag==2)
{
flag=0;
sec=sec+1;

if(sec==60)
{
sec=0;
key1[3]=key1[3]+1;
if(key1[3]==10);
{
key1[3]=0;
key1[2]=key1[2]+1;
if(key1[2]==6)
{
key1[2]=0;
key1[1]=key1[1]+1;
if(key[0]!=2)
{
if(key1[1]==10)
{
key1[1]=0;
key1[0]=key1[0]+1;
}
}
if(key[0]==2)
{
if(key[1]==4)
{
key1[1]=0;
key1[0]=0;
}
}
}
}
}
}
X=10;
}

TL1=0xb0;
TH1=0x3c;
TF1=0;
TR1=1;
}

void tim1(void)
{
TMOD =0X10;
TL1=0xb0;
TH1=0x3c;
EA=1;
ET1=1;
TR1=1;
}

void dislplay(void)
{
P2=0xfe;
P0=key[key1[0]];
delay02s();
P2=0xfd;
P0=key[key1[1]];
delay02s();
P2=0xfb;
P0=key[key1[2]];
delay02s();
P2=0xf7;
P0=key[key1[3]];
delay02s();
}
void dislplay1(void)
{
P2=0xfe;
P0=key[key1[0]];
delay02s();
P2=0xfd;
P0=key2[key1[1]];
delay02s();
P2=0xfb;
P0=key[key1[2]];
delay02s();
P2=0xf7;
P0=key[key1[3]];
delay02s();
}
void delay02s(void)
{
unsigned char i,j,k;
for(i=2;i>0;i--)
{
for(j=15;j>0;j--) //198
{
for(k=25;k>0;k--)//248
{
;
}
}

}
}
我空間還有其他的 http://user.qzone.qq.com/615543707/infocenter?ptlang=2052&ADUIN=615543707&ADSESSION=1276219802&ADTAG=CLIENT.QQ.2653_Mysrv.0

閱讀全文

與單片機電子表編程實例相關的資料

熱點內容
pr怎麼壓縮文件大小 瀏覽:859
查看oracle字元集命令 瀏覽:175
鋰電池增加密度 瀏覽:657
linux用戶密碼忘記 瀏覽:240
gb壓縮天然氣 瀏覽:633
圖片拼接不壓縮app 瀏覽:668
我的世界如何編程 瀏覽:84
vue反編譯代碼有問題 瀏覽:948
linuxshell字元串連接字元串 瀏覽:51
androidviewpager刷新 瀏覽:438
python編程計算平均分 瀏覽:678
加密數字貨幣市值查詢 瀏覽:692
時尚商圈app怎麼樣 瀏覽:584
stacklesspython教程 瀏覽:138
用命令行禁用135埠 瀏覽:212
linux防火牆編程 瀏覽:627
pdf閱讀器刪除 瀏覽:979
考研人如何緩解壓力 瀏覽:822
買電暖壺哪個app便宜 瀏覽:505
洛克王國忘記伺服器了怎麼辦 瀏覽:782