单片机用3个按键控制android 60秒定时器,通过2个数码管显示。按下s2启动(p3.2),s3

请使用支持脚本的浏览器!
该日志尚未公开,你暂时不能查看。博主可在此
不如去逛逛吧。
网易公司版权所有&&&51单片机简单计算器用数码管显示
51单片机简单计算器用数码管显示
是用51hei单片机开发板 电路图详见:&&的数码管部分, 用2个74hc573 锁存,p0口作为数据口 ,p3.6和p3.7分别是段和位的锁存端口.
#include&reg51.h&
#define uchar unsigned char
#define uint unsigned int
sbit dula=P3^6;//573段选使能
sbit wela=P3^7;//573位选使能
sbit beep=P3^4;//蜂鸣器
uchar temp,//按键变量
//加,减,乘,除,标志位
long int num1,num2,//num1与num2是2个要运算的变量,res是结果
uchar aa,//aa 2个运算数标志位 dis 2个运算数与结果标志
uchar code table[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管段码
uchar code weixuan[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//数码管位码
void delay(unsigned char i)//延时
uchar j,k;
&&for(j=i;j&0;j--)
& & for(k=125;k&0;k--);
void bee()//蜂鸣器
beep=0;& && &&&
delay(255);
delay(255);
beep=1;& && &&&
key_scan()//按键检测
& &temp=P1;
& &temp=temp&0xf0;
& &if(temp!=0xf0)
& &&&delay(10);
& &&&if(temp!=0xf0)
& && & temp=P1;
& && & switch(temp)
& && && &case 0xee:
& && && && &&&key=0;
& && && && &&&
& && && &case 0xde:
& && && && &&&key=1;
& && && && &&&
& && && &case 0xbe:
& && && && &&&key=2;
& && && && &&&
& && && &case 0x7e:
& && && && &&&key=3;
& && && && &&&
& && &&&while(temp!=0xf0)
& && && & temp=P1;
& && && & temp=temp&0xf0;
& &temp=P1;
& &temp=temp&0xf0;
& &if(temp!=0xf0)
& &&&delay(10);
& &&&if(temp!=0xf0)
& && & temp=P1;
& && & switch(temp)
& && && &case 0xed:
& && && && &&&key=4;
& && && && &&&
& && && &case 0xdd:
& && && && &&&key=5;
& && && && &&&
& && && &case 0xbd:
& && && && &&&key=6;
& && && && &&&
& && && &case 0x7d:
& && && && &&&key=7;
& && && && &&&
& && &&&while(temp!=0xf0)
& && && & temp=P1;
& && && & temp=temp&0xf0;
& &temp=P1;
& &temp=temp&0xf0;
& &if(temp!=0xf0)
& &&&delay(10);
& &&&if(temp!=0xf0)
& && & temp=P1;
& && & switch(temp)
& && && &case 0xeb:
& && && && &&&key=8;
& && && && &&&
& && && &case 0xdb:
& && && && &&&key=9;
& && && && &&&
& && && &case 0xbb:
& && && && &&&key=10;
& && && && &&&
& && && &case 0x7b:
& && && && &&&key=11;
& && && && &&&
& && &&&while(temp!=0xf0)
& && && & temp=P1;
& && && & temp=temp&0xf0;
& &P1=0xf7;
& &temp=P1;
& &temp=temp&0xf0;
& &if(temp!=0xf0)
& &&&delay(10);
& &&&if(temp!=0xf0)
& && & temp=P1;
& && & switch(temp)
& && && &case 0xe7:
& && && && &&&key=12;
& && && && &&&
& && && &case 0xd7:
& && && && &&&key=13;
& && && && &&&
& && && &case 0xb7:
& && && && &&&key=14;
& && && && &&&
& && && &case 0x77:
& && && && &&&key=15;
& && && && &&&
& && &&&while(temp!=0xf0)
& && && & temp=P1;
& && && & temp=temp&0xf0;
void Init()//初始化
P0=table[1];
void dis_play(long int nm)//显示函数
uchar a1,a6;//a1位段选变量,a6为位选变量
if(shu==0)
& &&&dula=1;
P0=table[1];
for(a6=0;a6&6;a6++)
a1=shu%10;//shu%10 shu比10小a1=shu本身
if(shu!=0)
shu=shu/10;//shu/10 shu比10小 shu为0
P0=table[a1];
& && && &&&dula=1;
P0=weixuan[a6];
void display()//显示选择函数,dis 0或1显示运算数,dis为2显示结果
switch (dis)
& &&&case 0:{
dis_play(num1);
& &&&case 1:{
dis_play(num2);
& && && && &&&case 2:{
dis_play(res);
& &}& && &&&
void shanshuo()//数码管闪烁
delay(255);
void check()//运算函数
if(key!=16)
if(key&=10)
switch (key)
& &&&case 10:Init();&&// CE
& &&&case 11:{
& &switch (fun)//加,减,乘,除选择标志位
& &&&case 0:res=num1+num2,dis=2;//加法
& &&&case 1:res=num1-num2,dis=2;//减法
& &&&case 2:res=num1*num2,dis=2;//乘法
& &&&case 3:res=num1/num2,dis=2;//除法
& &&&case 12:fun=0,aa=1,shanshuo();& &// +
& &&&case 13:fun=1,aa=1,shanshuo();& &// -
case 14:fun=2,aa=1,shanshuo();& &// *
& &&&case 15:fun=3,aa=1,shanshuo();& &// /
switch (aa)//运算变量赋值标志位
& &&&case 0:{
num1=num1*10+//把按键检测到的值赋给num1运算变量1& && &&&
& &&&case 1:{
num2=num2*10+//把按键检测到的值赋给num2运算变量2
void main()
key_scan();
display();
发表评论:
TA的最新馆藏[转]&一个利用中断来实现计时停止与启动的问题 - 单片机论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
一个利用中断来实现计时停止与启动的问题
22:20:57  
请各位高手看下红色部分的代码。
我主要问题是,在键盘扫描时,如果按了“停止”(TR0=0)或“启动(TR0=1)“,在中断时,又会被”TR0=0“或”TR0=1“覆盖。实现不了停止与启动。
我感觉在中断里面放置key_scan()的“启动与暂停”有些问题,貌似不可以这么设置,但我想不到如何设置。
所以想请教各位大神用什么方法可以解决此问题。&&初学单片机,请各位多多指教,非常感谢。
#include &reg51.h&
//变量定义:
code unsigned char Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//表:共阳数码管 0-9
unsigned char GeW& &
unsigned char ShiW& &
unsigned char BaiW& &
unsigned char QianW
//中断次数
//引脚定义:& & & &
//P3作为键盘控制时间显示
sbit S2=P3^2;&&//P32设置为 启动计时& &&&
sbit S3=P3^3;&&//P33设置为 停止计时& &&&
sbit S4=P3^4;&&//P34设置为 个位加1& && &
sbit S5=P3^5;&&//P35设置为 十位加1& && & & & & && &&&
sbit S6=P3^6;&&//P36设置为 百位加1
sbit S7=P3^7;&&//P37设置为 千位加1
//P1作为数码管位选信号
sbit SMG_q = P1^0;& & & & //定义数码管阳级控制脚(千位)
sbit SMG_b = P1^1;& & & & //定义数码管阳级控制脚(百位)
sbit SMG_s = P1^2;& & & & //定义数码管阳级控制脚(十位)
sbit SMG_g = P1^3;& & & & //定义数码管阳级控制脚(个位)
sbit Sound = P1^5;&&//定义蜂鸣器控制脚
//函数声明:
void delay(unsigned int timer); //数码管扫描延时
void DisplayGeWei(unsigned char G);//个位显示函数
void DisplayShiWei(unsigned char S); //十位显示函数
void DisplayBaiWei(unsigned char B); //百位显示函数
void DisplayQianWei(unsigned char Q);//千位显示函数
void delay60ms(void);//键盘消抖延时
void key_scan(void);//键盘扫描
void main()
& & & & TMOD=0x01;& & & & & & & & //设置定时器1为模式一,即16位计算模式
& & & & TH0=()/256;& & & & //给计数寄存器赋值,50毫秒时间
& & & & TL0=()%256;
& & & & EA=1;& & & & & & & & //开启总中断
& & & & ET0=1;& & & & & & & & //开启定时器0中断
& & & & TR0=1;& & & & & & & & //启定定时器0
& & GeWei=0;& && & & & //初始化
& & ShiWei=0;& &
& & BaiWei=0;& &
& & QianWei=0;
& & & & tt=0;
& & & & while(1)
& & & && &&&if(tt==20)
& & & && &&&{& & & & & & & & & & & & //20*50ms定时时间为1秒
& & & & & & & && & tt=0;
& & & & & & & && & GeWei++;& & & & //计数变量加1
& & & && && &&&if(GeWei&9)
& & & & & & & && & {
& & & & & & & && && & GeWei=0;
& & & & & & & && && & ShiWei++;}
& & & & & & & && & if(ShiWei&9)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && &
& & & & & & & && & {& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &&&
& & & & & & & && && & ShiWei=0;
& & & & & & & && && & BaiWei++;}
& & & & & & & && & if(BaiWei&9)
& & & & & & & && & {
& & & & & & & && && & BaiWei=0;
& & & & & & & && && & QianWei++;}
& & & & & & & && & if(QianWei&9)& & & && &
& & & & & & & && & {& &
& & & & & & & && && & GeWei=0;
& & & & & & & && && & ShiWei=0;
& & & & & & & && && & BaiWei=0;
& & & & & & & && && & QianWei=0;}
& & & & & & & && &&&if(QianWei==9&BaiWei==9&ShiWei==9&GeWei==9){
& & & & & & & && && & Sound=0;}
& & & & & & & && &&&else
& & & & & & & && && & Sound=1;
& & & && & }& & & &
& && &&&DisplayGeWei(GeWei);
& & & && &&&DisplayShiWei(ShiWei);
& && &&&DisplayBaiWei(BaiWei);
& && &&&DisplayQianWei(QianWei);
//中断函数
void timer() interrupt 1
& & TR0=0;
& & & & tt++;
& & & & key_scan();& && && && && &//执行键盘扫描
& & & & TH0=()/256;& & //定时器T0高四位赋值
& & & & TL0=()%256;& & //定时器T0低四位赋值
& & & & TR0=1;
//键盘扫描函数
void key_scan(void)
& &&&P3=0& &//将P3置高电平
& & & &&&if((P3&0xff)!=0xff)& && && &//p3与自身与,如果不为原来的,则说明有键按下
& & & &&&{
& & & & & & & & delay60ms();& && && &//延时60ms再检测
& & & && &&&if((P3&0xff)!=0xff)& && && &//确实有键按下
& & & && &&&{
& & & & & & & &&&/*if(S2==0)& & & & //如果是S2按下
& & & & & & & && && &TR0=1;& & & & & & & & //启动计时
& & & & & & & && & if(S3==0)& & & & //如果是S3按下
& & & & & & & && && &TR0=0;& & & & & & & & //停止计时*/
& && && &&&if(S4==0)& && &//如果是S4键按下
& & & && && && & GeWei++;& &//个位加1
& & & & & & & && & if(S5==0)& && &//如果是S5键按下
& & & & & & & & & & & &&&ShiWei++;& & //十位加1
& & & & & & & && & if(S6==0)& &&&//如果是S6键按下
& & & & & & & & & & & &&&BaiWei++;& && &//百位加1
& & & & & & & && & if(S7==0)& &&&//如果是S7键按下
& & & & & & & && && &QianWei++;& & & & & & & & //千位加1
& && &&&}& & & &
& & & &&&}
//显示个位
void DisplayGeWei(unsigned char G)
& &SMG_g=0;& && &&&//P1.3引脚输出低电平,个位点亮
& &P0=Tab[G%10];& &&&
& &delay(500);
& &SMG_g=1;& &&&//熄灭个位&&
//显示十位& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && &
void DisplayShiWei(unsigned char S)
& &SMG_s=0;& &//P1.2引脚输出低电平,十位点亮
& &P0=Tab[S%10];
& &delay(500);
& &SMG_s=1;& &//熄灭十位
//显示百位
void DisplayBaiWei(unsigned char B)
& &SMG_b=0;& && &&&//P1.1引脚输出低电平,百位点亮
& &P0=Tab[B%10];& &
& &delay(500);
& &SMG_b=1;& &&&//熄灭百位
//显示千位
void DisplayQianWei(unsigned char Q)
& &SMG_q=0;& && &&&//P1.0引脚输出低电平,千位点亮
& &P0=Tab[Q%10];& &
& &delay(500);&&
& &SMG_q=1;& &&&//熄灭千位
//键盘扫描延时消抖
void delay60ms(void)
& & unsigned char i,j;
& & for(i=0;i&200;i++)
& & & & for(j=0;j&100;j++)
& & & && & ;
//动态扫描延时
void delay(unsigned int timer)
{& & & & & & & &
& & & & while(timer--)
& & & && & ;
22:44:49  
我也很关注这个问题,各位大师帮忙。。。。。谢谢
23:00:04  
你中断函数里面key_scan();这个语句后面有TR0=1;因此你设置他暂停是没有用的。设置退出key_scan()后TR0的值又被置1了不起作用。
23:29:35  
回帖奖励 +2
路过看看啊& && && && && && &&&
00:14:51  
你中断函数里面key_scan();这个语句后面有TR0=1;因此你设置他暂停是没有用的。设置退出key_scan()后TR0的值 ...
是的,这个问题我一直很纠结。但如何设置停止与启动,我很困惑。请指点迷津
08:19:02  
回帖奖励 +2
为什么不用两个定时器?
08:19:55  
或者把启动停止做成外部中断
12:03:15  
或者把启动停止做成外部中断
高见!我尝试看看,非常感谢!
高级工程师
12:51:09  
回帖奖励 +2
看看先,有空就解决& && && && && &
11:19:58  
是的,这个问题我一直很纠结。但如何设置停止与启动,我很困惑。请指点迷津
主函数设置一个标志位变量bit flag。当启动按键按下时flag=1,停止按键按下时flag=0.
中断上面将tt++;改为if(flag)t++;
这样就能现实按键控制时间启动或停止,但是中断是一直运行的,一直扫描按键。
14:10:06  
主函数设置一个标志位变量bit flag。当启动按键按下时flag=1,停止按键按下时flag=0.
中断上面将tt++;改为 ...
哈哈,按照您的指点,我实现了题目要求! 太感谢您啦!
通过此例,我知道了汇编与C语言在单片机里面的区别。
以下是我的理解,希望能帮助后来人。
假如我用汇编的话,那个flag标志应该相当于在汇编里面开辟一个字节单元存储标志位,在C里面由于是高级语言,自动完成了。在这里,不能对TR0直接操作,会互相覆盖的。
真的非常感谢您的帮助!
15:04:48  
学汇编能更好的理解单片机里面的内部结构,程序是怎样运行的。而C是高级语言,使用更方便。好多人一上来就学C,个人觉得学过汇编更有利于以后发展。不需要太深入,但至少得懂一点。
20:59:27  
学汇编能更好的理解单片机里面的内部结构,程序是怎样运行的。而C是高级语言,使用更方便。好多人一上来就 ...
嗯,受教了。
为了帮助中国物联网产品开发企业具备更好的国际和全局视野,电子发烧友网将于日在深圳主办【第三届中国IOT(物联网)大会之产业发展高峰论坛】,为全球物联网供应链上关键企业高管和产品开发人员提供一个最权威和全面的交流平台,使得中国物联网产品制造商能够尽快以全球市场眼光来定位和开发产品。
美国高官内华达财政部长施瓦泽在接受新浪科技独家专访时,称“乐视是庞氏骗局”-庞氏骗局是对金融领域投资诈骗的称呼。乐视也是拆东墙补西墙,到处拢钱(借钱或要投资)。就和庞氏骗局模式相同。
Powered by

我要回帖

更多关于 单片机60秒倒计时程序 的文章

 

随机推荐