|
單片機手動程控放大器仿真電路原理圖(工程文件清晰版請下載本帖最后的附件),采用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.raoushi.com/bbs/dpj-54940-1.html
|
|