找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机手动程控放大器仿真+源程序+电路原理图(MAX7219驱动数码管显示)

[复制链接]
跳转到指定楼层
楼主


单片机手动程控放大器仿真电路原理图(工程文件清晰版请下载本帖最后的附件),采用MAX7219驱动数码管显示.

单片机手动程控放大器源程序如下:
  1. #include <AT89X52.h>
  2. #include <intrins.h>
  3. sbit sbF1 = P2 ^ 0;   //不进行放大处理
  4. sbit sbF20 = P2 ^ 1;  //放大20倍
  5. sbit sbF30 = P2 ^ 2;  //放大30倍
  6. sbit sbF50 = P2 ^ 3;  //放大50倍

  7. sbit sbDIN = P3 ^ 0;                        //MAX7219的数据引脚
  8. sbit sbLOAD = P3 ^ 1;                      //MAX7219的控制引脚
  9. sbit sbCLK = P3 ^ 2;                       //MAX7219的时钟引脚

  10. //显示缓冲区定义
  11. unsigned char Disp_Buffer[8]=            //MAX7219的输出缓冲
  12. {
  13.          0,0,0,0,0,0,0,0
  14. };
  15. unsigned char Disp_Buffer1[8]=            //MAX7219的输出缓冲
  16. {
  17.          0,0,0,0,0,0,0,1
  18. };
  19. unsigned char Disp_Buffer20[8]=            //MAX7219的输出缓冲
  20. {
  21.          0,0,0,0,0,0,2,0
  22. };
  23. unsigned char Disp_Buffer30[8]=            //MAX7219的输出缓冲
  24. {
  25.          0,0,0,0,0,0,3,0
  26. };
  27. unsigned char Disp_Buffer50[8]=            //MAX7219的输出缓冲
  28. {
  29.          0,0,0,0,0,0,5,0
  30. };

  31. void DelayMS(unsigned int ms)              //毫秒级延时函数
  32. {
  33.         unsigned int i,j;
  34.         for( i=0;i<ms;i++)
  35.                 for(j=0;j<1141;j++);        
  36. }
  37. //写MAX7219函数,Addr为MAX7219的内部寄存器地址,Dat为待写入的数据
  38. void Write7219(unsigned char Addr,unsigned char Dat)
  39. {
  40.          unsigned char i;
  41.         sbLOAD = 0;                                         
  42.         for(i=0;i<8;i++)                               //先送出8位地址
  43.         {
  44.                  sbCLK = 0;                                   //时钟拉低
  45.                 Addr <<= 1;                                  //移位送出地址
  46.                 sbDIN        = CY;                                    //送出数据
  47.                 sbCLK = 1;                                   //时钟上升沿
  48.                 _nop_();
  49.                 _nop_();
  50.                 sbCLK = 0;                                   
  51.         }
  52.         for(i=0;i<8;i++)                              //再送出8位数据
  53.         {
  54.                  sbCLK = 0;
  55.                 Dat <<= 1;                                  //移位送出数据
  56.                 sbDIN        = CY;
  57.                 sbCLK = 1;
  58.                 _nop_();
  59.                 _nop_();
  60.                 sbCLK = 0;        
  61.         }
  62.         sbLOAD = 1;
  63. }
  64. //MAX7129的初始化函数
  65. void Initialise7219()
  66. {
  67.          Write7219(0x09,0xff);                 //编码模式寄存器
  68.         Write7219(0x0a,0x07);                 //显示亮度控制
  69.         Write7219(0x0b,0x07);                 //扫描控制
  70.         Write7219(0x0c,0x01);                 //关闭模式控制寄存器设置
  71. }

  72. void  Wobbling ()   //延时程序防止按键抖动
  73. {
  74.   unsigned int i;
  75.   for(i=0;i<1000;i++);
  76. }

  77. void main()
  78. {
  79.   unsigned char i;
  80.         Initialise7219();                     //首先初始化MAX7129
  81.         DelayMS(1);                         //延时1毫秒
  82.   for(i=0;i<8;i++)
  83.         {
  84.                  Write7219(i+1,Disp_Buffer[i]);      //将显示缓冲区内的数据循环送出
  85.         }
  86.   P1 = 0x00;    //初始化端口
  87.   P2 = 0xFF;  
  88.   P1 = 0x11;   //再不按键的情况下默认为不进行放大处理
  89.   while(1)
  90.   {
  91.   if (sbF1 == 0) //判断是否按下按键
  92.   {
  93.     Wobbling();   //时间延时程序,软件防抖动
  94.     if( sbF1 == 0)  //确定按下按键
  95.     {
  96.       P1 = 0x11;   //放大1倍
  97.       for(i=0;i<8;i++)
  98.             {
  99.                      Write7219(i+1,Disp_Buffer1[i]);      //显示放大1倍
  100.             }
  101.     }
  102.   }
  103.   if(sbF20 == 0)  //判断是否按下按键         
  104.   {
  105.     Wobbling();   //时间延时程序,软件防抖动
  106.     if(sbF20 == 0) //确定按下按键
  107.     {            
  108.       P1 = 0x22;   //放大20倍
  109.       for(i=0;i<8;i++)
  110.             {
  111.                      Write7219(i+1,Disp_Buffer20[i]);      //显示放大20倍
  112.             }
  113.      }            
  114.   }
  115.   if(sbF30 == 0) //判断是否按下按键         
  116.   {
  117.     Wobbling();   //时间延时程序,软件防抖动
  118.     if(sbF30 == 0) //确定按下按键   
  119.     {         
  120.       P1 = 0x44;   //放大30倍  
  121.       for(i=0;i<8;i++)
  122.             {
  123.                      Write7219(i+1,Disp_Buffer30[i]);      //显示放大20倍
  124.             }
  125.      }            
  126.   }
  127.   if(sbF50 == 0) //判断是否按下按键         
  128.   {
  129.     Wobbling();   //时间延时程序,软件防抖动
  130.     if(sbF50 == 0)//确定按下按键  
  131.     {         
  132.       P1=0x88;  //放大50倍   
  133.       for(i=0;i<8;i++)
  134.             {
  135.                      Write7219(i+1,Disp_Buffer50[i]);      //显示放大20倍
  136.             }
  137.      }         
  138.   }
  139. }
  140. }
复制代码



单片机手动程控放大器所有资料下载:
http://www.51hei.com/bbs/dpj-54940-1.html


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

使用道具 举报

沙发
ID:503507 发表于 2019-6-29 08:51 | 只看该作者
你做处实物了吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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