仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include"reg52.h"
- #include"pcf8591.h"
- #include"keyscan.h"
- #include"lcd1602.h"
- #include"I2C.h"
- #include"delay.h"
- u8 key_num,key_flag,key_count;
- u8 flag,i,set_value;
- u8 str1[];
- u8 str2[];
- long bai,shi,ge,back_voltage1,back_current;
- float key_value,back_voltage2;
- void main()
- {
- LCD_Init();//液晶初始化
- IIC_Init();
- while(1)
- {
- keyscan(); //键盘扫描
- if(key_flag==1)//有键按下
- {
- if(key_num<=9&&key_count<4) //只允许输入一个三位的数值
- {
-
- key_flag=0; //按下键标志位清零
- if(key_count==1)//输入电压值第一位
- {
- LCD_Manifest(1,5,keyscan());
- bai=keyscan();
- }
- if(key_count==2)//输入电压值第二位
- {
- LCD_Manifest(1, 7,keyscan());
- shi=keyscan();
- }
- if(key_count==3)//输入电压值第三位
- {
- LCD_Manifest(1,8,keyscan());
- ge=keyscan();
- }
- }
- if(key_num==10&&key_count>=3)//确认键按下
- flag=1;//确认键按下标志位
- if(key_num==11)//清除键按下
- {
- flag=0;//确认键按下标志位清零
- key_count=0; //按下数字计数清零
- LCD_Write_Cmd(0x80);
- for(i=0;i<16;i++)//液晶显示初始化
- {
- LCD_Write_Data(str1[i]);
- }
- LCD_Write_Cmd(0x80+0x40);
- for(i=0;i<16;i++)
- {
- LCD_Write_Data(str2[i]);
- }
- }
- }
- if(flag==1) //按下确定键,将数值送给DA,开始工作
- {
- key_value=bai*100+shi*10+ge;
- key_value=key_value/100/2/5*255;
- set_value=(u8)key_value;//将按键输入值变成整形赋给变量
-
- DAC_Conversion(0x90,0x40,set_value) ; //DAC转换
- delay(100);
-
- ADC_Send_Byte(0x90,0x41);//通道一ADC转换
- delay(100);
- back_voltage1=ADC_Receive_Byte(0x90);
-
- ADC_Send_Byte(0x90,0x40);//通道二ADC转换
- delay(100);
- back_voltage2=ADC_Receive_Byte(0x90);//
-
-
- back_voltage1=back_voltage1*1000/255;//将输出反馈值扩大二倍,使小数点后保留二位有效数据
- LCD_Manifest(2,5,back_voltage1/100);//输出反馈值个位
- LCD_Manifest(2,7,back_voltage1%100/10);//输出反馈值小数点第一位
- LCD_Manifest(2,8,back_voltage1%10);//输出反馈值小数点第二位
-
- back_current=back_voltage2/255*5/21/0.1*100;
- LCD_Manifest(2,12,back_current/100);//输出电流值个位
- LCD_Manifest(2,14,back_current%100/10);//输出电流值小数点第一位
- LCD_Manifest(2,15,back_current%10);//输出电流值小数点第二位
-
- }
- }
- }
复制代码
所有资料51hei提供下载:
CtrlByDigital.rar
(20.78 KB, 下载次数: 48)
|