#include<reg51.h> 2 //#include<DAC0832.c> 3 //#include<ADC0832.c> 4 //#include <absacc.h> 5 #define uchar unsigned char 6 #define uint unsigned int 7 //#define DAC0832 XBYTE[0xfffe] 8 /************I/O口定义*********/ 9 sbit CS=P2^3; //ADC0832的片选端 10 sbit CLK=P2^2; //时钟端 11 sbit DIO=P2^1; //数据输入输出端 12 sbit up=P2^7; 13 sbit down=P3^0; 14 sbit L1=P2^4; 15 sbit L2=P2^5; 16 sbit L3=P2^6; 17 sbit WR2=P2^0; 18 sbit LED1=P2^7; 19 sbit LED2=P3^7; 20 uint cdi=0x68; 21 uchar key=0; 22 uint ge,dian,xiao1,xiao2; 23 uchar code table[]={ //共阳数码管显示定义 24 0x03,0x9f,0x25,0x0d, 25 0x99,0x49,0x41,0x1f, 26 0x01,0x09}; 27 void delay(); 28 uint A_D(); 29 void display(); 30 void DAC(); 31 void key_test(); 32 33 void delay(uchar i) //i=1延迟1ms 34 { 35 1 uchar a,b,c; 36 1 for(c=i;c>0;c--) 37 1 for(b=142;b>0;b--) 38 1 for(a=2;a>0;a--); 39 1 } 40 /***** 41 *函数名称: void dispaly1() 42 *输入参数: 共0个参数; 43 *输出参数: 共0个参数; 44 *返回值: 无; 45 *需储存的参数: 共0个参数; 46 *功能介绍: 显示电压值 47 *****/ 48 void display() 49 { 50 1 P1=table[ge]&0xfe; 51 1 P1=table[ge]&0xfe; //显示整数位,与0x01是为了显示小数点 52 1 L1=1; 53 1 delay(1); 54 1 L1=0; 55 1 P1=table[xiao1]; //显示小数点后第一位 C51 COMPILER V9.01 WENYAYUAN 03/22/2012 13:38:37 PAGE 2 56 1 L2=1; 57 1 delay(1); 58 1 L2=0; 59 1 P1=table[xiao2]; //显示小数点后第二位, 60 1 L3=1; 61 1 delay(1); 62 1 L3=0; 63 1 64 1 } 65 66 67 /***** 68 *函数名称: uchar A_D() 69 *输入参数: 共0个参数; 70 *输出参数: 共0个参数; 71 *返回值: 有; 72 *需储存的参数: 共0个参数; 73 *功能介绍: 采集电压 74 *****/ 75 uint A_D() 76 { 77 1 uint dat; 78 1 uchar i; 79 1 CS=1; //一个转换周期开始 80 1 CLK=0; //为第一个脉冲准备 81 1 CS=0; //CS置0,片选有效 82 1 DIO=1; //DIO置1,规定起始信号 83 1 CLK=1; //第一个脉冲 84 1 CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平 85 1 DIO=1; //DIO置1,通道选择信号 86 1 CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入 87 1 //两位数据用于选择通道,这里选通道CH1 88 1 CLK=0; //第二个脉冲下降沿 89 1 DIO=1;//DI置1,选择通道1 90 1 CLK=1;//第三个脉冲 91 1 CLK=0;//第三个脉冲下降沿 92 1 DIO=1;//第三个脉冲下沉沿之后,输入端DIO失去作用,应置1 93 1 CLK=1;//第四个脉冲 94 1 for(i=0;i<8;i++) //高位在前,循环8次读出8位数据 95 1 { 96 2 CLK=1; //第四个脉冲 97 2 CLK=0; 98 2 dat<<=1; //将下面存储的低位数据右移 99 2 dat|=(uchar)DIO; //将输出数据DIO通过或运算存储在dat最低位 100 2 } 101 1 CS=1;//片选无效 102 1 return dat; 103 1 } 104 105 void DAC() 106 { 107 1 P0 = cdi; 108 1 WR2=0; 109 1 WR2=1; 110 1 } 111 112 /***** 113 *函数名称: void key_test() 114 *输入参数: 共0个参数; 115 *输出参数: 共0个参数; 116 *返回值: 无; 117 *需储存的参数: 共0个参数; C51 COMPILER V9.01 WENYAYUAN 03/22/2012 13:38:37 PAGE 3 118 *功能介绍: 键盘扫描程序,采用行反转法对键盘进行扫描,确定键值 119 *****/ 120 void key_test() 121 { 122 1 uchar temp=0; 123 1 P3=0x0f; 124 1 if((P3&0x0f)!=0x0f) 125 1 { 126 2 delay(10); //去抖 127 2 if((P3&0x0f)!=0x0f) 128 2 { 129 3 temp=P3; 130 3 P3=0x70; 131 3 temp=temp|P3; //将行列值或即可得到每个键的编码 132 3 switch(temp) 133 3 { 134 4 case 0x3e:key=1;break; //1 135 4 case 0x5e:key=2;break; //2 136 4 case 0x6e:key=3;break; //3 137 4 case 0x3d:key=4;break; //4 138 4 case 0x5d:key=5;break; //5 139 4 case 0x6d:key=6;break; //6 140 4 case 0x3b:key=7;break; //7 141 4 case 0x5b:key=8;break; //8 142 4 case 0x6b:key=9;break; //9 143 4 case 0x37:key=10;break; //* 144 4 case 0x57:key=0;break; //0 145 4 case 0x67:key=11;break; //# 146 4 default:key=12; 147 4 } 148 3 while((P3&0x70)!=0x70); //判断松手检测 149 3 } 150 2 } 151 1 } 152 153 154 void main() 155 { 156 1 uchar i=0,flag=0; 157 1 uint dy; 158 1 uint num=0,num2; 159 1 LED1=1; 160 1 DAC(); 161 1 delay(1); 162 1 dy=A_D()*9/5; 163 1 ge=dy/51; // 计算整数部分 164 1 dian=(dy%51)*100/51; //计算小数部分 165 1 xiao1=dian/10; //取小数点后第一位 166 1 xiao2=dian; //去小数点后第二位 167 1 display(); 168 1 while(1) 169 1 { 170 2 P3=0x0f; 171 2 if((P3&0x0f)!=0x0f) 172 2 { 173 3 key_test(); 174 3 if(key<=9) 175 3 { 176 4 if(flag<3) 177 4 num=num*10+key; 178 4 if(num>=900) 179 4 num=900; C51 COMPILER V9.01 WENYAYUAN 03/22/2012 13:38:37 PAGE 4 180 4 flag++; 181 4 } 182 3 if(key==10); 183 3 LED1=1; 184 3 if(key==11) 185 3 { 186 4 cdi=(num-126)*21/100; 187 4 DAC(); 188 4 delay(1); 189 4 dy=A_D()*9/5; 190 4 ge=dy/51; // 计算整数部分 191 4 dian=(dy%51)*100/51; //计算小数部分 192 4 xiao1=dian/10; //取小数点后第一位 193 4 xiao2=dian; //去小数点后第二位 194 4 num2=ge*100+xiao1*10+xiao2; 195 4 for(i=0;i<5;i++) 196 4 { 197 5 if((num-num2)>1) 198 5 cdi+=1; 199 5 else 200 5 cdi-=1; 201 5 DAC(); 202 5 delay(1); 203 5 dy=A_D()*9/5; 204 5 ge=dy/51; // 计算整数部分 205 5 dian=(dy%51)*100/51; //计算小数部分 206 5 xiao1=dian/10; //取小数点后第一位 207 5 xiao2=dian; //去小数点后第二位 208 5 num2=ge*100+xiao1*10+xiao2; 209 5 } 210 4 flag=0; 211 4 key=0; 212 4 ge=num/100; // 计算整数部分 213 4 dian=num0; //计算小数部分 214 4 xiao1=dian/10; //取小数点后第一位 215 4 xiao2=dian; //去小数点后第二位 216 4 num=0; 217 4 LED1=0; 218 4 } 219 3 } 220 2 display(); 221 2 } 222 1 }
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 部署 yolox 算法使用 deepstream.zip
- 基于webmagic、springboot和mybatis的MagicToe Java爬虫设计源码
- 通过实时流协议 (RTSP) 使用 Yolo、OpenCV 和 Python 进行深度学习的对象检测.zip
- 基于Python和HTML的tb商品列表查询分析设计源码
- 基于国民技术RT-THREAD的MULTInstrument多功能电子测量仪器设计源码
- 基于Java技术的网络报修平台后端设计源码
- 基于Python的美食杰中华菜系数据挖掘与分析设计源码
- 30.STM32_UART_RFID_读卡号_初始化钱包_语音.rar
- 基于Java开发的个人知识库记录系统设计源码
- 通过 LibTorch C++ API 部署 YOLOv5 进行实时对象检测.zip