单片机的独立按键学习,实现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单片机学习19-简易秒表
前面几篇我们说到了 LED灯,数码管,按键等内容,按键和数码管组合可以设计出简易秒表。
硬件组成:单片机最小系统+数码管显示电路+3个按键
功能:一个开始键,一个暂停键,一个复位键。数码管显示的精度是00:00--59:99
仿真图:
程序:
程序内容比较多,详细的参考源代码
源代码:
#include<reg52.h> //头文件
#define uint unsigned int
#define uchar unsigned char
uchar qian;
uchar bai;
uchar shi;
uchar ge;
//共阴数码管0-F 编码表
uchar smg_dm[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,};
uchar smg_dm1[]={0xbf,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,}; //0. 1. 2.----9.段码表
uchar smg_wm[]={0Xef,0Xdf,0xbf,0x7f}; //位选
uchar Display_buffer[4]={0,0,0,0}; //数码管显示缓存
sbit key1=P2^0; //开始键
sbit key2=P2^1; //暂停键
sbit key3=P2^2; //复位键
void delay_ms(uint z) //延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void key(void)
{
if(key1==0)
{
delay_ms(10);
if(key1==0)
{
TR0=1;
}
while(!key1);
}
if(key2==0)
{
delay_ms(10);
if(key2==0)
{
TR0=0;
}
while(!key1);
}
if(key3==0)
{
delay_ms(10);
if(key3==0)
{
TR0=0;qian=0;bai=0;shi=0;ge=0;
}
while(!key1);
}
}
void msg_display(void)
{
uchar i;
Display_buffer[0]=qian;
Display_buffer[1]=bai;
Display_buffer[2]=shi;
Display_buffer[3]=ge;
for(i=0;i<=3;i++)
{
if(i==1)
{
P2=smg_wm[i];//选位码
P1=smg_dm1[Display_buffer[i]];//选段码
delay_ms(5);
//P2=0XFF; //消影仿真这句加不加都一样
}
else
{
P2=smg_wm[i];//选位码
P1=smg_dm[Display_buffer[i]];//选段码
delay_ms(5);
//P2=0XFF; //消影
}
}
}
void main()
{
TMOD=0X01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
while(1)
{
key();
msg_display();
}
}
void time0() interrupt 1
{
uchar num;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
num++;
if(num==1)
{
num=0;
ge++;
if(ge==10)
{
ge=0;
shi++;
if(shi==10)
{
shi=0;
bai++;
if(bai==10)
{
bai=0;
qian++;
if(qian==6)
{
qian=0;
}
}
}
}
}
}
仿真结果:
相关问答
单片机 如何 按键 中止-ZOL问答你的其他12个按键也可以使用中断来处理,只是把那个暂停键设为级别最高,不管什么情况下改建按下就到该键的子程序运行(注意此时要关闭中断功能、只是判断该暂停键...
51 单片机 , 按键 控制流水灯程序,懂的进!八个LED灯与 单片机 P1口...[最佳回答]假如,你的程序在执行key_scan();是触发了两次中断导致num>20,你的显示函数将永远被跳过,你应该写成if(num>20)��{���num=0;���display();�.....
单片机 控制音乐播放怎么 暂停 ?main里面用一个无限循环,每次播放一点,检验一个全局标志如果标志被置为1,则停止播放,如果标志为零,就继续播放。中断里只需要把这个标志置为1或者0就可以实...
按下 按键 key灯亮x秒后停止的c语言怎么编写?像你这种按键程序因为单片机速度非常快,在你按一下按键时,单片机已经循环了很多次程序。因此这样就会导致,当你按下时,其实k一直==0一直在执行动作。所...
单片机 怎么控制水泵开关?单片机可以通过控制继电器的开关,来控制水泵的启停。首先,需要将水泵的电源接入继电器的通电端,然后将水泵的控制线接入继电器的控制端。接下来,通过单片机...
单片机 用按键控制步进电机按下正转松开反转! 单片机按键 按下时步进电机正转松开时反转,按第二个按?我只能提示一下,由于时间关系楼主你也要动脑子吧,从左至右流动就是正转,停纸法也有其他),进入中断就是停止了(这个没有要求,右至左流动就是反转了(这相当...
单片机 程序烧录后如何 暂停 运行或者消除已烧录程序?消除烧录到单片机的力的程序只能用新的数据覆盖,比如可以全0或全1数据下载到单片机。消除烧录到单片机的力的程序只能用新的数据覆盖,比如可以全0或全1数据下...
基于51 单片机 的游戏程序设计1.基本功能实现如下游戏规则:(1)...[最佳回答]你的功能都可帮实现的
51 单片机 怎么停止中断?51单片机可以采用三种方式停止中断:第一种:在中断使能寄存器ⅠE/IEH中禁止要停止的中断,例如想停止串口收发中断,就将IE寄存器中的ES位清零。第二种:切断...
单片机 控制交流电机正反转的C语言程序, 暂停 怎么办 - m18vzr...暂停代码,把控制电机输出口全置0这个很简单,我教你怎么玩,下面是思路和方式思路:有三个输入,分别是一个按钮、两个霍尔传感器(也就是接近开关),我...