|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 我是天才 于 2016-12-16 21:24 编辑
一直跟着罗丽大神学编程,今晚终于有时间编程了,交一个作业——电压表&舵机测试仪 二合一; 新增一个按键来切换模式,程序没有什么新内容,都是前面的内容的罗列,所以注释不是很详细,程序如下
接线方法:电压表接P1.6,舵机测试仪接P1.7
- #include<reg51.h>
- #include<intrins.h>
- #define u8 unsigned char
- #define u16 unsigned int
- sbit L1=P2^7; //数码管引脚可自行更改
- sbit L2=P2^6;
- sbit L3=P2^5;
- sbit L4=P2^4;
- sbit out=P2^3;
- sbit Key=P1^0; //按键
- sfr P2M0=0x96; //P2引脚模式寄存器
- sfr P1ASF=0x9D; //P1模拟功能寄存器
- sfr ADC_RES=0xBD; //ADC转换结果寄存器
- sfr ADC_CONTR=0xBC; //ADC控制寄存器
- u8 a,b,c,d;
- u16 adc,dc;
- u8 show; //数码管显示
- u16 ppm;
- u16 count; //每过1ms加一,每过20ms归零,ppm周期20ms
- u8 mode; //模式选择
- bit Key_old; //记录按键过去高低电平
- void Delay10us() //@12.000MHz
- {
- unsigned char i;
- _nop_();
- _nop_();
- i = 24;
- while (--i);
- }
- void delay_n_10us(u16 n)
- {
- while(n)
- {
- Delay10us();
- n--;
- }
- }
- void Delay50us() //@12.000MHz
- {
- unsigned char i, j;
- i = 1;
- j = 146;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay1ms() //@12.000MHz
- {
- unsigned char i, j;
- i = 12;
- j = 169;
- do
- {
- while (--j);
- } while (--i);
- }
- u8 code led1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};
- //不带小数点
- u8 code led2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,};
- //带小数点
- void Perform() //数码管显示
- {
- L1=L2=L3=L4=0;
- if(show==0)
- {
- L1=1,L2=0,L3=0,L4=0;
- P0=led1[a];
- }
- if(show==1)
- {
- L1=0,L2=1,L3=0,L4=0;
- if(mode==0)P0=led1; //在模式0下,第二位数码管不显示小数点
- if(mode==1)P0=led2; //在模式1下,第二位数码管显示小数点
- }
- if(show==2)
- {
- L1=0,L2=0,L3=1,L4=0;
- P0=led1[c];
- }
- if(show==3)
- {
- L1=0,L2=0,L3=0,L4=1;
- if(mode==0)P0=0x8c; //在模式0下,数码管最后一位显示P
- if(mode==1)P0=0xc1; //在模式1下,数码管最后一位显示V
- }
- }
- main()
- {
- P2M0=0xf0; //初始化
- a=b=c=d=0;
- show=0;
- count=0;
- L1=L2=L3=L4=0;
- Key_old=1;
- mode=0;
- while(1)
- {
- Delay1ms();
- if(Key==1) //按键按下
- {
- if(Key_old==0)
- {mode++;} //模式加1
- }
- Key_old=Key;
- if(mode>1) //模式大于1,模式归零
- {mode=0;}
- count++;
- show++;
- if(show>3) //数码管显示大于3,显示归零
- {show=0;}
- Perform(); //显示
- if(mode==0) //模式0:舵机测试仪
- {
- if(count>20)
- {
- count=1;
- P1ASF=0x40;
- ADC_CONTR=0x8e; //adc转换引脚选择 000~111代表P1.0-P1.7
- Delay50us();
- adc=ADC_RES;
- ppm=adc*100/256+100;
- a=ppm/100;
- b=ppm%100/10;
- c=ppm%10;
- out=1;
- delay_n_10us(ppm);
- out=0;
- }
- }
- if(mode==1) //模式1:电压表
- {
- P1ASF=0x80;
- ADC_CONTR=0x8f; // adc 实际电压
- Delay50us(); // 256 5v
- adc=ADC_RES; // 158 3.1v
- // adc dc
- adc=adc*3; //将1改成2、3等等,即可获得量程为5v的2、3的倍数
- //此时测量电路则需使用电阻分压,即测量外接电压的1/2,1/3等等
- adc=adc*5; // 按照上面的数据,以单片机供电电压作为基准电压,
- //将adc乘以基准电压5再对adc做如下运算即可得出实际电压
- dc=adc*10/256+adc*10%256/256;
- //将adc乘以10,如果外接3.1v,那么转化结果是31v,在第二个数码管加一个小数点
- //显示的就是3.1v
- a=dc/100; //十位
- b=dc%100/10; //个位
- c=dc%10; //小数位
- }
- }
- }
|
| |