/*********************************************************************************************/ /* 我的思路是这样的:一个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; } }






接着玩串口通信
[此贴子已经被作者于2009-10-29 12:10:58编辑过]
|