单片机的独立按键学习,实现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;
}
}
单片机中断的学习,制作一个60秒循环的数码管。
89C52单片机 51系列。本来是录制视频给大家看得,但是大家都不爱看。没办法,就写文章宣传吧。话不多少先给大家效果,想学习的可以去本人主页视频区点击观看。有详细方法:
这是仿真软件模拟出来了,最近我的板子坏掉了。就先用仿真软件给大家模拟着。
下面程序源代码贴出来:#include<reg52.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
sbit dula=P2^0; //给锁存器段选位取个名字叫dula
sbit wela=P2^1; // g给锁存器位选 取个名字
uchar code table[]={0x3f,0x06,0x5b,0x4f, 数码管编码表 定义
0x66,0x6d,0x7d,0x07, //阴极数码管定义
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint); //延时子程序
void display(char,uchar); //显示子程序
Uchar num,shi,ge,bai,qian,yiwan,shiwan,baiwan,qianwan ,num1;
定义几个无符号字符数
void main() //主函数
{
TMOD=0x01; // 0000 0001 工作方式一 ,开启定时器
TH0=(65536-45872)/256; //初值填装
TL0=(65536-45872)%256; //初值填装
EA=1; //开启总的中断
ET0=1; //开启定时器/计数器寄存器中断
TR0=1; // 定时器开始工作。
while(1) // 判断是否为真,为真一直执行下面的程序//一直开着车
{
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;//为了在仿真电路让P0口没有其他的数据来影响段选显示的/阴极数码管,高电平有效。让数码管变得干净
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 T0_time() interrupt 1 //中断的主函数
{
TH0=(65536-45872)/256; //初值重装。计时器是不停止的。
TL0=(65536-45872)%256; //求余
num++; //加1循环的
if(num==20) //判断是否等于20次
{
num=0; //如果等于20 就变成0
num1++; //0,每次加一
if(num1==60)//判断是否为60
num1=0; // 把值重新变成0.
shi = num1/10; //求模运算 送到10位
ge = num1%10; //求余运算送到各位
}
}
相关问答
51 单片机 编程制作电子钟时间问题.后两位数码管显示到59后,直...[最佳回答]ucharsec=0,min=0,tnum;把它放到主函数里面看看,并且tnum=0