单片机的独立按键学习,实现60秒循环数字的启动暂停与清零
想要学习单片机必须要准备单片机开发板一块,和单片机C语言版本的书籍,我会把每天录制视频的源代码到头条,并且录制相同文章名字视频到西瓜视频,如果你再学习独立按键这一块有不明白的地方可以点开我的头像,进入我的主页,点击视频观看学习。
目前视频录制了9个左右,没学过的结合书本,结合我的视频,都可以学会。
话不多说先上今天的仿真效果图:
然后下面是本仿真图的源代码:如果有错误,请大神指教。
#include<reg52.h> //头文件,把芯片的数据地址编译成C语言可以调用的句子。
#define uchar unsigned char //宏定义 把后面的长句 给他们一个新定义,实现同样的功能。
#define uint unsigned int //宏定义 把后面的长句 给他们一个新定义,实现同样的功能。
sbit dula=P2^0; //把p2.0给他一个新名字叫dula 用于数码管锁存器段选位置
sbit wela=P2^1;//把p2.1给他一个新名字叫wela 用于数码管锁存器位选的位置
sbit key1=P3^0; //同样的,给按键1和按键2分别找两个串行口来对接。
sbit key2=P3^1;
uchar code table[]={0x3f,0x06,0x5b,0x4f, //定义的一个数码管的编码表。
0x66,0x6d,0x7d,0x07, //阴极数码管
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint); //延时子程序
void display(uchar,uchar); //显示子程序
void keyscan(); //独立按键子程序
uchar num,shi,ge,num1; //定义四个无符号字符
void main() //主程序
{
TMOD=0x01; //中断确定工作方式,和选择定时器0
TH0=(65536-45872)/256; //装初值,
TL0=(65536-45872)%256; //对这一块不太明白的,可以看我上一个视频
EA=1; //开启总的中断
ET0=1; ////开启定时器/计数器寄存器中断 开启中断具体定时器中断
while(1) //循环式判断,
{
keyscan(); // 调用按键子程序,对按键子程序进项不断地扫描
display(shi,ge);//调用显示子程序,对显示子程序,进行不断地刷新显示
}
}
void display(uchar shi,uchar ge) //显示子函数,并且调用形式参数
{
P0=0x00; //为了在仿真电路让P0口没有其他的数据来影响段选显示的/阴极数码管,高电平有效。让数码管变得干净。
dula=1; //锁存器开
P0=table[shi]; 把十位的数字送到P0
dula=0; //锁存器关闭// 段选位置
P0=0XFF; //低电平有效,让位选的位置变得干净。
wela=1; //位选锁存器开启。//低电平有效。
P0=0xfe;//送入位选的 选位。
wela=0; 位选锁存器关闭。
delayms(5); /延时5毫秒。
P0=0x00;
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd; //选择数码管的第一个位置 来显示数字
wela=0;
delayms(5);
}
void delayms(uint xms) //延时子程序
{
uint i,j; //定义两个无符号字符
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan() //今天的重点:按键扫描子程序
{
if(key1==0) //判断按键1 有没有按下
{
delayms(10); //延时10毫秒,延时去抖动
if(key1==0) //在判断一次按键1有没有按下
{
while(!key1); //等待按键释放,如果没有释放那么按键始终等于0,也就是低电平。按键按下去了,
TR0=~TR0; //定时器的开启与关闭,开启 开始计数,关闭就会暂停
}
}
if(key2==0) //判断按键2是否按下
{
delayms(10); //延时去抖动
if(key2==0) //再次判断
{
num1=0;// num1是送给数码管的数值,0-60根据定时器变化的值。
while(!key2);//判断按键2时候松开,没有松开始终等于低电平。
}
}
}
void T0_time() interrupt 1 //定时器的子程序
{
TH0=(65536-45872)/256; //重装初值,这一块如果听不懂,可以去看上个视频。
TL0=(65536-45872)%256;
num++;
if(num==20) //定时器每次50毫秒,这里加个20次的循环,用来凑足1秒钟。
{
num=0;
num1++;
if(num1==60) //给num1进行每一秒钟数值变化送数值。
num1=0;
shi = num1/10; //求模的数,送到shi
ge = num1%10;
}
}
51单片机定时器使用经验总结
单片机定时器的使用可以说非常简单,只要掌握原理,有一点的C语言基础就行了。要点有以下几个:
1. 一定要知道英文缩写的原形,这样寄存器的名字就不用记了。
理解是最好的记忆方法。好的教材一定会给出所有英文缩写的原形。
2. 尽量用形像的方法记忆。
比如TCON和TMOD两个寄存器各位上的功能,教程一般有个图表,你就在学习中不断回忆那个图表的形像。
3. TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)
定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。其格式为:其中低四位定义定时器/计数器C/T0,高四位定义定时器/计数器C/T1,各位的说明:
(1)GATE——门控制。
GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。
当INT0引脚为高电平时TR0置位,启动定时器T0;
当INT1引脚为高电平时TR1置位,启动定时器T1。
GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。
(2)C/T——功能选择位
C/T=0时为定时功能,C/T=1时为计数功能。
置位时选择计数功能,清零时选择定时功能。
(3)M0、M1——方式选择功能
由于有2位,因此有4种工作方式:
M1M0 工作方式 计数器模式 TMOD(设置定时器模式)
0 0 方式0 13位计数器 TMOD=0x00
0 1 方式1 16位计数器 TMOD=0x01
1 0 方式2 自动重装8位计数器 TMOD=0x02
1 1 方式3 T0分为2个8位独立计数器,T1为无中断重装8位计数器 TMOD=0x03
单片机定时器0设置为工作方式1为TMOD=0x01
这里我们一定要知道,TMOD的T是TIMER/COUNTER的意思,MOD是MODE的意思。至于每位上的功能,你只要记住图表,并知道每个英文缩写的原型就可以了。
在程序中用到TMOD时,先立即回忆图表,并根据缩写的单词原形理出每位的意义,如果意义不是很清楚,就查下手册,几次下来,TMOD的图表就已经在脑子里了。
8位 GATE位,本身是门的意思。
7位 C/T Counter/Timer
6位 M1 Mode 1
5位 M0 Mode 0
4. TCON: 定时器/计数器控制寄存器(TIMER/COUNTER CONTROL REGISTER)
TMOD分成2段,TCON控制更加精细,分成四段,在本文中只要用到高四段。
TF0(TF1)——计数溢出标志位,当计数器计数溢出时,该位置1。
(1)TR0(TR1)——定时器运行控制位
当TR0(TR1)=0 停止定时器/计数器工作
当TR0(TR1)=1 启动定时器/计数器工作
(2)IE0(IE1)——外中断请求标志位
当CPU采样到P3.2(P3.3)出现有效中断请求时,此位由硬件置1。在中断响应完成后转向中断服务时,再由硬件自动清0。
(3)IT0(IT1)——外中断请求信号方式控制位
当IT0(IT1)=1 脉冲方式(后沿负跳有效)
当IT0(IT1)=0 电平方式(低电平有效)此位由软件置1或清0。
(4)TF0(TF1)——计数溢出标志位
当计数器产生计数溢出时,此位由硬件置1。当转向中断服务时,再有硬件自动清0。计数溢出的标志位的使用有两种情况:采用中断方式时,作中断请求标志位来使用;采用查询方式时,作查询状态位来使用。注意记忆方法,理解单词原形,就绝对不会把TF和TR搞混。TF的F也就是溢出Over Flow的F。TR的R就是运行Run。默认是0不运行,当然要置1才运行。
5. STC单片机STC89C52RC定时器延时时间的计算
延时时间要根据晶振频率计算,不同板子可能有所不同。
时钟周期:
1/时钟源,在我现在这块板子上,晶振频率是11.0592M,也就是时钟周期是 1/11059200秒
机器周期:
一般51单片机是12个时钟周期,我的板子也就是 12/11059200秒
单次定时最长时间:
如果是16位的计数器,16位最大值是65535,共可计数65536次。基本的常数一定要记住,还要记住8位最大值是255,共可计数256次,还要记住8位上每位代表的数值。
12 * 65536/11059200 = 0.0711 s,也就是,71 ms内的定时可以单次定时就完成。如果定时时间超过71 ms,就要循环了。
一次定时需要几次机器周期:
计算公式:定时秒数/机器周期
比如我要定时1秒, 1/(12/11059200)= 921600次,16位计数器最大可计数65536次,921600次早就益出了。我们可以每次定时10 ms,循环100次就可以定时1秒了,1 s缩小100百倍就是10 ms, 也就是每次需要计数9216次。
确实计数器初始值:
定时10 ms时,如果计数器从0开始计数,我们就不知道什么时候到了9216次。所以应该计数了9216次,16位计数器最多计数95536次,然后就溢出,一溢出TCON的TF位就会置1,我们只要经常检测TF位就可以知道什么时候完成10ms的定时了。
计算公式:计数器初始值=最大计数次数 - 需要计数次数
如果定时10 ms,计数器的初始值就是 65536 - 9216
计算计数器的高位和低位:
16位的计数器,也就是两个8位组成,8位的最大计数次数是256。所以:
计数器高位 = 初始值/256
计数器低位 = 初始值%6
6.STC89C52RC单片机定时器示例代码:
相关问答
C51 单片机按键 控制定时闹钟 - 懂得纯粹用51做闹钟,需要有时钟芯片或者内部RTC功能,如果都没有,只通过定时器,你需要不断的给定时器做一些补偿,你要的是代码还是思路?请问还有代码吗
单片机 C语言 定时器 怎么调用-ZOL问答单片机中通过中断的方式来调用定时器。具体的调用方式可以参考通过如下程序:程序功能:利用定时器进行定时,实现每秒中led闪烁一次#include
程序延时,定时中断,定时查询.
8051 单片机定时器 计算器的门控信号G ATE设置为1时。定时器如何启动?设8051单片机定时器0的门控信号GATE设置为1,定时器0如何启动?1、设置TR0=1,但这时候是不启动的,因为还需要一个条件。2、给INT0引脚输入高电平,这时候才启...
利用51 单片机定时器 编写一个C语言程序,实现一个发光二极管定时亮、灭,要求亮一秒、灭一秒交替闪烁不?初始值为0,只只要启动定时器,定时器就开始工作,当计数溢出后,TF被置1,此时在程序中查询TF的状态,做相应的程序处理。一般建议用中断来做,查询方式会占用c...
单片机定时器 定时的时间肿么算?-ZOL问答51单片机,根据晶振频率,计算指令周期,设置定时器的分频,然后设置定时器的工作方式TMOD,最后设置初值TH0TL0比如用的XHZ的晶振,stc的单片机有3种模式(X/12)x/...
51 单片机定时器 一毫秒怎么写?假设晶振为12MHz,不用中断时程序语句如下:TMOD=0x01;//定时器0工作方式1TH0=(65536-1000)/256;//装入初值TL0=(65536-1000)%256;TF...
单片机 定时的时间怎么改变?定时器实质是计数器。当计数脉冲周期一定时,就有定时功能。雅帆用水桶给你打个比方吧!一、向上计定时数器举例当一个255毫升的烧杯,提前放入155毫升水后,...
单片机定时器 可以定时几次?单片机定时器可以定时多次,具体次数取决于定时器的配置和使用方式。定时器可以设置定时周期和计数值,当计数值达到设定值时,定时器会触发中断或产生特定的输出...
MCS-51系列 单片机 定时/计数器的定时功能和计数功能分别应用于什么场合?定时器和计数器本质上讲都是计数器,定时器使用机器时钟做计数源,因为机器时钟是稳定性好,时钟数就是时间,所以叫定时器。当计数器用时,使用的是外部输入的脉...