找回密码
 立即注册

QQ登录

只需一步,快速开始

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

4位数码管模仿电饭煲工作状态 单片机程序+Proteus仿真图

[复制链接]
跳转到指定楼层
楼主
每天做饭,电饭煲的4位数码管开始工作后都会动态流动,想了想思路,就写了这个代码,有个小问题,流动的速度不一致,1-实物是STC15W408A,仿真用的AT89C52,2-单个笔划的速度没改一致,1,实物的4位数码管是按自己的好走线方式焊的,没有按标准焊,所以代码和标准的不一样。
2,完整的代码包含很多,所以只上传数码管模仿电饭煲工作部分的代码。
另外,不知道仿真怎么做成小动态,所以没有办法在线预览,再进仿真看,哈,就是电饭煲在工作啦。

以下是代码部分
大概1K的ROM空间,如果有时间改改,应该能减少一半
思路大概来说,就是用数码管静态显示的方式,来显示任意的笔划。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)



单片机源程序如下:
void smgkj00()        //点亮最开始一点
{
         SMG3=0;        //开位选
         P1=0X04;delay(1800);        //延时
}

void smgkj01()
{
         SMG3=SMG2=0;        //开位选
         P1=0X04; delay(1800);        //延时
}

void smgkj02()
{
         SMG3=SMG2=SMG1=0;        //开位选
         P1=0X04; delay(1800);        //延时
}

void smgkj03()
{
         SMG3=SMG2=SMG1=SMG0=0;        //开位选
         P1=0X04; delay(1800);        //延时
}

void smgkj04()
{
        P1=0X04;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X04;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X04;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X04+0X01;          //显示右侧上一竖
        SMG0=0;        //开位选
        delay(5);
                SMG0=1;        //开位选
}


void smgkj05()
{
        P1=0X04;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X04;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X04;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X04+0X01+0X10;          //显示右侧上一竖
        SMG0=0;        //开位选
        delay(5);
                SMG0=1;        //开位选
}


void smgkj06()
{
        P1=0X04;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X04;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X04;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X04+0X01+0X10+0X40;          //显示右侧上一竖
        SMG0=0;        //开位选
        delay(5);
                SMG0=1;        //开位选
}


void smgkj07()
{
        P1=0X04;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X04;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X04+0X40;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X04+0X01+0X10+0X40;          //显示右侧上一竖
        SMG0=0;        //开位选
        delay(5);
                SMG0=1;        //开位选
}


void smgkj08()
{
        P1=0X04;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X04+0X40;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X04+0X40;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X04+0X01+0X10+0X40;          //显示右侧上一竖
        SMG0=0;        //开位选
        delay(5);
                SMG0=1;        //开位选
}


void smgkj09()
{
        P1=0X04+0X40;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X04+0X40;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X04+0X40;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X04+0X01+0X10+0X40;          //显示右侧上一竖
        SMG0=0;        //开位选
        delay(5);
                SMG0=1;        //开位选
}


void smgkj10()
{
        P1=0X04+0X40+0X80;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X04+0X40;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X04+0X40;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X04+0X01+0X10+0X40;          //显示右侧上一竖
        SMG0=0;        //开位选
        delay(5);
                SMG0=1;        //开位选
}


void smgkj11()
{
        P1=0X04+0X40+0X80+0X02;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X04+0X40;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X04+0X40;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X04+0X01+0X10+0X40;          //显示右侧上一竖
        SMG0=0;        //开位选
        delay(5);
                SMG0=1;        //开位选
}



//关闭
void smgkj00_0()
{
        P1=0X40+0X80+0X02;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X04+0X40;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X04+0X40;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X04+0X01+0X10+0X40;          //显示右侧上一竖
        SMG0=0;        //开位选
        delay(5);
                SMG0=1;        //开位选
}

void smgkj00_1()
{
        P1=0X40+0X80+0X02;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X40;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X04+0X40;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X04+0X01+0X10+0X40;          //显示右侧上一竖
        SMG0=0;        //开位选
        delay(5);
                SMG0=1;        //开位选
}



void smgkj00_2()
{
        P1=0X40+0X80+0X02;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X40;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X40;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X04+0X01+0X10+0X40;          //显示右侧上一竖
        SMG0=0;        //开位选
        delay(5);
                SMG0=1;        //开位选
}

void smgkj00_3()
{
        P1=0X40+0X80+0X02;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X40;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X40;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X01+0X10+0X40;          //显示右侧上一竖
        SMG0=0;        //开位选
        delay(5);
                SMG0=1;        //开位选
}

void smgkj00_4()
{
        P1=0X40+0X80+0X02;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X40;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X40;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X10+0X40;          //显示右侧上一竖
        SMG0=0;        //开位选
        delay(5);
                SMG0=1;        //开位选
}


void smgkj00_5()
{
        P1=0X40+0X80+0X02;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X40;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X40;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X40;          //显示右侧上一竖
        SMG0=0;        //开位选
        delay(5);
                SMG0=1;        //开位选
}


void smgkj00_6()
{
        P1=0X40+0X80+0X02;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X40;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选

        P1=0X40;
        SMG1=0;        //开位选
        delay(5);
                SMG1=1;        //开位选

        P1=0X40;          //显示右侧上一竖
        SMG0=1;        //开位选
        delay(5);
                SMG0=1;        //开位选
}


void smgkj00_7()
{
        P1=0X40+0X80+0X02;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;

        P1=0X40;//开段选
        SMG2=0;        //开位选        
        delay(5);        //延时
                 SMG2=1;        //开位选


}

void smgkj00_8()
{
        P1=0X40+0X80+0X02;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;



}

void smgkj00_9()
{
        P1=0X80+0X02;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;
}
void smgkj00_10()
{
        P1=0X02;//开段选
        SMG3=0;        //开位选        
        delay(5);        //延时
        SMG3=1;
}
void smgkj00_11()
{
        P1=0X02;//开段选
        SMG3=1;        //开位选        
        delay(5);        //延时
        SMG3=1;
}


void smginit()
{
        uint  i;
        smgkj00();
        smgkj01();
        smgkj02();
        smgkj03();
        for(i=200;i>0;i--){        smgkj04();}
        for(i=200;i>0;i--){        smgkj05();}
        for(i=200;i>0;i--){        smgkj06();}
        for(i=200;i>0;i--){        smgkj07();}
        for(i=200;i>0;i--){        smgkj08();}
        for(i=200;i>0;i--){        smgkj09();}
        for(i=200;i>0;i--){        smgkj10();}
        for(i=200;i>0;i--){        smgkj11();}

        for(i=200;i>0;i--){        smgkj00_0();}        
        for(i=200;i>0;i--){        smgkj00_1();}
        for(i=200;i>0;i--){        smgkj00_2();}        
        for(i=200;i>0;i--){        smgkj00_3();}
        for(i=200;i>0;i--){        smgkj00_4();}        
        for(i=200;i>0;i--){        smgkj00_5();}
        for(i=200;i>0;i--){        smgkj00_6();}
        for(i=200;i>0;i--){        smgkj00_7();}        
        for(i=200;i>0;i--){        smgkj00_8();}
        for(i=200;i>0;i--){        smgkj00_9();}        
        for(i=400;i>0;i--){        smgkj00_10();}
        for(i=400;i>0;i--){        smgkj00_11();}        
}

Keil代码与Proteus仿真下载:
仿真代码.7z (58.78 KB, 下载次数: 25)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2022-2-10 00:34 | 只看该作者


阻塞式延时的写法
电饭锅什么都不用干
只显示这转圈圈
来一个简化版,抛砖引玉
  1. #include <reg52.h>

  2. typedef         unsigned char        u8;  //0 to 255
  3. typedef         unsigned int        u16;  //0 to 65535

  4. sbit debug = P3^7;
  5. sbit P10 = P1^0;
  6. sbit P11 = P1^1;
  7. sbit P12 = P1^2;
  8. sbit P14 = P1^4;
  9. sbit P16 = P1^6;
  10. sbit P17 = P1^7;

  11. u8 DigiTube_Buff[4];
  12. void IO_out(u8 dat)
  13. {
  14.   P11=dat&0x20;
  15.   P17=dat&0x10;
  16.   P16=dat&0x08;
  17.   P14=dat&0x04;
  18.   P10=dat&0x02;
  19.   P12=dat&0x01;
  20. }
  21. void disp()
  22. {
  23.     static u8 i;
  24.     P2 = 0xFF;
  25. //    P1 = DigiTube_Buff[i];
  26.         IO_out(DigiTube_Buff[i]);
  27.         P2 = ~(0x01 << i);
  28.     i = ++i % 4;
  29. }
  30. void Pattern()
  31. {   static u8 mode = 0;
  32.     u8 i;
  33.     for(i =0; i<4; i++)
  34.         DigiTube_Buff[i] = 0;

  35.     if((mode >= 0) && (mode < 12))DigiTube_Buff[0]+=0x01;
  36.     if((mode >= 9) && (mode < 21))DigiTube_Buff[0]+=0x08;
  37.     if((mode >= 10) && (mode < 22))DigiTube_Buff[0]+=0x10;
  38.     if((mode >= 11) && (mode < 23))DigiTube_Buff[0]+=0x20;
  39.     if((mode >= 1) && (mode < 13))DigiTube_Buff[1]+=0x01;
  40.     if((mode >= 8) && (mode < 20))DigiTube_Buff[1]+=0x08;
  41.     if((mode >= 2) && (mode < 14))DigiTube_Buff[2]+=0x01;
  42.     if((mode >= 7) && (mode < 19))DigiTube_Buff[2]+=0x08;
  43.     if((mode >= 3) && (mode < 15))DigiTube_Buff[3]+=0x01;
  44.     if((mode >= 4) && (mode < 16))DigiTube_Buff[3]+=0x02;
  45.     if((mode >= 5) && (mode < 17))DigiTube_Buff[3]+=0x04;
  46.     if((mode >= 6) && (mode < 18))DigiTube_Buff[3]+=0x08;
  47.     mode = ++mode %24;
  48. }
  49. void main()
  50. {   int ScanCNT1 = 0, ScanCNT2 = 0;
  51.     while(1)
  52.     {
  53.         if(ScanCNT1++ > 100)
  54.         {
  55.             ScanCNT1 = 0;
  56.             disp();
  57.         }
  58.         if(ScanCNT2++ > 5000)
  59.         {
  60.             ScanCNT2 = 0;
  61.             Pattern();                                       
  62.         }
  63.     }
  64. }
复制代码






评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:977804 发表于 2022-2-10 07:18 来自手机 | 只看该作者
这水平高。哈哈,就是想要这效果
回复

使用道具 举报

地板
ID:140489 发表于 2022-2-10 09:03 | 只看该作者
lkc8210 发表于 2022-2-10 00:34
阻塞式延时的写法
电饭锅什么都不用干
只显示这转圈圈

大师,这个电路是怎么连接的
回复

使用道具 举报

5#
ID:161164 发表于 2022-2-10 10:19 | 只看该作者
lids 发表于 2022-2-10 09:03
大师,这个电路是怎么连接的

跟楼主的一样
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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