找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6919|回复: 6
打印 上一主题 下一主题
收起左侧

[原创]成功啦! 这个小玩意终于搞出来了 哈哈!

[复制链接]
跳转到指定楼层
楼主
ID:16555 发表于 2009-10-26 17:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

/*********************************************************************************************/
/* 我的思路是这样的:一个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编辑过]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:17294 发表于 2009-10-27 09:07 | 只看该作者
就是秒表吧
回复

使用道具 举报

板凳
ID:16249 发表于 2009-10-29 16:37 | 只看该作者
背景是彩票吗?
回复

使用道具 举报

地板
ID:16555 发表于 2009-10-29 17:40 | 只看该作者
以下是引用wangning5503在2009-10-29 16:37:03的发言:
背景是彩票吗?图片点击可在新窗口打开查看

不是 ,是快餐餐牌我买彩票从来都没中过!

回复

使用道具 举报

5#
ID:19900 发表于 2009-12-10 15:12 | 只看该作者
不是我打击你,你的程序很烦琐,虽然能实现所设想的功能,应该改进一下。祝你成功!
回复

使用道具 举报

6#
ID:17233 发表于 2009-12-27 21:32 | 只看该作者

恩   有点复杂,还可以跟简单一点的。。。

回复

使用道具 举报

7#
ID:17923 发表于 2009-12-27 21:54 | 只看该作者
如果是新手的话我建议一定要思维缜密,越详细越好,等到成熟了以后可以不断再改进程序。 个人意见
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表