仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (18.07 KB, 下載次數: 72)
下載附件
2021-5-22 16:37 上傳
51hei.png (17.43 KB, 下載次數: 64)
下載附件
2021-5-22 16:38 上傳
單片機源程序如下:
- #include <reg52.h>
- #include <intrins.H>
- #include <math.H>
- #include <stdio.h>
- #define u8 unsigned char
- #define uchar unsigned char
- #define uint unsigned int
- #define u16 unsigned int
- #define uchar unsigned char
- #define uint unsigned int
- float dianliu1,dianliu2,dianya;
- uchar dianji=0;
- sbit LCD_RS = P2^4; //液晶1602 RS端口
- sbit LCD_RW = P2^5; //液晶1602 RS端口
- sbit LCD_EP = P2^6; //液晶1602 EN端口
- sbit key1 = P3^0;
- sbit key2 = P3^1;
- sbit key3 = P1^0;
- sbit key4 = P1^1;
- sbit led = P1^2;
- sbit fmq = P1^4; //
- int dianliumax = 90,dianyamax =30;
- uchar code table[] = {" A1=100A V=13 V"}; //設定速度初始化
- uchar code table1[] = {" A0=100A V=22 V"}; // 動態顯示初始化
- uchar n , i,x,table2[5],table3[5],ge,shi,bai,flag1,key1n,temp;
- unsigned char x=1 ;
- void init();
- void display_val(unsigned int zhuan);
- unsigned int flag_aa;
- /***********延時1MS程序***/
- void delay(uint z)
- { uint x,y;
- for(x=z;x>0;x--)
- for(y=80;y>0;y--);
- }
- /******液晶寫命令************/
- void write_com(uchar com)
- { LCD_RS=0;
-
- P0=com ;
- // delay(1);
- LCD_EP=1;
- delay(1);
- LCD_EP=0;
- }
- /*****************/
- /********液晶寫數據***********/
- void write_data(uchar date)
- { LCD_RS=1;
-
- P0=date ;
- //delay(1);
- LCD_EP=1;
- delay(1);
- LCD_EP=0;
- }
- /*****************************/
- void dis1(int z,unsigned int zhua,int x,int y)
- {
-
- table2[0]=zhua/10000+0x30; //取萬位
- table2[1]=(zhua%10000)/1000+0x30; //取千位
- table2[2]=(zhua%1000)/100+0x30; //取百位
- table2[3]=(zhua%100)/10+0x30; //取十位
- table2[4]=zhua%10+0x30; //取個位
- if(z==1)
- write_com(0x80+x);
- if(z==2)
- write_com(0x80+0x40+x);
- // write_data(table2[0]);
- // write_data(table2[1]);
- write_data(table2[3]);
- if(y==1)
- write_data('.');
- write_data(table2[4]);
- if(y==2)
- write_data('.');
- write_data(table2[5]);
- write_com(0x80+16);
-
-
- }
- void dis(int z,unsigned int zhua,int x,int y)
- {
-
- table2[0]=zhua/10000+0x30; //取萬位
- table2[1]=(zhua%10000)/1000+0x30; //取千位
- table2[2]=(zhua%1000)/100+0x30; //取百位
- table2[3]=(zhua%100)/10+0x30; //取十位
- table2[4]=zhua%10+0x30; //取個位
- if(z==1)
- write_com(0x80+x);
- if(z==2)
- write_com(0x80+0x40+x);
- // write_data(table2[0]);
- // write_data(table2[1]);
- write_data(table2[2]);
- if(y==1)
- write_data('.');
- write_data(table2[3]);
- if(y==2)
- write_data('.');
- write_data(table2[4]);
- write_com(0x80+16);
-
-
- }
- /*--------------------------液晶初始化-----------------------------*/
- void init_lcd()
- {
- LCD_EP=0;
- write_com(0x38);
- write_com(0x08);
- write_com(0x06);
- write_com(0x0c);
- write_com(0x01);
- //初始化顯示
- write_com(0x80);
- for(i=0;i<16;i++)
- {
- write_data(table[i]);
- delay(3);
- }
- write_com(0x80+0x40);
- for(i=0;i<16;i++)
- {
- write_data(table1[i]);
- delay(3);
- }
- }
- void uart(void) //串口通信初始化
- {
- SCON=0x50; //串口通信工作方式1
- REN=1; //允許接收
- TMOD=0x20; //定時器1的工作方式2
- TH1=0xfd,TL1=0xfd;
- TI=1; //這里一定要注意
- TR1=1; //打開定時器
- }
- void init()
- {
- TMOD=0X10; //定時器工作方式1
- TH1=0XFF; //100us定時,裝入初值
- TL1=0XA4;
- TR1=1; //啟動T1工作
- ET1=1; //允許T1中斷
- EA =1; //開總中斷
- }
- int max(int a,int b,int c)
- {
- return (a>b?a:b)>c?(a>b?a:b):c;
- }
-
-
- /***********************************************************************************************************
- ADC0832相關函數
- ***********************************************************************************************************/
- sbit ADCS =P1^5; //ADC0832 片選
- sbit ADCLK =P1^7; //ADC0832 時鐘
- sbit ADDI =P1^6; //ADC0832 數據輸入 /*因為單片機的管腳是雙向的,且ADC0832的數據輸入輸出不同時進行,
- sbit ADDO =P1^6; //ADC0832 數據輸出 /*為節省單片機引腳,簡化電路所以輸入輸出連接在同一個引腳上
- //========================================================================
- unsigned int Adc0832(unsigned char channel)
- {
- uchar i=0;
- uchar j;
- uint dat=0;
- uchar ndat=0;
- uchar Vot=0;
- if(channel==0)channel=2;
- if(channel==1)channel=3;
- ADDI=1;
- _nop_();
- _nop_();
- ADCS=0;//拉低CS端
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿1
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- ADDI=channel&0x1;
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿2
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- ADDI=(channel>>1)&0x1;
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿3
- ADDI=1;//控制命令結束
- _nop_();
- _nop_();
- dat=0;
- for(i=0;i<8;i++)
- {
- dat|=ADDO;//收數據
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次時鐘脈沖
- _nop_();
- _nop_();
- dat<<=1;
- if(i==7)dat|=ADDO;
- }
- for(i=0;i<8;i++)
- {
- j=0;
- j=j|ADDO;//收數據
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次時鐘脈沖
- _nop_();
- _nop_();
- j=j<<7;
- ndat=ndat|j;
- if(i<7)ndat>>=1;
- }
- ADCS=1;//拉低CS端
- ADCLK=0;//拉低CLK端
- ADDO=1;//拉高數據端,回到初始狀態
- dat<<=8;
- dat|=ndat;
- return(dat); //return ad data
- }
- /***********************************************************************************************************
- ADC0832相關函數
- ***********************************************************************************************************/
- sbit ADCS2 =P3^7; //ADC0832 片選
- sbit ADCLK2 =P3^6; //ADC0832 時鐘
- sbit ADDI2 =P3^5; //ADC0832 數據輸入 /*因為單片機的管腳是雙向的,且ADC0832的數據輸入輸出不同時進行,
- sbit ADDO2 =P3^5; //ADC0832 數據輸出 /*為節省單片機引腳,簡化電路所以輸入輸出連接在同一個引腳上
- //========================================================================
- unsigned int Adc08322(unsigned char channel)
- {
- uchar i=0;
- uchar j;
- uint dat=0;
- uchar ndat=0;
- uchar Vot=0;
- if(channel==0)channel=2;
- if(channel==1)channel=3;
- ADDI2=1;
- _nop_();
- _nop_();
- ADCS2=0;//拉低CS端
- _nop_();
- _nop_();
- ADCLK2=1;//拉高CLK端
- _nop_();
- _nop_();
- ADCLK2=0;//拉低CLK端,形成下降沿1
- _nop_();
- _nop_();
- ADCLK2=1;//拉高CLK端
- ADDI2=channel&0x1;
- _nop_();
- _nop_();
- ADCLK2=0;//拉低CLK端,形成下降沿2
- _nop_();
- _nop_();
- ADCLK2=1;//拉高CLK端
- ADDI2=(channel>>1)&0x1;
- _nop_();
- _nop_();
- ADCLK2=0;//拉低CLK端,形成下降沿3
- ADDI2=1;//控制命令結束
- _nop_();
- _nop_();
- dat=0;
- for(i=0;i<8;i++)
- {
- dat|=ADDO2;//收數據
- ADCLK2=1;
- _nop_();
- _nop_();
- ADCLK2=0;//形成一次時鐘脈沖
- _nop_();
- _nop_();
- dat<<=1;
- if(i==7)dat|=ADDO2;
- }
- for(i=0;i<8;i++)
- {
- j=0;
- j=j|ADDO2;//收數據
- ADCLK2=1;
- _nop_();
- _nop_();
- ADCLK2=0;//形成一次時鐘脈沖
- _nop_();
- _nop_();
- j=j<<7;
- ndat=ndat|j;
- if(i<7)ndat>>=1;
- }
- ADCS2=1;//拉低CS端
- ADCLK2=0;//拉低CLK端
- ADDO2=1;//拉高數據端,回到初始狀態
- dat<<=8;
- dat|=ndat;
- return(dat); //return ad data
- }
- void key()
- {
- if(key1 == 0)
- {
- delay(50);
- dianliumax ++;
- if( dianliumax >999)
- dianliumax = 999;
- }
- if(key2 == 0)
- {
- delay(50);
- dianliumax --;
- if( dianliumax < 1)
- dianliumax = 1;
- }
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
Keil代碼與Proteus仿真下載:
電壓電流檢測仿真.7z
(71.91 KB, 下載次數: 325)
2021-12-24 00:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|