可控電源,電壓可在1.25伏到9伏之間設定,電路涉及到A/D、D/A轉換、矩陣鍵盤和LED顯示。PROTEUS仿真圖和代碼見附件。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
鍵控穩壓電源.png (56.16 KB, 下載次數: 39)
下載附件
2020-2-14 15:19 上傳
單片機源程序如下:
- #include<reg51.h>
- //#include<DAC0832.c>
- //#include<ADC0832.c>
- //#include <absacc.h>
- #define uchar unsigned char
- #define uint unsigned int
- //#define DAC0832 XBYTE[0xfffe]
- /************I/O口定義*********/
- sbit CS=P2^3; //ADC0832的片選端
- sbit CLK=P2^2; //時鐘端
- sbit DIO=P2^1; //數據輸入輸出端
- sbit up=P2^7;
- sbit down=P3^0;
- sbit L1=P2^4;
- sbit L2=P2^5;
- sbit L3=P2^6;
- sbit WR2=P2^0;
- sbit LED1=P2^7;
- sbit LED2=P3^7;
- uint cdi=0,dy=0;
- uchar key=12,flag=0,h=0,m=0,l=0;
- uint ge,dian,xiao1,xiao2;
- uchar code table[]={ //共陽數碼管顯示定義
- 0x03,0x9f,0x25,0x0d,
- 0x99,0x49,0x41,0x1f,
- 0x01,0x09};
- void delay();
- uint A_D();
- void display();
- void DAC();
- void key_test();
- void delay(uchar i) //i=1延遲1ms
- {
- uchar a,b,c;
- for(c=i;c>0;c--)
- for(b=142;b>0;b--)
- for(a=2;a>0;a--);
- }
- void vol_up()
- {
- cdi+=1;
- DAC();
- delay(1);
- dy=A_D()*9/5;
- ge=dy/51; // 計算整數部分
- dian=(dy%51)*100/51; //計算小數部分
- xiao1=dian/10; //取小數點后第一位
- xiao2=dian%10; //去小數點后第二位
- }
- void vol_down()
- {
- cdi-=1;
- DAC();
- delay(1);
- dy=A_D()*9/5;
- ge=dy/51; // 計算整數部分
- dian=(dy%51)*100/51; //計算小數部分
- xiao1=dian/10; //取小數點后第一位
- xiao2=dian%10; //去小數點后第二位
- }
- /*****
- *函數名稱: void dispaly1()
- *輸入參數: 共0個參數;
- *輸出參數: 共0個參數;
- *返回值: 無;
- *需儲存的參數: 共0個參數;
- *功能介紹: 顯示電壓值
- *****/
- void display()
- {
- if(flag==0)
- {
- P1=table[ge]&0xfe;
- P1=table[ge]&0xfe; //顯示整數位,與0x01是為了顯示小數點
- L1=1;
- delay(1);
- L1=0;
- P1=table[xiao1]; //顯示小數點后第一位
- L2=1;
- delay(1);
- L2=0;
- P1=table[xiao2]; //顯示小數點后第二位,
- L3=1;
- delay(1);
- L3=0;
- }
- else
- {
- P1=table[h]&0xfe;
- P1=table[h]&0xfe; //顯示整數位,與0x01是為了顯示小數點
- L1=1;
- delay(1);
- L1=0;
- P1=table[m]; //顯示小數點后第一位
- L2=1;
- delay(1);
- L2=0;
- P1=table[l]; //顯示小數點后第二位,
- L3=1;
- delay(1);
- L3=0;
- }
- }
- /*****
- *函數名稱: uchar A_D()
- *輸入參數: 共0個參數;
- *輸出參數: 共0個參數;
- *返回值: 有;
- *需儲存的參數: 共0個參數;
- *功能介紹: 采集電壓
- *****/
- uint A_D()
- {
- uint dat;
- uchar i;
- CS=1; //一個轉換周期開始
- CLK=0; //為第一個脈沖準備
- CS=0; //CS置0,片選有效
- DIO=1; //DIO置1,規定起始信號
- CLK=1; //第一個脈沖
- CLK=0; //第一個脈沖的下降沿,此前DIO必須是高電平
- DIO=1; //DIO置1,通道選擇信號
- CLK=1; //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入
- //兩位數據用于選擇通道,這里選通道CH1
- CLK=0; //第二個脈沖下降沿
- DIO=1;//DI置1,選擇通道1
- CLK=1;//第三個脈沖
- CLK=0;//第三個脈沖下降沿
- DIO=1;//第三個脈沖下沉沿之后,輸入端DIO失去作用,應置1
- CLK=1;//第四個脈沖
- for(i=0;i<8;i++) //高位在前,循環8次讀出8位數據
- {
- CLK=1; //第四個脈沖
- CLK=0;
- dat<<=1; //將下面存儲的低位數據右移
- dat|=(uchar)DIO; //將輸出數據DIO通過或運算存儲在dat最低位
- }
- CS=1;//片選無效
- return dat;
- }
- void DAC()
- {
- P0 = cdi;
- WR2=0;
- WR2=1;
- }
- /*****
- *函數名稱: void key_test()
- *輸入參數: 共0個參數;
- *輸出參數: 共0個參數;
- *返回值: 無;
- *需儲存的參數: 共0個參數;
- *功能介紹: 鍵盤掃描程序,采用行反轉法對鍵盤進行掃描,確定鍵值
- *****/
- void key_test()
- {
- uchar temp=0;
- delay(10); //去抖
- if((P3&0x0f)!=0x0f)
- {
- temp=P3;
- P3=0x70;
- temp=temp|P3; //將行列值或即可得到每個鍵的編碼
- switch(temp)
- {
- case 0x3e:key=1;break; //1
- case 0x5e:key=2;break; //2
- case 0x6e:key=3;break; //3
- case 0x3d:key=4;break; //4
- case 0x5d:key=5;break; //5
- case 0x6d:key=6;break; //6
- case 0x3b:key=7;break; //7
- case 0x5b:key=8;break; //8
- case 0x6b:key=9;break; //9
- case 0x37:key=10;break; //*
- case 0x57:key=0;break; //0
- case 0x67:key=11;break; //#
- default:key=12;
- }
- while((P3&0x70)!=0x70); //判斷松手檢測
- }
- }
- void main()
- {
- uint i=0;
- uchar set_ok=0;
- LED1=0;
- DAC();
- delay(1);
- dy=A_D()*9/5;
- ge=dy/51; // 計算整數部分
- dian=(dy%51)*100/51; //計算小數部分
- xiao1=dian/10; //取小數點后第一位
- xiao2=dian%10; //去小數點后第二位
- display();
- while(1)
- {
- P3=0x0f;
- if((P3&0x0f)!=0x0f)
- { key_test();
- if(key==10) //設置鍵
- { LED1=1;
- flag=1;
- key=12;
- }
- else if(key==11) //確定鍵
- {
- flag=0;
- LED1=0;
- key=12;
- set_ok=1;
- }
-
- else if(key!=12) //其他數字鍵
- {
- if(flag==1)
- {
- h=m;
- m=l;
- l=key;
- key=12;
- }
- }
- }
- if(set_ok==1)
- {
- set_ok=0;
- if(h>ge)
- {
- do
- {vol_up();}
- while(h>ge);
- }
- else if(h<ge)
- {
- do
- {vol_down();}
- while(h<ge);
- }
- if(m>xiao1)
- {
- do
- {vol_up();}
- while(m>xiao1);
- }
- else if(m<xiao1)
- {
- do
- {vol_down();}
- while(m<xiao1);
- }
- }
-
- display();
- }
- }
復制代碼
所有資料51hei提供下載:
可控電源.zip
(62.27 KB, 下載次數: 59)
2020-2-14 15:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|