C51单片机学习笔记之定时器
生活随笔
收集整理的這篇文章主要介紹了
C51单片机学习笔记之定时器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡介
“定時器/計數器”說的是一個東西,因為它既能計時也能計數。是存在于單片機內部的一個獨立的硬件部分,依賴晶振產生固定的時間間隔,產生了一定量的固定時間間隔后會引發定時器中斷從而將其產生的時間信息傳送給由CPU執行的主程序中。
相關寄存器
TMOD寄存器:決定定時器/計數器的工作方式,C51單片機中一共有兩個16位定時器/計數器,分別為T1,T0。
| 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 符號 | T1 | T1 | T1 | T1 | T0 | T0 | T0 | T0 |
| GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
| GATE | C/T |
| 門控制位 | 定時器/計數器 |
| 0:僅受TCON的TR位控制。 1:由TR和外部中斷一起控制。 | 0:定時器。1:計數器 |
| M1 | M0 | 控制方式 |
| 0 | 0 | 方式0,為13位定時器/計數器 |
| 0 | 1 | 方式1,為16位定時器/計數器 |
| 1 | 0 | 方式2,8位初值自動重裝的8位定時器/計數器 |
| 1 | 1 | 方式3,僅適用于T0,分成兩個8位計數器,T1停止計數 |
TCON寄存器:控制啟動、關閉、標志其溢出和中斷情況
| 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 符號 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
| TF | TR |
| 溢出標志位 | 運行控制位 |
| 溢出時該位自動置1。中斷執行時硬件清0或軟件清0 | 置1開始計時,清0停止計 |
| TF0和TR0對應定時器0 | TF1和TR1對應定時器1。 |
| IE | IT |
| 外部中斷請求標志 | 外部中斷觸發方式選擇位 |
| IE0與IT0對應外部中斷0 | IE1與IT1對應外部中斷1 |
中斷具體見——C51單片機學習筆記之中斷系統
原理圖
?
?
代碼部分
實現一個秒表
/*數碼管部分*/ #include <REGX52.H> #include "delay.h" sbit U3=P2^0; sbit U4=P2^1; unsigned char DX[]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7F,0x6F,0X40};//???? char dx(unsigned int x) {unsigned char y;y=DX[x];return y; } void wx(unsigned char locaton) {switch(locaton){case 1:P0=0xfe;break;case 2:P0=0xfd;break;case 3:P0=0xfb;break;case 4:P0=0xf7;break;case 5:P0=0xef;break;case 6:P0=0xdf;break;case 7:P0=0xbf;break;case 8:P0=0x7f;break;}} void print(unsigned char x,y) {U3=1;P0=dx(x);U3=0;U4=1;wx(y);U4=0;delay();P0=0x00;}#ifndef __DigitalTube_h__ #define __DigitalTube_h__ void print(unsigned char x,y); char dx(unsigned int x); void wx(unsigned char locaton); #endif /*按鍵部分*/ #include <REGX52.H>void delay1() {unsigned int i;for(i=0;i<30000;i++); } unsigned char MatrixKey() {unsigned char KeyNumber;P1=0xFF;P1_0=0;if(P1_4==0) {delay1();while(P1_4==0);delay1();KeyNumber=1;}if(P1_5==0){delay1();while(P1_4==0);delay1();KeyNumber=2;}if(P1_6==0){delay1();while(P1_4==0);delay1();KeyNumber=3;}return KeyNumber; }#ifndef __MatrixKey_H__ #define __MatrixKey_H__unsigned char MatrixKey(); #endif?
/*延時部分*/ #include <REGX52.H> #include "intrins.h" void delay() { unsigned int i;for(i=0;i<200;i++); }#ifndef __delay_h__ #define __delay_h__ void delay(); #endif /*中斷部分*/ #include <REGX52.H> #include "delay.h" #include "DigitalTube.h" unsigned int time=0,num=0,num2=0,num3=0;void InitTimer0()//中斷初始化 {TMOD=0X01;TH0=(65535-50000)/256;//高八位TL0=(65535-50000)%256; //低八位EA=1;//中斷打開ET0=1;//定時器中斷打開TR0=1;//定時器打開 } void delay1() {unsigned int i;for(i=0;i<30000;i++); } void show() {while(1){print(num3/10,1);print(num3%10,2);print(10,3);P0=0x00;print(num2/10,4);print(num2%10,5);print(10,6);print(num/10,7);print(num%10,8);P1=0xFF;P1_0=0;if(P1_4==0) {delay1();while(P1_4==0);delay1();num++;}if(P1_5==0){delay1();while(P1_4==0);delay1();num2++;}if(P1_6==0){delay1();while(P1_4==0);delay1();num3++;}} } void exter1() interrupt 1 {TH0 = (65535-50000)/256;TL0 = (65535-50000)%256; time++;if(time==20){time=0; num++;} if(num==60){num=0;num2++;} if(num2==60){num2=0;num3++;}if(num3==24){num3=0;} }#ifndef __Time_h__ #define __Time_h__ void show(); void InitTimer0(); void MatrixKey(); #endif /*主函數*/ #include <REGX52.H> #include "DigitalTube.h" #include "Time.h" main() {InitTimer0();while(1){show();} }結論
? 這一章重點就是理解定時器/計數器的寄存器,能夠配置寄存器。代碼實現秒表的原理是——中斷時間是50毫秒,累計20次就是1秒,每累計20次就置0。
總結
以上是生活随笔為你收集整理的C51单片机学习笔记之定时器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 音频文件切割_适用于 Lin
- 下一篇: poi 导入处理手机号码