本帖最后由 ahao 于 2011-10-22 22:10 编辑
C程序如下红字部分。
#include //头文件
#include "STC_NEW_8051.H" //STC自己的头文件
#define uint unsigned int //宏定义
#define uchar unsigned char
uint abc,tongd0,tongd7; //定义uint型变量
uchar tt0; //定义uchar型变量
sbit gewei=P2^0; //个十百千位的位声明
sbit shiwei=P2^1;
sbit baiwei=P2^2;
sbit qianwei=P2^3;
sbit dian=P0^7; //小数点点声明
uchar code led[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //定义0-9数字的编码
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void display() //显示函数
{
qianwei=0; //显示千位
P0=led[abc/1000];
dian=0;
delay(50);
qianwei=1;
baiwei=0; //显示百位
P0=led[abc%1000/100];
delay(50);
baiwei=1;
shiwei=0; //显示十位
P0=led[abc%100/10];
delay(50);
shiwei=1;
gewei=0; //显示个位
P0=led[abc%10];
delay(50);
gewei=1;
}
//以下直接引用自STC的网站数模转换的例子-------------------------------------
//以下选择 ADC 转换速率,只能选择其中一种
//SPEED1 SPEED0 A/D转换所需时间
#define AD_SPEED 0x60 // 0110,0000 1 1 70 个时钟周期转换一次,
//CPU工作频率21MHz时 A/D转换速度约 300KHz
//#define AD_SPEED 0x40 //0100,0000 1 0 140 个时钟周期转换一次
//#define AD_SPEED 0x20 //0010,0000 0 1 280 个时钟周期转换一次
//#define AD_SPEED 0x00 //0000,0000 0 0 420 个时钟周期转换一次
uint get_AD_result(uchar channel) //模数转换程序
{
uchar AD_finished=0; //存储 A/D 转换标志
ADC_RES = 0;
ADC_RESL = 0;
channel &= 0x07; //0000,0111 清0高5位
ADC_CONTR = AD_SPEED;
_nop_();
ADC_CONTR |= channel; //选择 A/D 当前通道
_nop_();
ADC_CONTR |= 0x80; //启动 A/D 电源
delay(1); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,
AD_finished = 0;
while (AD_finished ==0 ) //等待A/D转换结束
{
AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
}
ADC_CONTR &= 0xE7; //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,
return (ADC_RES*4+ADC_RESL); //返回 A/D 高8位+低2位转换结果
}
//------下面是主函数--------
void main() //主程序
{ //进入主程序后先对定时器初始化
TMOD=0x01; //设定定时器0工作方式
TH0=(65536-10000)/256; //定时器0高8位装初值 12M晶振定时10毫秒
TL0=(65536-10000)%256; //定时器0低8位装初值
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
EA=1; //开总中断
P1ASF = 0x81; //1000,0001, 将 P1.0 P1.7 置成模拟口
// ADRJ = AUXR1^2:
// 0: 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
// 1: 10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器
AUXR1 &= ~0x04; //0000,0100, 令 ADRJ=0
// AUXR1 |= 0x04; //0000,0100, 令 ADRJ=1
ADC_CONTR |= 0x80; //1000,0000 打开 A/D 转换电源
while(1)
{
abc=(tongd0*1.0/tongd7)*2500; //让abc等于通道0和通道7转换后的运算结果
display(); //显示具体数字
}
}
void timer0() interrupt 1 //定时器0服务程序
{
TH0=(65536-10000)/256; //再装一次初值
TL0=(65536-10000)%256;
tt0++;
if(tt0==20) //200ms转换一次
{
tt0=0;
tongd0=get_AD_result(0); //转换P0.0通道
tongd7=get_AD_result(7); //转换P0.7通道
}
}