51微控制器之時鐘(C語言和彙編兩種方式實現)

2021-06-07 14:40:25 字數 4367 閱讀 5446

1.c語言實現

#include

typedef  unsigned char   uint8;

typedef  unsigned int    uint16;

typedef  unsigned long   uint32; 

//共陽數碼管0-9

uint8 number = ;

uint8 a[6];

uint8 sec=0;

uint8 minutes=34;

uint8 hours=12;

uint16 count=0;//用於記錄中斷次數,因為我設定每次中斷時1ms,所以count=1000時就是一秒

sbit enled1 = p1^4;

sbit enled2= p1^3;

sbit addr0 = p1^0;

sbit addr1 = p1^1;

sbit addr2 = p1^2;

//首先3/8解碼器使能

void en()

//定時器初始化

void init_timer()

//中斷初始化

void init_interrupr()

void display()

}void ov_interrupt() interrupt 3

if(60==minutes)

if(24==hours)

a[0] = sec%10;

a[1] = sec/10%10;

a[2] = minutes%10;

a[3] = minutes/10%10;

a[4] = hours%10;

a[5] = hours/10%10;

}if(count%3==0)

display();//進行重新整理,這裡我們可以看出,我們是3ms進行一次重新整理,這樣就不會占用太多cpu了

}void main()

2.組合語言實現

org 00h

ljmp start

org 1bh //定時器1中斷入口位址

ljmp ov_interrupt 

org 30h

start:  

mov r6,#00//用於記錄產生幾次中斷,如果(r6)=100,說明為1s

mov r0,#00//記錄秒

mov r1,#00//記錄分

mov r2,#12//記錄時

mov dptr,#numb

lcall en

lcall init_interrupt

lcall init_timer

here: sjmp here  //好比是乙個while(1)迴圈

;首先3/8解碼器使能

en:clr p1.4

setb  p1.3

ret//中斷初始化

init_interrupt:

setb ea

setb et1

ret//定時器初始化

init_timer:

/*orl  tmod,#0x10 

anl  tmod,#0x0df*/ //這兩技能說明工作在t1的方式1  且計時有tr1啟動

mov tmod,#10h

mov  th1,#0xdc

mov  tl1,#0x00//乙個10ms的定時初值設定

setb tr1  //讓定時器1開始工作

retdelay:  

mov 20h,#6                 ;乙個機器週期

dd2:

mov 30h,#10               ;乙個機器週期

dd1:

mov 40h,#6                ;乙個機器週期

djnz 40h,$                    ;2個機器週期

djnz 30h,dd1                   ;2個機器週期

djnz 20h,dd2                   ;個機器週期

retdisplay:

d0:

/*mov   a,r0

mov   b,#10

div   ab*/

mov   a,50h

movc  a,@a+dptr 

clr   p1.0

clr   p1.1

clr   p1.2

mov   p0,a

lcall delay

d1:mov   a,51h

movc  a,@a+dptr

setb  p1.0

clr   p1.1

clr   p1.2

mov   p0,a 

lcall delay

d2:mov   a,60h

movc  a,@a+dptr

clr   p1.0

setb  p1.1

clr   p1.2

mov   p0,a

lcall delay

d3:mov   a,61h

movc  a,@a+dptr

setb  p1.0

setb  p1.1

clr   p1.2

mov   p0,a

lcall delay

d4:mov a,70h

movc  a,@a+dptr

clr   p1.0

clr   p1.1

setb  p1.2

mov   p0,a

lcall delay

d5:mov   a,71h

movc  a,@a+dptr

setb  p1.0

clr   p1.1

setb  p1.2

mov   p0,a

lcall delay

ret//tf1=1中斷服務程式

ov_interrupt:

push dph

push dpl

push psw

mov  th1,0xdc //乙個0.01s的定時初值設定

mov  tl1,0x00

inc r6 //中斷計數器加1,當(r6)=100,就是1s

clr tf1//  這裡因為我們進行了中斷,所以硬體會自動清零,所以不一定要加上這一句

cjne r6,#100,return  //判斷中斷計數器r6,如果不為100則轉移到here

mov r6,#00h

led0:

inc r0//數碼管0數字加1

cjne r0,#60,return   //判斷(r0),如果不為60,轉移到return,

//否則為60就變為0,然後轉移到led1

mov r0,#00h

led1:

inc r1//數碼管0數字加1

cjne r1,#60,return   //判斷(r1),如果不為60,轉移到return,

//否則為60就變為0,然後轉移到led2

mov r1,#00h

led2:

inc r2//數碼管0數字加1

cjne r2,#24,return   //判斷(r2),如果不為24,轉移到return,

//否則為24就變為0,然後轉移到lreturn

mov r2,#00h

//如果執行這一句說明超過了999999

return:    

pop psw

pop dpl

pop dph

dis:

mov a,r6   //當r6為偶數,那麼就進行display,也就是每兩次中斷(20ms)進行一次重新整理

anl a,#01h

cjne a,#0,quit

//計算秒的個位和十位 

mov   a,r0

mov   b,#10

div   ab

mov   50h,b

mov   51h,a

//計算分的個位和十位 

mov   a,r1

mov   b,#10

div   ab

mov   60h,b

mov   61h,a

//計算時的個位和十位 

mov   a,r2

mov   b,#10

div   ab

mov   70h,b

mov   71h,a

call display

quit:

reti

//0-9

numb:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h 

end  

PIC微控制器之時鐘設定

什麼時鐘?首先我們先講講什麼是時鐘。時鐘就是微控制器的心臟。每跳動一下。整個微控制器的各個電路就同步的動作一下。就好像我們做廣播體操的時候 廣播上喊的節拍1234 2234 3234。然後我們全部的同學就按照這個節奏進行乙個個動作。節拍越快我們動作越快。節拍越慢我們動作的越慢。內部時鐘和外部時鐘?p...

微控制器之時鐘工作原理

時鐘電路就是乙個振盪器,給微控制器提供乙個節拍,微控制器執行各種操作必須在這個節拍的控制下才能進行。因此微控制器沒有時鐘電路是不會正常工作的。時鐘電路本身是不會控制什麼東西,而是你通過程式讓微控制器根據時鐘來做相應的工作。在mcs 51微控制器片內有乙個高增益的反相放大器,反相放大器的輸入端為xta...

51微控制器之流水燈(C語言和彙編兩個版本)

c語言 include typedef unsigned char uint8 sbit addr0 p1 0 sbit addr1 p1 1 sbit addr2 p1 2 sbit enled0 p1 4 sbit enled1 p1 3 uint8 i uint8 j void delay u...