找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于51单片机驱动7段数码管显示源程序与Proteus仿真图

[复制链接]
跳转到指定楼层
楼主
设计目标:1.使用一个七段数码管,在数码管上顺序显示0~F,显示间隔1s。
    2.使用8个七段数码管,稳定显示自己学号后8位。(已实现循环显示完整学号)

本案例用到单片机定时器,数码管等知识。

需要软件:keil c51 (本机环境 Keil uVision5)
                 proteus  (本机环境 proteus 8.11)
仿真电路图如下:


需要原件: AT89C51
     74LS245 (P0口驱动不了,加245驱动数码管)
     74LS138   (3 8 译码器 驱动多段位置信息)
     7SEG-MPX8-CC-BLUE
     7SEG-MPX1-CC

共阴数码管段码和共阳数码管段码加起来为FF,如显示不正常另行计算。因本人区分不来就不误导人了,程序中led和led8为数码管断码。

驱动程序如下:

  1. #include <reg51.h>
  2. #include<stdio.h>

  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. uchar leddata[] = "124F09124847-2020.7";//学号自行修改
  6. //0x00  灭灯  0x80  点  0x40  横杠
  7. uchar led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,   0x77,0x7c,0x39, 0x5e,0x79,0x71,0x80,0x40};
  8. /*0-9  A-F*/
  9. uchar led8[] = {0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,   0x88,0x83,0xC6,0xA1,0x86,0x8E};
  10. /*位信息*/
  11. //uchar wei[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  12. /*138译码器位信息*/
  13. uchar wei[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};

  14. uint Rank = 0 , charNUm = 0, tem = 0;

  15. void delay(int t){
  16.         while(t!=0)
  17.         {
  18.                 uchar i;
  19.                 for(i=124;i>0;i--);  //??124*8+10=1002us
  20.                 t--;
  21.         }
  22. }
  23. //-----------------字符查表----------------------
  24. void charToNum(uchar strs){
  25.   switch (strs)
  26.   {
  27.     case '0':
  28.       P0 = led[0];
  29.       break;
  30.     case '1':
  31.       P0 = led[1];
  32.       break;
  33.     case '2':
  34.       P0 = led[2];
  35.       break;
  36.     case '3':
  37.       P0 = led[3];
  38.       break;
  39.     case '4':
  40.       P0 = led[4];
  41.       break;
  42.     case '5':
  43.       P0 = led[5];
  44.       break;
  45.     case '6':
  46.       P0 = led[6];
  47.       break;
  48.     case '7':
  49.       P0 = led[7];
  50.       break;
  51.     case '8':
  52.       P0 = led[8];
  53.       break;
  54.     case '9':
  55.       P0 = led[9];
  56.       break;
  57.     case 'A':
  58.       P0 = led[10];
  59.       break;
  60.     case 'B':
  61.       P0 = led[11];
  62.       break;
  63.     case 'C':
  64.       P0 = led[12];
  65.       break;
  66.     case 'D':
  67.       P0 = led[13];
  68.       break;
  69.     case 'E':
  70.       P0 = led[14];
  71.       break;
  72.     case 'F':
  73.       P0 = led[15];
  74.       break;
  75.                 case '.':
  76.       P0 = led[16];
  77.       break;
  78.                 case '-':
  79.       P0 = led[17];
  80.       break;
  81.     default:
  82.       P0 = 0xff;
  83.       break;
  84.   }   
  85. }
  86. //-----------------初始化----------------------
  87. void init(){
  88.   TMOD = 0x01;
  89.   TH0  = (65536-1000)/256;
  90.   TL0  = (65536-1000)%256;
  91.   TR0  = 1;
  92.   ET0  = 1;
  93.   EA   = 1;
  94.         P0   = 0x00;
  95.         P3   = 0x00;
  96. }
  97. //-----------------单个数码管显示----------------------0-F
  98. void OneledRun(){
  99.         uint s = 0;
  100.   for(;s<16;s++){
  101.     P3 = led[s];
  102.     delay(3000);
  103.   }
  104. }

  105. //-----------------TT0----------------------1MS
  106. void TT0(void) interrupt 1
  107. {
  108.         P0 = 0x00;   //消影
  109.         TH0  = (65536-1000)/256;
  110.   TL0  = (65536-1000)%256;
  111.         P2 = wei[Rank];
  112.         //P0 = led[Rank];               
  113.   charToNum(leddata[Rank+charNUm]);  
  114.   Rank++;
  115.         tem++;        
  116.   if(Rank == 8) { Rank = 0; }
  117.         if(tem == 1000)
  118.         {
  119.                 charNUm++;
  120.                 if(charNUm == (sizeof(leddata) - 8)) {
  121.                         charNUm = 0;
  122.                 }
  123.                 tem = 0;
  124.         }  
  125. }

  126. //-----------------主函数----------------------
  127. void main(){
  128.           init();
  129.     delay(1000);
  130.     while (1)
  131.     {                  
  132.                         OneledRun();                        
  133.     }

  134. }
复制代码
全部资料51hei下载地址:
led8.zip (83.73 KB, 下载次数: 26)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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