/*********************************************************************************************/
/* 我的思路是这样的:一个51的MCU+一个4位数码管+一个74LS138译码器+12M晶振.完成一个计秒和分的 */
/*计时器。设置两个按键:开始和复位其中开始键可以开始计时,又可以暂停计时,再按一次,又接着计 */
/*时。反正就是开始—暂停—开始—暂停—接着计时,只要不按复位。我想让它初始画面只显示一个0,先*/
/*计时秒,到10秒以上在选通第三位数码管,到1分钟以上在选通第二位数码管,(其中第二位数码管的H */
/*段必须亮,作用是区分——分钟和秒钟),到10分钟以上在选通第一位数码管。就像这样显示顺序 */
/* 0 ——0秒 */
/* 10 ——10秒 */
/* 19 ——19秒 */
/* 1.30 ——1分30秒 */
/* 9.00 ——9分0秒 */
/* 10.00 ——10分0秒 */
/* 60.59 ——60分59秒 */
/*循环计时。复位键清0 ,重新按开始键计时开始。复位键我用硬件复位电路了. */
/*********************************************************************************************/
#include<reg52.h> //头头
#define uchar unsigned char
#define uint unsigned int
sbit P32=P3^2; //外中断0
uchar code duma[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x6d,0x73,0x78,0xdc,0x50};//段选:0123456789sptar
uchar code dumapoint[]=
{0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带点的段选:0123456789
uchar code weima[]=
{0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7}; //我的位选:我用前4个数码管
void display(uchar); //显示声明
uchar cnt,sec,min,flag; //变量声明
uint num;
//=======================
void delay(uint i) //毫秒延时函数
{
uint a,b;
for(a=i;a>0;a--)
for(b=121;b>0;b--);
}
//=======================
void gate() //中断控制函数
{
TMOD=0x01; //T0定时方式
TH0=(65536-50000)/256; //初值50毫秒
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //T0中断允许位
TR0=1; //开定时器
IT0=0; //外中断T0
EX0=1; //外中断允许位
PX0=1; //外中断高优先级
}
//=======================
void main() //主函数
{
char x;
gate(); //中断控制
while(1) //这里我写的很笨方法,可想了好久,
{ 算法不简练,希望朋友们不吝赐教.
if(cnt==20){sec++;num++;cnt=0;} //秒增加
if(sec==60){min++;sec=0;} //分增加
if(min==60)min=0; //封顶一个小时
if(num<10){x=0;} //先让秒个位亮
if(num>=10){x=1;} //再让秒个十位亮
if(num>=60){x=2;} //再让分个位亮和秒位亮
if(num>=600){x=3;} //再4位都亮
if(num==3600){num=0;} //一个小时封顶
display(x);
}
}
//========================
void time0() interrupt 1 //计时器0中断
{
TH0=(65536-50000)/256; //初值
TL0=(65536-50000)%256;
cnt++; //加数
}
//========================
void ie0() interrupt 0 //外中断0
{
delay(10);
if(!P32)
TR0=~TR0; //停止计时
flag=TR0; //开关
while(!P32)
{
switch(flag)
{
case 0: P2=duma[10]; //这个键按下去显示stop
P1=weima[0];
delay(4);
P2=duma[12];
P1=weima[1];
delay(4);
P2=duma[0];
P1=weima[2];
delay(4);
P2=duma[11];
P1=weima[3];
delay(4);
break;
case 1: P2=duma[10]; //这个键按下去显示start
P1=weima[0];
delay(4);
P2=duma[12];
P1=weima[1];
delay(4);
P2=duma[13];
P1=weima[2];
delay(4);
P2=duma[14];
P1=weima[3];
delay(4);
break;
default:break;
}
}
}
//========================
void display(char x) //显示函数
{
switch(x)
{
case 0:P2=duma[sec%10]; //主要是显示个位
P1=weima[3];
delay(4);
break;
case 1:P2=duma[sec%10]; //显示十位和个位
P1=weima[3];
delay(4);
P2=duma[sec/10];
P1=weima[2];
delay(4);
break;
case 2:P2=duma[sec%10]; //显示百十个位
P1=weima[3];
delay(4);
P2=duma[sec/10];
P1=weima[2];
delay(4);
P2=dumapoint[min%10];
P1=weima[1];
delay(4);
break;
case 3:P2=duma[sec%10]; //显示千百十个位
P1=weima[3];
delay(4);
P2=duma[sec/10];
P1=weima[2];
delay(4);
P2=dumapoint[min%10];
P1=weima[1];
delay(4);
P2=duma[min/10];
P1=weima[0];
delay(4);
break;
default:break;
}
}
接着玩串口通信
不是 ,是快餐餐牌我买彩票从来都没中过!
恩 有点复杂,还可以跟简单一点的。。。
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |