程序二:数字钟
#include <reg52.h>
sbit KEY1=P2^4;
sbit KEY2=P2^5;
sbit KEY3=P2^6;
sbit KEY4=P2^7;
sbit LED=P1^2;
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9
unsigned char StrTab[6]; //定义缓冲区
unsigned char minute=00,hour=00,second; //定义并且初始化值 00:00:00
bit sec=0;
void delay(unsigned int cnt)//延时函数
{
while(--cnt);
}
void Displaypro(void)
{
StrTab[0]=tab[hour/10]; //显示正常时间
StrTab[1]=tab[hour%10];
StrTab[2]=tab[minute/10];
StrTab[3]=tab[minute%10];
StrTab[4]=tab[second/10];
StrTab[5]=tab[second%10];
}
main()//主函数
{
TMOD |=0x01;//定时器0 10ms in 12M crystal 用于计时
TH0=0xd8;
TL0=0xf0;
ET0=1;
TR0=1;
TMOD |=0x10; //定时器1用于动态扫描
TH1=0xF8;
TL1=0xf0;
ET1=1;
TR1=1;
EA =1;
Displaypro();
while(1)//主循环
{
/////////////////////////////////////////////////////////////////
if(!KEY1) //按键1去抖以及动作
{
delay(10000);
if(!KEY1)
{
hour++;if(hour==24)hour=0; //正常时间 小时 加1
Displaypro();
}
}
if(!KEY2) //按键去抖以及动作
{
delay(10000);
if(!KEY2)
{
minute++;if(minute==60)minute=0;//分加1
Displaypro();
}
}
if(!KEY3) //按键去抖以及动作
{
delay(10000);
if(!KEY3)
{
minute--;if(minute==255)minute=59; //分减1
Displaypro();
}
}
if(!KEY4) //按键去抖以及动作
{
delay(10000);
if(!KEY4)
{
second++;if(second==60)second=0; //秒加1
Displaypro();
}
}
}
}
/* 定时中断1 */
void time1_isr(void) interrupt 3 using 0//定时器1用来动态扫描
{
static unsigned char num;
TH1=0xF8;//重入初值
TL1=0xf0;
switch (num){
case 0:P2=0|0xf0;P0=StrTab[num];break; //分别调用缓冲区的值进行扫描
case 1:P2=1|0xf0;P0=StrTab[num]|0x80;break;
case 2:P2=2|0xf0;P0=StrTab[num];break;
case 3:
{
P2=3|0xf0;
if(sec)
P0=StrTab[num]|0x80;
else
P0=StrTab[num];
break;
}
case 4:P2=4|0xf0;P0=StrTab[num];break;
case 5:P2=5|0xf0;P0=StrTab[num];break;
default:break;
}
num++; //扫描6次,使用6个数码管
if(num==6)
num=0;
}
/* 定时中断0 */
void tim(void) interrupt 1 using 1
{
static unsigned char count;//定义内部静态变量
TH0=0xd8;//重新赋值
TL0=0xf0;
count++;
if(count==20||count==70)
sec=~sec;
switch (count)
{
case 0:
case 20:
case 40:
case 60:
case 80:Displaypro(); //隔一定时间调用显示处理
break;
case 50:
default:break;
}
if (count==100)
{
count=0;
second++;//秒加1
if(second==60)
{
second=0;
minute++; //分加1
if(minute==60)
{
minute=0;
hour++; //时加1
if(hour==24)
hour=0;
}
}
}
}
谁能说出两个C51程序的区别
主函数和中断函数中都调用了Delay()就出现这个情况。去掉其中一个就没问题。因为结构以及RAM数量太少的原因,PIC低档8位单片在用C语言写程序时,函数的局部变量实际不是在数据栈上、而是直接放在全局RAM中的,这样当主程序跟中断服务程序调用同一个子程序的时候就会引起潜在的重入问题,所以编译器严格地...
单片机的C与计算机里的C区别问题
如果你学 C 语言只用于单片机,大可不用玩得太深。因为太复杂的应用,不是单片机能胜任的。如果是用于普通 windows 编程,那就得花点时间好好学学了。
请问大侠们c语言与c++有哪些区别。那个更适合单片机开发版编程用呢...
单片机肯定是用C语言。首先写单片机程序需要一个用来写程序以及编译的软件吧,纵观各个编译软件几乎没有支持C++的,平台决定了只能用C语言。两者的区别是在于C++是C语言的增强版,增加了面对对象的支持。对于单片机程序来说,都是面向过程的,不需要面对对象功能。对于如何记住字母,一个字 --写。多写就记...
如何理解这段单片机程序. 各位大侠,请解释一下。我搞不明白,为什么会这 ...
++c的意思就是c先自加1然后再进行运算,你的程序中,刚开始程序是不执行if语句里面的这些语句的 但是c要先加一然后再判断是不是比300大,知道第三百次到了,c值就变成300了,if语句的条件就满足,这时候才执行{ LedNumVal++ ; \/\/每隔300个扫描周期加一次 C =0; \/\/每隔300个扫描清零 } ...
那位大侠能帮我看看我写的单片机程序怎么没有返回值啊??
后面那两个这么没有在前面加key_jian==1 key_yidong==1,你这程序没判断按键是否松开,又没判断按键是否有按下,没判断是否松开可能发现不了错误,但不判断是否按下就是再次运行着程序,使返回值为1,。所以你说没有返回值是错的,其实已经返回了你的按键值,只不过被第二次的返回值给覆盖了。
单片机 汇编语言 两数比较大小
程序如下:CLR C ;先把进位位清零,以防误判 CJNE A,#data,no_equ ;不等则转到no_equ,相等则直接顺序执行 ... ;执行相等时的程序 no_equ:JC lower ;继续判断,小于则跳转到 lower,大于则顺序执行 ...lower:...END
单片机入门,急求高手大虾指教!!!
很多作为一个即将毕业的自动化专业本科生,至今还不知道单片机是这个专业的核心基础,难道不可悲吗?您的水平不高我完全心中有底,其实我只要求这些学生能够掌握单片机应用开发的基本技能,用汇编和C51 写过一些基本的程序,真正动手做过一些简单的项目,然后将自己做过的项目写成比较规范的文档。我想,这种形式的“自我介绍”...
...想问单片机程序中,0xfe与0xFE的区别?请大侠们指点。不甚感谢!!_百 ...
就是16进制嘛,一个代表前面 1111 1110 0xfe 一个代表1110 1111 0xef 0x是16进制的意思 抱歉,题目看错了,这两者没有区别,值都是 1111 1110
求助各位前辈,小弟在自学51单片机,想请大侠们赐一个小程序给我学习,万...
你这第一下就想玩这难度要大点,因这有个控制亮度的麻烦点,你最好先玩玩流水灯啊,数码管自动加数啊,(本以后你这中也要用的)完成后再来玩你这才会达到事半功倍的效果,这类程序 网上多的是,你可根据你想玩C语言还是玩汇编去找相应的下载....
怎么实现单片机多个函数功能同时执行
B:烧开水,洗衣服时监听水壶的声音,两件事执行完,打游戏;C:选择一个烧水开了会停止工作的电水壶,不要等了,用洗衣机洗衣服,打游戏;耗时:A最长,其次B,C最短。不同的工具占用人时间精力也是不同的,同理单片机周围外设选择不同,也会影响CPU占用时间;实例:要求:假如单片机要“同时”执行...