//本程序主要演示了
//1、12864液晶的编程与使用,包括显示定位、4位整数、显示浮点数等
//2、STC12C5A32S2单片机的ADC 采样功能(以第0、1通道为例)
//
//注:本示例仅仅演示如何进行ADC 和显示,每ADC 一次就显示一次,实际应用时,
//应多次ADC 并进行相应处理,比如取平均值后,才能得到比较稳定的AD 值
//广西民族大学物电学院李映超2010.5.26
#include <reg52.h>
#include<intrins.h>
#include<lcd12864s.h>
#define uint unsigned int
#define uchar unsigned char
sbit light=P2^7;//定义工作指示灯与单片机的连接脚
//---------与STC12C5A32S2单片机ADC 相关的寄存器声明------------------
sfr P1ASF =0x9d; //P1口模数转换功能控制寄存器
sfr ADC_ConTR =0xbc; //AD 转换控制寄存器
sfr ADC_RES =0xbd; //AD 转换结果寄存器高
sfr ADC_RESL =0xbe; //AD 转换结果寄存器低
sfr AURX1 =0xa2; //AD 转换结果存储方式控制位
//------------------------------------------------------------------
//P1ASF 寄存器:8位,对应P1口8根口线,用于指定哪根口线用作ADC 功能
//哪个口用作ADC 就应置相应的位为“1”,注意:不能位寻址
//------------------------------------------------------------------
#define ADC_POWER 0x80 //ADC 电源开
#define ADC_SPEED 0x60 //设为90个时钟周期ADC 一次
#define ADC_START 0x08 //ADC 启动控制位设为开
#define ADC_FLAG 0x10 //ADC 结束标志位
//-------------------------------------------------------------
void ADC_int(uchar n) //第n 通道ADC 初始化函数
{
n&=0x07; //确保n=0----7通道
AURX1|=0x04; //转换结果存储格式:数据的高2位放ADC_RES,低8位放ADC_RESL
P1ASF=1<<n; //将P1.n 设为ADC 采样功能
}
//---------------------------------------------------------------
uint ADC_GET(unsigned char n) //第n 通道ADC 采样函数
{
unsigned int adc_data;
n&=0x07; //确保n=0----7通道
ADC_RES=0; //清零
ADC_RESL=0; //清零
ADC_ConTR=0; //清零,以便重构
ADC_ConTR|=(ADC_POWER|ADC_SPEED|n|ADC_START); //打开AD 转换电源,设定转换速度、设定通道号、AD 转换开始
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //延时4个时钟周期左右
while(!(ADC_CONTR&ADC_FLAG)); //等待转换结束=0x10 ADC_FLAG 位=1
adc_data=(ADC_RES&0x03)*256+ADC_RESL; //转换结果计算,取高位结果存储器的低2位+ 低位结果存储器
ADC_CONTR&=~ADC_FLAG;//清零转换结束标志位(ADC_FLAG 位=0)
return adc_data; //返回ADC 的值(0----1023)
}
void lcd_4_char(unsigned int data_4_char) //在1602LCD 上显示一个4位的整数
{
unsigned char lcd_table[4];
lcd_table[0]=data_4_char/1000; //获得千位的数字
lcd_table[1]=data_4_char%1000/100; //获得百位的数字
lcd_table[2]=data_4_char%100/10; //获得十位的数字
lcd_table[3]=data_4_char%10; //获得个位的数字
Lcd_WriteData(lcd_table[0]+0x30); //显示千位
Lcd_WriteData(lcd_table[1]+0x30); //显示百位
Lcd_WriteData(lcd_table[2]+0x30); //显示十位
Lcd_WriteData(lcd_table[3]+0x30); //显示个位
}
void main()
{ unsigned int ad_0,ad_1;
ad_0=0;
ad_1=0;
Lcd_Init(); //12864液晶模块初始化
light=0;delayms(1000);light=1; //灯闪一下,表示上电准备工作
ADC_int(0); //ADC 通道0初始化
ADC_int(1); //ADC 通道1初始化
while(1)
{
ad_0=ADC_GET(0);//第0通道进行ADC 采样
ad_1=ADC_GET(1);
hanzi_disp(0,1,"单片机转换");
hanzi_disp(1,0,"通道0:");
lcd_4_char(ad_0);
//while(1){;};
//delay_ms(30000);
hanzi_disp(2,0,"通道1:");
lcd_4_char(ad_1);
hanzi_disp(3,1,"--------");
//delayms(1000); //适当延时后再进行下一循环
}
}
双路供电就是一个负载有两个电源可以给它供电,两个电源之间可以切换,在其中一个电源失电的情况下可以投切到另个电源供电 .
不知道是否对题,题目太广义了点.希望是你想要的
这样的话我说的就没有错了。
需要有一个双回路投切开关。
回答者:zhanggaolei08 - 举人 五级 12-27 17:11