这道单片机的题怎么做?最好详细点有流程
1.模拟输入通道为P1.2脚(ADC2),通过电位器改变输入电压,每秒钟采样4次(采样间隔250ms),只取高8位,采样结果通过串口发送到PC机端,通过串口调试助手接收显...
1.模拟输入通道为P1.2脚(ADC2), 通过电位器改变输入电压,每秒钟采样4次(采样间隔250ms),只取高8位,采样结果通过串口发送到PC机端,通过串口调试助手接收显示。
展开
2个回答
展开全部
这不是什么难事,主要用到定时器、 串口和ADC,但写起来程序也不短。我有类似的可供参,用的是STC12C5608系列单片机。
我编的当然要复杂多了,采集后送液晶屏显示,还保存EEPROM中,定时时间可调 ,采集数据量可调 ,采集完成后发上位机,也可以人工一个一个读取。
程序思路,定时器1作为波特率发生器,另外一个定时器定时50ms中断一次,设一全局变量a赋值为5,每次中断a减1,主程序中等待a为0,即为250ms,然后调 一次AD采集,采集一次即可发送。程序很长,只贴关键部分:
void adchange()//AD采集程序,2路,可改成一路
{
ADC_CONTR=ADC_CONTR|0X80; //10000000 开启转换电源
Delay1ms(1); //延时,等待内部电源稳定
P1M0=P1M0|0X03; //设置p1.0和P1.1所在通道为开/漏模式
P1M1=P1M1|0X03;
ADC_CONTR=0xe0; //11100000 开启P1.0通道开始转换
Delay25us(10); //延时一端时间,使输入电压达到稳定
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
ADC_CONTR |= 0x08; //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束
temp1=ADC_DATA; //暂存转换结果高8位
temp2=ADC_LOW2;暂存转换结果低8位,不过只有后2位有用
//总结果是高8位乘4加低8位
ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零
Delay25us(1);
ADC_CONTR=0xe1; //11100000 开启P1.1通道开始转换
Delay25us(10); //延时一端时间,使输入电压达到稳定
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
ADC_CONTR |= 0x08; //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束
temp3=ADC_DATA; //读取转换结果
temp4=ADC_LOW2;
ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零
Delay25us(1);
P1M0=P1M0&0X00; //设置P1口为普通I/O模式,以便用P1口显示数据。
P1M1=P1M1&0X00;
}
void init1()//定时器初始化设置
{
TMOD=0x21;//设置定时器1为工作方式2定时器0为工作方式1
// AUXR |= 0x40;//定时器2按1T单片机的机器周期工作,否则只能工作在很低的波特率下才能保证误差不超规定
TH1=0xfd;
TL1=0xfd;
//PCON|=0X80;//波特率加倍
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
}
void send(uchar a1) //串口发送程序,一次发1个数据
{
led=0;//这是发送指示灯
SBUF=a1;
while(!TI);
TI=0;
Delay1ms(12);//我用的是1T单片机12ms才相当于普通单片机的1ms
led=1;
}
我编的当然要复杂多了,采集后送液晶屏显示,还保存EEPROM中,定时时间可调 ,采集数据量可调 ,采集完成后发上位机,也可以人工一个一个读取。
程序思路,定时器1作为波特率发生器,另外一个定时器定时50ms中断一次,设一全局变量a赋值为5,每次中断a减1,主程序中等待a为0,即为250ms,然后调 一次AD采集,采集一次即可发送。程序很长,只贴关键部分:
void adchange()//AD采集程序,2路,可改成一路
{
ADC_CONTR=ADC_CONTR|0X80; //10000000 开启转换电源
Delay1ms(1); //延时,等待内部电源稳定
P1M0=P1M0|0X03; //设置p1.0和P1.1所在通道为开/漏模式
P1M1=P1M1|0X03;
ADC_CONTR=0xe0; //11100000 开启P1.0通道开始转换
Delay25us(10); //延时一端时间,使输入电压达到稳定
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
ADC_CONTR |= 0x08; //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束
temp1=ADC_DATA; //暂存转换结果高8位
temp2=ADC_LOW2;暂存转换结果低8位,不过只有后2位有用
//总结果是高8位乘4加低8位
ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零
Delay25us(1);
ADC_CONTR=0xe1; //11100000 开启P1.1通道开始转换
Delay25us(10); //延时一端时间,使输入电压达到稳定
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
ADC_CONTR |= 0x08; //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束
temp3=ADC_DATA; //读取转换结果
temp4=ADC_LOW2;
ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零
Delay25us(1);
P1M0=P1M0&0X00; //设置P1口为普通I/O模式,以便用P1口显示数据。
P1M1=P1M1&0X00;
}
void init1()//定时器初始化设置
{
TMOD=0x21;//设置定时器1为工作方式2定时器0为工作方式1
// AUXR |= 0x40;//定时器2按1T单片机的机器周期工作,否则只能工作在很低的波特率下才能保证误差不超规定
TH1=0xfd;
TL1=0xfd;
//PCON|=0X80;//波特率加倍
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
}
void send(uchar a1) //串口发送程序,一次发1个数据
{
led=0;//这是发送指示灯
SBUF=a1;
while(!TI);
TI=0;
Delay1ms(12);//我用的是1T单片机12ms才相当于普通单片机的1ms
led=1;
}
追问
有程序吗?,这当初是课堂上的实验题,后来我实验本弄丢了,找不到。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询