单片机的独立按键学习,实现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;
}
}
pic单片机之中断程序(附实例)
什么是中断程序呢?
形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章。烤地瓜这件事就好比中断程序,他中断了你看文章这件事。在程序方面来说 当CPU在执行一个程序的时候,突然产生了中断事件CPU就去执行中断程序了,当执行完成后CPU又回来执行原先的程序。
中断事件
什么是中断事件,就是引起中断的事件。对于单片机来说这些事件是多种多样的。比如 说一个按键按下,一定的时间到了,一串数据发送完毕,或接收完一个数据。
讲到中断不得不讲讲和中断相对的 查询。其实不管是按键按下 还是 时间到,还是数据发送完毕,这些事实上都可以用查询的方式办到。比如 你是经理 如果你想知道属下任务完成了没有 一种方式就是去询问属下,任务完成没有。早上没完成,下午在问。下午没完成第二天再问。。。。一直到完成为止 这种方式就相当于查询的方式,另一种就是然属下完成任务好直接汇报,在下属执行任务的期间你无需去打挠下属,当下属任务完成后就第一时间向你汇报,这种方式就好像中断。
查询方式:缺点就是可能会大量浪费CPU的时间,不断去查询。如果事情不多还好,可是一旦事情多了会明显感到运行速度变慢。
中断方式:可以用在对时间和响应速度有要求的场合。
具体有哪些事件会引起中断 可以看
1,中断控制寄存器INTCON
2,外设中断允许寄存器 PIEX 注 : X可以是1 2 3 4.。。。不同型号的单片机数目不同
3,外设中断标志寄存器 PIRX 注: X可以是1 2 3 4.。。。不同型号的单片机数目不同
INTCON 中断控制寄存器讲解:
1开启或关闭 全体的中断功能(GIE)
2开启或关闭全体外设的中断功能(PEIE)外设就是在外设中断允许/标志寄存器里面所写的设备。
3开启一些中断事件。
PIEX 与 PIRX 是相互对应的如:当把PIE1的TMR1IE设置为1 定时器timr1将开启中断。等到TMR1定时器溢出后,则会在PIR1的TMRIF将为1,并且执行中断程序。
实例讲解:
我们把上一讲的《PIC单片机之定时器》中的实例修改成中断方式 实现 每隔 50MS亮起LED,每隔50MS灭掉LED。
/*开发环境MPLAB X IDE 芯片型号PIC16LF1823*/
#include
__CONFIG(FOSC_INTOSCWDTE_OFFPWRTE_ONMCLRE_OFFCP_ONCPD_OFFBOREN_ON
CLKOUTEN_OFFIESO_ONFCMEN_ON);//这个要放到上一行去
__CONFIG(PLLEN_OFFLVP_OFF) ;
#define LED LATA5
void init_fosc(void)
{
OSCCON= 0x68;
}
void init_gpio(void)
{
PORTA = 0;
LATA = 0;
ANSELA = 0;
TRISAbits.TRISA5=0;
}
void init_timer0(void)
{
OPTION_REG=0x87;
}
void interrupt isr(void)//中断程序,interrupt是个关键字说明该函数,是中断函数。
{
LED = ~LED;//改变LED的状态
INTCONbits.TMR0IF=0;//清零中断标志位 如果在离开中断程序前没有清零,程序将不停的中断。
TMR0=61;//给TMR0付初始值61 ,开始下一个50ms计时做准备。
//中断函数结束 返回主函数。哪里来回 回那里去,也就是回到主函数的while(1);处
}
int main(int argc, char** argv)
{
init_fosc();
init_gpio();
init_timer0();
INTCONbits.GIE=1; //开启总中断
INTCONbits.TMR0IF=0;//清零TMR0溢出中断标志位
INTCONbits.TMR0IE=1;//开启TMR0溢出中断
TMR0=61;
while(1);//主函数 在此什么都没做一直在死循环。但等到50ms时间到了TMR0将会溢出,程序就会跳到void interrupt isr(void)处执行。
}
我帮大家理清下中断初始设置大致的步骤
1 ,开启总中断,开启外设中断。INTCONbits.GIE=1; INTCONbits.PEIE=1;其实即使没用到外设开启也无妨。
2 ,清楚相应中断的标志位。如INTCONbits.TMR0IF=0;
3 ,开启相应中断。如INTCONbits.TMR0IE=1;
中断函数/程序 中要注意的就是 清零相应的中断标志位 如INTCONbits.TMR0IF=0; 否则单片机会认为中断未被执行 则一直中断。
相关问答
单片机 ,伟福软件,如何将这些内部数据存储器 清零 ,是否有什么...这是程序运行出来的RAM状况。不是你点击面板能清除的。只有修改程序才能让相...没有,应该用复位或者用代码来清零。有用(0)回复精品应用推荐新浪微博天气...
单片机 的复位方法有几种-ZOL问答单片机复位的方法有看门口溢出复位、复位脚低电平复位(51单片机为高电平复位)、VDD低电压导致单片机复位、上电复位。上面电路属於RST高电平复位51单片机是高...
单片机 为什么不能 清零 R0?累加器和位清零可用CLR(如:CLRA,,,CLRC)或者直接赋0值(如:mova,#00h).还有一种清零就是系统复位,赋位到初始的状态,单片机的RST脚。(当然此种复位有...累...
mcs-51 单片机 的中断源是如何 清零 的?mcs-51单片机的中断源是通过在中断服务程序中对相应的中断源进行清零来实现的。1.该单片机内部有多种中断源,这些中断源通过不同的寄存器控制开启或关闭。当...
单片机 编程中SETB P2.0 CLR P2.0是什么意思?为什么先置位又 清零 啊为什么不直接CLR?所谓的软件清零,就是要在程序中,通过指令把该位清零。所谓置位就是把该位置1,清零就是把该位置0。单片机中置位一般指是置1,即高电平;置0是置低电平,一般说...
中断标志驱动手动 清零 的是?不知道你说的单片机是什么系列的.下面是51单片机的汇编和C语言清除中断的语句。汇编:CLRIE0;清除外部中断INT0请求标志CLRIE1;清除外部中断INT1请求标...
单片机 秒和分钟的进位是如何实现的?在单片机中,秒和分钟的进位通常通过计时器中断来实现。计时器会以固定的时间间隔触发中断,比如每秒触发一次。当计时器中断触发时,单片机会执行中断服务程序,...
单片机 24小时时钟,怎么利用按键实现控制时钟时间暂停和回复时间走动呢?时间一般采用定时器T0或T1,清零TR0、TR1可实现暂停,置位TR0、TR1可恢复时间一般采用定时器T0或T1,清零TR0、TR1可实现暂停,置位TR0、TR1可恢复
如何将 程序 烧录到 单片机 里?将程序烧录到单片机中,通常需要以下步骤:1.准备好烧录器和所需的软件:一般来说,需要使用专门的编程器和相应的烧录软件。可以根据自己所用的单片机型号来选...
51 单片机 秒表 程序[回答]这个程序写的太乱了执行的顺序是先定义秒等一些寄存器,然后清零,并定义定时初值,开显示。再打开定时器中断,定时到,中断秒寄存器加1,加到10时清...