
51单片机定时器工作原理及用法 TMOD : 控制定时器的工作方式。8个bit,高四位 bit 控制 T1,、低四位 bit 控制 T0。因为定时器有4种工作方式;TMOD = 0x00(工作方式0),TMOD = 0x01(工作方式0),TMOD = 0x02(工作方式2),TMOD = 0x03(工作方式3)。以上是控制低4位的,所以是对应着T0。 TR0:T0定时器 使能开关,TR0 = 1,开始工作; =0停止工作。 ET0:T0定时器中断开关,定时时间一到,就会跑去中断程序。ET0=1,中断使能,=0失能。 EA : 中断总开关,你可以想象成电路的总电闸,EA=1,中断使能; =0,中断失能。 TH0,TL0 : T0定时器计数寄存器,组成16位的计数,0x0000--0xFFFF(0--65535),只要TH0TL0=0xFFFF(65535),程序就会跑去中断程序,在中断程序中,我们要重新给TH0,TL0重新赋值的。 假如说,我们定时50毫秒,TH0,TL0对应着什么值呢? 上面我们说了,TH0,TL0,组成的16位计数器计数范围是 0---65535 。50ms = 50 000us,我们只要让 TH0 TL0 从(65535 - 50000)开始计数,TH0,TL0就会不停的+1,直到TH0,TL0=65535,就是计数了50000次,时间就是过了50ms。我们只要在中
一般当程序比较大、功能比较繁多,需要进行结构化程序设计的时候,才会进行分层。分层的好处是可以将应用与硬件剥离,当硬件发生变更(移植,设计更改)时只需改动底层以及少量中间层;当需求发生变更时只需改动上层以及少量中间层。
底层一般是直接访问硬件的接口,以串口而言如寄存器 *** 作函数;中间层一般是在底层与上层之间进行数据及信息的转换,以串口而言如封包/拆包/消息产生/消息响应;上层一般面向应用,在很少考虑硬件实现的前提下以通用的方式实现所需的功能,以串口而言如printf。
分这么多层是为了不同程度的开发人员可以同期工作的原因。比如说,底层就雇佣一个特别熟悉芯片和硬件的人做,中间层大概要找比较熟悉应用的人来把硬件功能来做扩展,应用层就随便抓一把人来开发了。
这样,多个项目可以公用一个硬件层,有两到三组中间层的支持工程师,然后每个项目各有一组应用工程师就好了。51也可以这样做,这和效率无关,层做得好,执行效率不会影响很大,开发效率提高很多。
扩展资料:
单片机的应用:
1,通用专用:
这是按单片机适用范围来区分的。例如,80C51是通用型单片机,它不是为某种专用途设计的;专用型单片机是针对一类产品甚至某一个产品设计生产的,例如为了满足电子体温计的要求,在片内集成ADC接口等功能的温度测量控制电路。
2,线型应用:
这是按单片机是否提供并行总线来区分的。总线型单片机普遍设置有并行地址总线、数据总线、控制总线,这些引脚用以扩展并行外围器件都可通过串行口与单片机连接,另外,许多单片机已把所需要的外围器件及外设接口集成一片内,因此在许多情况下可以不要并行扩展总线,大大减省封装成本和芯片体积。
3,控制型应用:
这是按照单片机大致应用的领域进行区分的。一般而言,工控型寻址范围大,运算能力强;用于家电的单片机多为专用型,通常是小封装、低价格,外围器件和外设接口集成度高。 显然,上述分类并不是唯一的和严格的。例如,80C51类单片机既是通用型又是总线型,还可以作工控用。
单片机的编程语言有三种种:机器语言、汇编语言与高级语言。
机器语言是计算机能够看懂的语言。(形式为一段二进制代码)
汇编语言是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的 *** 作码,用地址符号或标号代替指令或 *** 作数的地址。
高级语言包括:C语言、BASIC语言和PL\M语言等。(现在一般使用C语言进行单片机编程,其他语言用作单片机编程较少)
5由于计算机只能看懂机器语言所以无论是汇编语言还是高级语言都需要经过编译成为机器语言才能够执行。
单片机的高级语言
51单片机支持三种高级语言,即PL/M,C和BASIC。C语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,并具有良好的程序结构,适用于各种应用的程序设计,是目前使用较广的单片机编程语言。
单片机的C语言采用C51编译器(简称C51)。有C51产生的目标代码短,运行速度高,所需存储空间小,符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言或PL/M51语言目标代码混合使用
#include<reg52h>
#include<INTRINSH>
//定义硬件接口
#define KEY P1
#define Key_State_0 0
#define Key_State_1 1
#define Key_State_2 2
#define unlock 1
#define lock 0
sbit IR_IN = P2^0;
sbit Key_1 = P2^7;
sbit Key_2 = P2^6;
sbit LED_1 = P1^7;
sbit LED_2 = P1^6;
sbit LED_3 = P1^5;
unsigned char key1_state,key2_state,test,data_1,for_data,test_data,study_led_open,study_led_close;
unsigned char key1_debounce_C,key2_debounce_C;
bit key1_debounce_flag,key2_debounce_flag,time_1ms_flag,test_bit,test_bit1,study_led_flag,study_open_flag,study_close_flag;
bit key1_debounce,key2_debounce;
unsigned int time_1s;
unsigned char data_H[8]={0};
unsigned char data_L[8]={0};
void delay1s(void)
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
_nop_();
}
void mcu_int(void)
{
TMOD = 0x11;
TH0 = 0xFC;
TL0 = 0x18;//定时1ms
EA = 1;
ET0 = 1;
TR0 = 1;
TH1 = 0x00;
TL1 = 0x00;
TR1 = 0;
EX0 = 1;
IT0 = 1;
LED_1 = 0;
LED_2 = 0;
LED_3 = 0;
}
void Key_1_Scan (void)
{
bit key_press;
key_press = Key_1;
switch(key1_state)
{
case Key_State_0:
if(!key_press)
{
key1_state = Key_State_1;
key1_debounce_flag = unlock;
}
break;
case Key_State_1:
if(key1_debounce==1)
{
key1_debounce = 0;
if(!key_press)
{
key1_state = Key_State_2;
}
else
{
key1_state = Key_State_0;
}
}
break;
case Key_State_2:
if(key_press)
{
key1_state = Key_State_0;
study_led_flag=1;
time_1s=0;//计数清零
test=0;
study_open_flag=1;
}
break;
}
}
void Key_2_Scan (void)
{
bit key_press;
key_press = Key_2;
switch(key2_state)
{
case Key_State_0:
if(!key_press)
{
key2_state = Key_State_1;
key2_debounce_flag = unlock;
}
break;
case Key_State_1:
if(key2_debounce==1)
{
key2_debounce = 0;
if(!key_press)
{
key2_state = Key_State_2;
}
else
{
key2_state = Key_State_0;
}
}
break;
case Key_State_2:
if(key_press)
{
key2_state = Key_State_0;
study_led_flag=1;
time_1s=0;//计数清零
test=0;
study_close_flag=1;
}
break;
}
}
void key(void)
{
Key_1_Scan ();
Key_2_Scan ();
}
void action (void)
{
if(test_bit1==1)
{
test_bit1=0;
for(for_data=7;for_data>=1;for_data--)
{
if(data_H[for_data]==0x04)
{test_data=test_data&0xfe;}
if(data_H[for_data]==0x09)
{test_data=test_data|0x01;}
test_data=test_data<<1;
}
test_data=test_data>>1;
if((test_data&0x0f)==0x00)
{
LED_1=1;
}
if((test_data&0x0f)==0x01)
{
LED_1=0;
}
if(test_data==study_led_open)
{
LED_2=1;
}
if(test_data==study_led_close)
{
LED_2=0;
}
if(study_close_flag==1)
{
study_close_flag=0;
study_led_close=test_data;
}
if(study_open_flag==1)
{
study_open_flag=0;
study_led_open=test_data;
}
}
}
void MCU_clock(void)
{
if(time_1ms_flag==1)
{
time_1ms_flag = 0;
time_1s++;
if(study_led_flag==1)
{
if((time_1s%200)==0)
{LED_3=!LED_3;}
}
if(time_1s==2000)
{
time_1s = 0;
study_led_flag=0;
LED_3=0;
test=0;
}
if(key1_debounce_flag==unlock)
{
key1_debounce_C++;
if(key1_debounce_C==15)
{
key1_debounce_C = 0;
key1_debounce_flag = lock;
key1_debounce = 1;
}
}
if(key2_debounce_flag==unlock)
{
key2_debounce_C++;
if(key2_debounce_C==15)
{
key2_debounce_C = 0;
key2_debounce_flag = lock;
key2_debounce = 1;
}
}
}
}
void main (void)
{
delay1s();
mcu_int();
while(1)
{
MCU_clock();
key();
action();
}
}
void EX0Interrupt(void) interrupt 0
{
if(test_bit==1)
{
data_H[data_1]=TH1;
data_L[data_1]=TL1;
TH1=0;
TL1=0;
data_1++;
if(data_1==8)
{
data_1=0;
test_bit=0;
test_bit1=1;
}
}
test++;
if(test==17)
{
test_bit=1;
TR1=1;
}
if(test==33)
{
test=0;
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0xFC;//1us
TL0 = 0x18;
time_1ms_flag = 1;
}
以上就是关于简述51单片机的工作原理全部的内容,包括:简述51单片机的工作原理、单片机程序里面,经常听说底层,中间层,应用层,什么意思 51单片机也需要这么分层吗、单片机编程语言一般有哪几种等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)