|
单片机手动程控放大器仿真电路原理图(工程文件清晰版请下载本帖最后的附件),采用MAX7219驱动数码管显示.
单片机手动程控放大器源程序如下:
- #include <AT89X52.h>
- #include <intrins.h>
- sbit sbF1 = P2 ^ 0; //不进行放大处理
- sbit sbF20 = P2 ^ 1; //放大20倍
- sbit sbF30 = P2 ^ 2; //放大30倍
- sbit sbF50 = P2 ^ 3; //放大50倍
- sbit sbDIN = P3 ^ 0; //MAX7219的数据引脚
- sbit sbLOAD = P3 ^ 1; //MAX7219的控制引脚
- sbit sbCLK = P3 ^ 2; //MAX7219的时钟引脚
- //显示缓冲区定义
- unsigned char Disp_Buffer[8]= //MAX7219的输出缓冲
- {
- 0,0,0,0,0,0,0,0
- };
- unsigned char Disp_Buffer1[8]= //MAX7219的输出缓冲
- {
- 0,0,0,0,0,0,0,1
- };
- unsigned char Disp_Buffer20[8]= //MAX7219的输出缓冲
- {
- 0,0,0,0,0,0,2,0
- };
- unsigned char Disp_Buffer30[8]= //MAX7219的输出缓冲
- {
- 0,0,0,0,0,0,3,0
- };
- unsigned char Disp_Buffer50[8]= //MAX7219的输出缓冲
- {
- 0,0,0,0,0,0,5,0
- };
- void DelayMS(unsigned int ms) //毫秒级延时函数
- {
- unsigned int i,j;
- for( i=0;i<ms;i++)
- for(j=0;j<1141;j++);
- }
- //写MAX7219函数,Addr为MAX7219的内部寄存器地址,Dat为待写入的数据
- void Write7219(unsigned char Addr,unsigned char Dat)
- {
- unsigned char i;
- sbLOAD = 0;
- for(i=0;i<8;i++) //先送出8位地址
- {
- sbCLK = 0; //时钟拉低
- Addr <<= 1; //移位送出地址
- sbDIN = CY; //送出数据
- sbCLK = 1; //时钟上升沿
- _nop_();
- _nop_();
- sbCLK = 0;
- }
- for(i=0;i<8;i++) //再送出8位数据
- {
- sbCLK = 0;
- Dat <<= 1; //移位送出数据
- sbDIN = CY;
- sbCLK = 1;
- _nop_();
- _nop_();
- sbCLK = 0;
- }
- sbLOAD = 1;
- }
- //MAX7129的初始化函数
- void Initialise7219()
- {
- Write7219(0x09,0xff); //编码模式寄存器
- Write7219(0x0a,0x07); //显示亮度控制
- Write7219(0x0b,0x07); //扫描控制
- Write7219(0x0c,0x01); //关闭模式控制寄存器设置
- }
- void Wobbling () //延时程序防止按键抖动
- {
- unsigned int i;
- for(i=0;i<1000;i++);
- }
- void main()
- {
- unsigned char i;
- Initialise7219(); //首先初始化MAX7129
- DelayMS(1); //延时1毫秒
- for(i=0;i<8;i++)
- {
- Write7219(i+1,Disp_Buffer[i]); //将显示缓冲区内的数据循环送出
- }
- P1 = 0x00; //初始化端口
- P2 = 0xFF;
- P1 = 0x11; //再不按键的情况下默认为不进行放大处理
- while(1)
- {
- if (sbF1 == 0) //判断是否按下按键
- {
- Wobbling(); //时间延时程序,软件防抖动
- if( sbF1 == 0) //确定按下按键
- {
- P1 = 0x11; //放大1倍
- for(i=0;i<8;i++)
- {
- Write7219(i+1,Disp_Buffer1[i]); //显示放大1倍
- }
- }
- }
- if(sbF20 == 0) //判断是否按下按键
- {
- Wobbling(); //时间延时程序,软件防抖动
- if(sbF20 == 0) //确定按下按键
- {
- P1 = 0x22; //放大20倍
- for(i=0;i<8;i++)
- {
- Write7219(i+1,Disp_Buffer20[i]); //显示放大20倍
- }
- }
- }
- if(sbF30 == 0) //判断是否按下按键
- {
- Wobbling(); //时间延时程序,软件防抖动
- if(sbF30 == 0) //确定按下按键
- {
- P1 = 0x44; //放大30倍
- for(i=0;i<8;i++)
- {
- Write7219(i+1,Disp_Buffer30[i]); //显示放大20倍
- }
- }
- }
- if(sbF50 == 0) //判断是否按下按键
- {
- Wobbling(); //时间延时程序,软件防抖动
- if(sbF50 == 0)//确定按下按键
- {
- P1=0x88; //放大50倍
- for(i=0;i<8;i++)
- {
- Write7219(i+1,Disp_Buffer50[i]); //显示放大20倍
- }
- }
- }
- }
- }
复制代码
单片机手动程控放大器所有资料下载:
http://www.51hei.com/bbs/dpj-54940-1.html
|
|