📄 c.c
字号:
//本程序演示从P1.2采集外部电压值进行模数转换,通过P1口显示其二进制值,并通过串口发送
#include<REG51.H>
sfr P1ASF=0x9D;//P1口模拟功能控制寄存器
sfr ADC_CONTR=0xBC;//模数转换控制特殊功能寄存器
sfr ADC_RES=0xBD;//模数转换结果高8位寄存器
sbit led_mcu_start=0xB7;//定义P3.7为工作指示灯
void delay(int x)//延时函数,根据参数x的大小来决定延时的长短
{
while(x--)
;
}
void init_rs232()//初始化串口,使用18.432MHz的晶振,波特率为1200bps
{
TMOD=0x20;
SCON=0x50;
TH1=216;
TL1=216;
TR1=1;
}
void send_byte(unsigned char x)//串口发送一个字节,内容为参数x
{
ES=0;//禁止串口中断
TI=0;
SBUF=x;
while(!TI)
;
TI=0;
}
void adc_power_on()//打开模数转换开关
{
ADC_CONTR=ADC_CONTR|0x80;
delay(20);
}
void set_P12_asf()//设置P1.2为模数转换通道
{
P1ASF=P1ASF|0x04;
}
void set_P12_normal_IO()//设置P1.2为普通I/O口
{
P1ASF=P1ASF&0xFB;
}
void set_adc_channel_2()//模数转换从通道2(P1.2)进行
{
ADC_CONTR=0xE2;
}
void send_ad_result()//发送模数转换结果
{
send_byte(ADC_RES);
}
void get_ad_result()//开始模数转换
{
ADC_CONTR=ADC_CONTR|0x08;//启动模数转换
delay(20);//启动模数转换后,等待4个机器周期方可正确读取ADC_CONTR的值
while(!(ADC_CONTR|0x10))//等待转换完成
;
ADC_CONTR=ADC_CONTR&0xE7;//完成标志位清零,停止模数转换
}
void main()
{
unsigned char i;
led_mcu_start=0;//打开工作指示灯
init_rs232();//初始化串口
adc_power_on();//打开模数转换开关
set_adc_channel_2();//模数转换从通道2(P1.2)进行
while(1)
{
set_P12_asf();//设置P1.2为模数转换通道
get_ad_result();//开始模数转换
send_ad_result();//发送模数转换结果
set_P12_normal_IO();//设置P1.2为普通I/O口
P1=~ADC_RES;//模数转换结果取反,通过P1口的发光数码管显示
for(i=0;i<8;i++)
delay(65535);//延长一段时间
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -