【单片机】51单片机

寄存器

定时值存储寄存器

TH0/TH1/TH2TL0/TL1/TL2
0000000000000000
  • TH0/TH1/TH2 为定时器存储寄存器高八位(High)
  • TL0/TL1/TL2 为定时器存储寄存器低八位(Low)
  • 当THX-TLX 为 1111111111111111 即 十进制数65535时,再加1,定时器存储寄存器溢出TFX被置为1 (X为0,1,2)
  • 定时器存储寄存器在非中断模式下溢出后,需要手动将TFX置为0,THX和TLX需要手动重新赋值 (X为0,1,2)
  • 定时器存储寄存器在中断模式下溢出后,系统将自动将TFX置为0,THX和TLX需要手动重新赋值 (X为0,1,2)

TCON 定时器控制寄存器

76543210
符号TF1TR1TF0TR0IE1IT1IE0IT0
复位值00000000
  • TFX 值为1时,代表定时值存储寄存器已溢出;值为0时,代表定时值存储寄存器未溢出 (X为0,1,2)
  • TRX 值为1时,代表启动定时器X ;值为0时,代表停止定时器X (X为0,1,2)

TMOD 定时器模式寄存器

76543210
符号GATE (T1)C/T (T1)M1 (T1)M0 (T1)GATE (T0)C/T (T0)M1 (T0)M0 (T0)
  • GATE 一般用来测量外部信号脉冲宽度,在使用定时器时一般将其置0,GATE 为1时,可使得定时器不受INTX值的影响 (X为0,1)
  • C/T 定时器或计数器的选择位,C/T值为1计数器功能,C/T值为0定时器功能
  • 模式0,M1=0M0=0时,兼容8048单片机的13位定时器,THX的8位和TLX的5位组成一个13位的定时器 (X为0,1)
  • 模式1,M1=0M0=1时,THX和TLX组成一个16位的定时器 (X为0,1)
  • 模式2,M1=1M0=0时,常用来产生串口通信的波特率,8位自动重载模式,定时器溢出后THX重载到TLX中 (X为0,1)
  • 模式3,M1=1M0=1时,禁用定时器1,定时器0变成两个8位定时器 (X为0,1)

IE 中断使能寄存器

76543210
符号EA-ET2ESET1EX1ET0EX0
复位值0-000000
  • EA 值为1时,中断使能(使用中断服务的总开关)
  • ET2 值为1时,使能定时器T2中断
  • ES 值为1时,使能串口中断
  • ET1 值为1时,使能定时器T1中断
  • EX1 值为1时,使能外部中断1
  • ET0 值为1时,使能定时器T0中断
  • EX0 值为1时,使能外部中断0

中断查询

中断函数编号中断名称中断使能位中断标志位中断向量地址优先级
0外部中断0EX0IE00x00031(最高)
1T0中断ET0TF00x000B2
2外部中断1EX1IE10x00133
3T1中断ET1TF10x001B4
4UART中断ESTI/RI0x00235
5T2中断ET2TF2/EXF20x002B6
  • T0,T1为定时器,T2为8052的特有的定时器
  • UART为串口
  • 中断向量地址=中断函数编号*8+3
相关推荐
51单片机IINA219 测电流电压和功率。 #include "LCD1602\LCD1602.h" #include "INA219_DRV\INA219_DRV.h" #include "common\common.h" #define TH0_VALUE 0x4B #define TL0_VALUE 0xFF //50ms per cycle. sbit BtnRefreshMode = P3^2; bit RefreshRate = 0; //0: 0.8s, 1: 0.5s bit RefreshFlag = 0; void RefreshData(void) { unsigned short BusVolt, Current, Power; unsigned short OffsetCurrent, OffsetPower; BusVolt = INA219_GetBusVolt(); PrintChar(0, 0, BusVolt/10000+48); PrintChar(1, 0, (BusVolt000)/1000+48); PrintChar(3, 0, (BusVolt00)/100+48); PrintChar(4, 0, (BusVolt0)/10+48); PrintChar(5, 0, BusVolt+48); OffsetCurrent = (BusVolt >> 9) + 2; //Gather statistics of the measured current under various voltage conditions when no load is connected to the output port. Use Excel to do curve fitting. Current = INA219_GetCurrent(); if(Current > OffsetCurrent) Current -= OffsetCurrent; else Current = 0; PrintChar(10, 0, Current/1000+48); PrintChar(12, 0, (Current00)/100+48); PrintChar(13, 0, (Current0)/10+48); PrintChar(14, 0, Current+48); OffsetPower = ((BusVolt >> 3) * OffsetCurrent)/125 + 6; Power = INA219_GetPower(); if(Power > OffsetPower) Power -= OffsetPower; else Power = 0; PrintChar(0, 1, Power/10000+48); PrintChar(1, 1, (Power000)/1000+48); PrintChar(3, 1, (Power00)/100+48); PrintChar(4, 1, (Power0)/10+48); PrintChar(5, 1, Power+48); } int main(void) { INA219_Init(); LCD_Init(); TMOD &= 0xF0; TMOD |= 0x01; //Timer 0 works in Mode 1 (16-bit Timer). TH0 = TH0_VALUE; TL0 = TL0_VALUE; PrintChar(2, 0, '.'); PrintChar(6, 0, 'V'); PrintChar(11, 0, '.'); PrintChar(15, 0, 'A'); PrintChar(2, 1, '.'); PrintChar(6, 1, 'W'); PrintStr(10, 1, "R:0.8s"); RefreshData(); EA = 1; //Global Interrupt Enable ET0 = 1; //Timer 0 Interrupt Enable TR0 = 1; //Enable Timer 0. while(1) { if(RefreshFlag) { RefreshData(); RefreshFlag = 0; } if(BtnRefreshMode == 0) //If the
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页