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...