日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C51单片机学习笔记之定时器

發布時間:2023/12/29 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C51单片机学习笔记之定时器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

“定時器/計數器”說的是一個東西,因為它既能計時也能計數。是存在于單片機內部的一個獨立的硬件部分,依賴晶振產生固定的時間間隔,產生了一定量的固定時間間隔后會引發定時器中斷從而將其產生的時間信息傳送給由CPU執行的主程序中。

相關寄存器

TMOD寄存器:決定定時器/計數器的工作方式,C51單片機中一共有兩個16位定時器/計數器,分別為T1,T0。

76543210
符號T1T1T1T1T0T0T0T0
GATEC/TM1M0GATEC/TM1M0
GATEC/T
門控制位定時器/計數器

0:僅受TCON的TR位控制。

1:由TR和外部中斷一起控制。

0:定時器。1:計數器
M1M0控制方式
00方式0,為13位定時器/計數器
01方式1,為16位定時器/計數器
10方式2,8位初值自動重裝的8位定時器/計數器
11方式3,僅適用于T0,分成兩個8位計數器,T1停止計數

TCON寄存器:控制啟動、關閉、標志其溢出和中斷情況

76543210
符號TF1TR1TF0TR0IE1IT1IE0IT0
TFTR
溢出標志位運行控制位

溢出時該位自動置1。中斷執行時硬件清0或軟件清0

置1開始計時,清0停止計
TF0和TR0對應定時器0TF1和TR1對應定時器1。
IEIT
外部中斷請求標志外部中斷觸發方式選擇位
IE0與IT0對應外部中斷0IE1與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单片机学习笔记之定时器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。