Altium Designer畫的DAC0832數控電源原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (75.52 KB, 下載次數: 57)
下載附件
2018-5-20 01:54 上傳
0.png (33.92 KB, 下載次數: 49)
下載附件
2018-5-20 01:54 上傳
0.png (14.52 KB, 下載次數: 49)
下載附件
2018-5-20 01:55 上傳
0.jpg (25.56 KB, 下載次數: 49)
下載附件
2018-5-20 01:55 上傳
單片機源程序如下:
- #include<reg52.h>
- typedef unsigned char uint8;
- typedef unsigned int uint16;
- sbit V_ADD = P3^4; //電壓加
- sbit V_MIN = P3^5; //電壓減
- sbit V_SROTE = P3^6; //讀取上次存儲的電壓
- sbit V_TJ = P3^7; //電壓調節開關
- /************EEPROM引腳*******************************/
- sbit SCL=P3^2; //AT24C02的時鐘線
- sbit SDA=P3^3; //AT24C02的數據線
- /*********************************************************/
- void delay(uint16 time); //延時函數
- void led(uint8 duan,uint8 wei, uint8 dian); //數碼管顯示函數
- void iic_start(); // IIC的開始信號產生函數
- void iic_stop(); // IIC的結束信號產生函數
- void iic_ack(bit sda1); // IIC的應答信號產生函數
- void iic_write(uint8 date); // IIC通信,寫數據函數
- uint8 iic_read(uint8 sda2); // 向EEPROM定入一個字節的數據
- void iic_store(uint8 date,uint8 adss); //將date儲存到EEPROM指定的一個單元中
- uint8 iic_got(uint8 adss,uint8 sck); // 將1個數據從EEPROM指定的地址中讀出
- void key();
- void display();
- /*********************************************************/
- uint8 led7[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //數碼管編碼
- uint8 dy_dx=0; //電壓數字量大小
- uint16 V = 0; //電壓模擬量大小
- bit v_tjv=0; //電壓調節開關指示變量
- void main()
- {
-
-
- while(1)
- {
-
- key();
- display();
- }
-
- }
- /**********************************************
- 函數名:delay
- 行參 :time 延時基數
- 功能 :用while延時(6us單位)
- ************************************************/
- // 延時函數(6us單位)
- void delay(uint16 time)
- {
- while(time--);
- }
- /************************************************************
- 函數名:led
- 行參 :duan--段碼 ,wei--位碼, dian--是否顯示點
- 功能 :數碼管顯示函數
- ***********************************************************/
- void led(uint8 duan,uint8 wei, uint8 dian)
- {
- if(dian==1)
- P1 = led7[duan]-0x80; //是否顯示點
- else
- P1 = led7[duan];
- P2=~(1<<(wei-1));
- delay(100);
- P2 = 0XFF;
- }
- /**********************************************
- 函數名:iic_start
- 功能 :IIC的開始信號產生函數
- ************************************************/
- /******************************************/
- void iic_start()
- {
- SDA=1; //可根據資料的開始時延來寫
- SCL=0;
- SCL=1;
- delay(1);
- SDA=0;
- delay(1);
- SCL=0;
- SDA=1;
- }
- /**********************************************
- 函數名:iic_stop
- 功能 :IIC的結束信號產生函數
- ************************************************/
- /****************************************/
- void iic_stop()
- {
- SDA=0; //可根據資料的開始時延來寫
- SCL=0;
- SCL=1;
- delay(1);
- SDA=1;
- delay(1);
- SCL=0;
- SDA=1;
-
- }
- /**********************************************
- 函數名:iic_ack
- 行參 :sda1 要定入的指令
- 功能 :IIC的應答信號產生函數
- ************************************************/
- // sda1=0發送應答,sda1=1發送非應答
- void iic_ack(bit sda1)
- {
- SCL=0;
- SDA=sda1;
- SCL=1;
- delay(1);
- SCL=0;
- }
- /**********************************************
- 函數名:iic_write
- 行參 :date 要定入的指令或數據
- 功能 :向EEPROM定入一個字節的數據
- ************************************************/
- //IIC通信,寫數據函數
- void iic_write(uint8 date)
- {
- uint8 i;
- SCL=0; //接低時鐘線
- for(i=0;i<8;i++) //循環8次將8位數據送入EEPROM
- {
- if(date&0x80) //循環取出數據的每一位
- SDA=1; //將數據賦給EEPROM的數據線
- else
- SDA=0;
- SCL=1; //拉高時鐘線
- date<<=1; //左移一位
- SCL=0; //拉低時鐘線
- }
- SDA=1; //接收應答
- SCL=0;
- SCL=1;
- delay(20);
- SCL=0;
- }
-
- /**********************************************
- 函數名:iic_read
- 行參 :sda2 發送應答或非應答的選擇(0——非應答,1——應答)
- 功能 :向EEPROM定入一個字節的數據
- ************************************************/
- //ATC2402讀數據
- uint8 iic_read(uint8 sda2)
- {
- uint8 i,date=0; //數據返回
- SCL=0; //接低時鐘線
- SDA=1; //拉高數據線
- for(i=0;i<8;i++)
- {
- SCL=1; //拉高時鐘線
- date=date<<1; //左移一位
- delay(1);
- if(SDA)
- date=date|0x01; //從數據線上讀回數據賦給date
- SCL=0; //接低時鐘線
- }
- iic_ack(sda2); //發送應答
- return date; //返回數據
- }
- /**********************************************
- 函數名:iic_store
- 行參 :date——要儲存的數據,adss——要存放的地址
- 功能 :將date儲存到EEPROM指定的一個單元中
- ************************************************/
- void iic_store(uint8 date,uint8 adss)
- {
- iic_start(); //發送開始信號
- iic_write(0xa0); //器件地址
- iic_write(adss); //數據要存放的地址
- iic_write(date); //存入數據
- iic_stop(); //一定要寫這條停止指令。
-
- }
- /**********************************************
- 函數名:iic_got
- 行參 :adss——要讀取的數據的地址,sck——為1表示發送應答,為0表示發送非應答
- 功能 :將1個數據從EEPROM指定的地址中讀出
- ************************************************/
- uint8 iic_got(uint8 adss,uint8 sck)
- {
- uint8 date1; //返回數據
- iic_start(); //發送開始信號
- iic_write(0xa0); //器件地址
- iic_write(adss); //要讀取的數據的地址
- iic_start(); //發送開始信號
- iic_write(0xa1); //器件地址(選擇讀)
- date1=iic_read(sck);//讀取數據
- if(!sck)
- iic_stop(); //發送停止信號
- return date1; //返回數據
- }
- void key()
- {
- if(!V_TJ)
- {
- while(!V_TJ)
- display();
- v_tjv=~v_tjv;
-
- }
- if(!V_SROTE)
- {
- while(!V_SROTE)
- display();
- dy_dx=iic_got(0x00,0);
- }
- if(v_tjv)
- {
- if(!V_ADD&&dy_dx!=250)
- {
- dy_dx=dy_dx+2;
- iic_store(dy_dx,0x00);
- while(!V_ADD)
- display();
-
-
- }
- else if(!V_MIN&&dy_dx!=0)
- {
- dy_dx=dy_dx-2;
- iic_store(dy_dx,0x00);
- while(!V_MIN)
- display();
-
- }
- }
- }
- void display()
- {
- P0=dy_dx;
- V = dy_dx*4.8;
- led(V/1000,1, 0);
- led(V%1000/100,2, 1);
- led(V%100/10,3, 0);
- led(V%10,4, 0);
- }
復制代碼
所有資料51hei提供下載:
0907917shukongdianyuan.rar
(5.23 MB, 下載次數: 304)
2018-5-19 14:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|