|
|
楼主 |
发表于 2016-12-27 21:48:20
|
显示全部楼层
//数码管舵机测试仪
#include<reg51.h>
//sfr P5=0xC8;
//sfr P2M0=0x96;
//sfr P3M0=0xb2;
sfr P1ASF=0x9D; //声明 P1口模拟功能寄存器
sfr ADC_RES=0xBD; //声明 ADC转换结果寄存器
sfr ADC_CONTR=0xBC;//声明 ADC控制寄存器
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;//声明 P2引脚模式寄存器
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;//声明 P3引脚模式寄存器
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P4 = 0xC0;
sfr P5 = 0xC8;//声明P5引脚寄存器
sbit DA=P5^4; //a=5.4数码管每个引脚
sbit DB=P1^5; // b=1.5 P1.2--1 | B4| 16--P1.1
sbit DC=P3^7; // c=3.7 P1.3--2 |B2 d | 15--P1.0
sbit DD=P1^0; // d=1.0 P1.4--3 |g c | 14--P3.7--txd
sbit DE=P3^2; // e=3.2 P1.5--4 |b B3| 13--P3.6--rxd
sbit DF=P5^5; // f=5.5 P5.4--5 |a g | 12--P3.3
sbit DG=P3^0; // g=1.4 VCC --6 | e | 11--P3.2
sbit DP=P1^6;// P5.5--7 |f B4| 10--P3.1--txd
// GND --8 |______ _| 9 --P3.0--rxd
sbit B1=P3^1; //
sbit B2=P3^3; //
sbit B3=P3^6;
sbit B4=P1^1; //四个数码管的引脚定义
sbit OUT=P1^3;//定义一个输出引脚
sbit KEIL=P1^4;//定义一个按键
unsigned char display_time; //定义变量用于显示次数
unsigned char Data1; //第一个数码管要显示的数据
unsigned char Data2; //第二个数码管要显示的数据
unsigned char Data3; //第三个数码管要显示的数据
unsigned char Data4; //第四个数码管要显示的数据
unsigned char count; //计时
unsigned int adc; //AD转换计算
unsigned int L; //高电平时间
void Delay10us() //@12.000MHz
{
unsigned char i;
i = 27;
while (--i);
}
void delay_n_10us(unsigned int n)//延时n个10us的函数
{
while(n)
{
Delay10us();
n=n-1;//每循环一次n减小1
}
}
void display(unsigned char x)//控制数码管显示内容的函数
{
//判断x的值来决定显示什么
if(x==0){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;DP=0;} //显示“0”
if(x==1){DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;} //显示“1”
if(x==2){DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;DP=0;} //显示“2”
if(x==3){DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;DP=0;} //显示“3”
if(x==4){DA=0;DB=1;DC=1;DD=0;DE=0;DF=1;DG=1;DP=0;} //显示“4”
if(x==5){DA=1;DB=0;DC=1;DD=1;DE=0;DF=1;DG=1;DP=0;} //显示“5”
if(x==6){DA=1;DB=0;DC=1;DD=1;DE=1;DF=1;DG=1;DP=0;} //显示“6”
if(x==7){DA=1;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;} //显示“7”
if(x==8){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=1;DP=0;} //显示“8”
if(x==9){DA=1;DB=1;DC=1;DD=1;DE=0;DF=1;DG=1;DP=0;} //显示“9”
if(x==10){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;DP=1;} //显示“0”带小数点
if(x==11){DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=1;} //显示“1”带小数点
if(x==12){DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;DP=1;} //显示“2”带小数点
if(x==13){DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;DP=1;} //显示“3”带小数点
if(x==14){DA=0;DB=1;DC=1;DD=0;DE=0;DF=1;DG=1;DP=1;} //显示“4”带小数点
if(x==15){DA=1;DB=0;DC=1;DD=1;DE=0;DF=1;DG=1;DP=1;} //显示“5”带小数点
if(x==16){DA=1;DB=0;DC=1;DD=1;DE=1;DF=1;DG=1;DP=1;} //显示“6”带小数点
if(x==17){DA=1;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=1;} //显示“7”带小数点
if(x==18){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=1;DP=1;} //显示“8”带小数点
if(x==19){DA=1;DB=1;DC=1;DD=1;DE=0;DF=1;DG=1;DP=1;} //显示“9”带小数点
}
void main()
{
P1M0=0X31; //1.5 1.4 1.0 0011 0001
P3M0=0x85; //c3.7 e3.2 3.0 1000 0101需要高电平大电流的引脚3.7 3.3、3.2填入数值
P5M0=0X30; //f5.5 a5.4 0011 0000
//P1ASF=0x80; //0000 0100设置P1.7引脚为模拟功能
P1ASF = 0x04; //0000 0100设置P1.2 引脚为模拟功能
while(1)
{
delay_n_10us(400);//系统周期4ms
count=count+1;
if(count>4) //每20ms秒插入一次高电平
{
count=0;
B1=1;B2=1;B3=1;B4=1;//暂时关闭数码管,避免闪烁
ADC_CONTR=0x88+2; //开始P1.2引脚转换
delay_n_10us(5); //等待50us,AD转换完成
adc=ADC_RES; //读取转换结果
L=adc; //转动旋钮,adc的值0~255变化
//L的变化范围是100~200,所以进行一下限制
if(L>200)L=200; //高电平时间不能超过2ms
if(L<100)L=100; //高电平时间不能低于1ms
OUT=1;
delay_n_10us(L);//输出1~2ms高电平
OUT=0; //其他时间为低电平
//显示L的大小
Data1=0;
Data2=L/100; //百位数据
//Data2=Data2+10; //加10,display函数显示的数字会带小数点
Data3=L0/10; //十位数据
Data4=L; //个位数据
}
///////////////////////////////////////////////////////
//显示程序模块化,只需要改变Data1/2/3/4的值就可以控制显示内容
display_time=display_time+1;
if(display_time>3)
{
display_time=0; //0、1、2、3 四个循环
}
if(display_time==0)//第0次显示第一个数码管
{
B1=0;B2=1;B3=1;B4=1;
display(Data1); //显示第1位数据
}
if(display_time==1)//第1次显示第二个数码管
{
B1=1;B2=0;B3=1;B4=1;
display(Data2); //显示第2位数据
}
if(display_time==2)//第2次显示第三个数码管
{
B1=1;B2=1;B3=0;B4=1;
display(Data3); //显示第3位数据
}
if(display_time==3)//第3次显示第四个数码管
{
B1=1;B2=1;B3=1;B4=0;
display(Data4); //显示第4位数据
}
}
}
|
| |