[C] 纯文本查看 复制代码
#include "reg51.h"
#include "intrins.h"
#define FOSC 18432000L
#define BAUD 9600
typedef unsigned char BYTE;
typedef unsigned int WORD;
BYTE code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit SRCLK=P1^2;
sbit RCLK=P1^3;
sbit SER=P1^4;
sfr AUXR = 0x8e; //辅助寄存器
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高8位结果
sfr ADC_LOW2 = 0xBE; //ADC低2位结果
sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
void InitADC();
void Hc595SendByte(BYTE dat);
BYTE GetADCResult(BYTE ch);
void Delay(WORD n);
BYTE ch=0 ;
void main()
{
InitADC(); //初始化ADC
IE=0xa0; //打开ADC转换中断
while(1)
{
}
}
/*---------------------------------------------
ADC 中断服务程序
---------------------------------------------*/
void adc_isr() interrupt 5 using 1
{
double x;
WORD a,b;
int i;
BYTE outData[3];
ADC_CONTR&=!ADC_FLAG; // 清除ADC中断标志
a=ADC_RES;
b=ADC_LOW2;
a=a*4+b;
x=5.0*a/1023.0;
x=x/1.0;
for(i = 0;i<3;i++)
{
outData
= (unsigned char)x;
x = x - outData;
x = x*10;
}
Hc595SendByte(smgduan[outData[0]]); //此处先让其输出第一位,以测试
Delay(500);
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
}
/*---------------------------------------------
读取ADC结果
---------------------------------------------*/
/*BYTE GetADCResult(BYTE ch)
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
_nop_(); //等待4个NOP
_nop_(); //CLOSE ADC
_nop_();
_nop_();
while(!(ADC_CONTR&ADC_FLAG));
ADC_CONTR&=~ADC_FLAG;
return ADC_RES; //返回ADC结果
} */
/*---------------------------------------------
初始化ADC
---------------------------------------------*/
void InitADC()
{
P1ASF=0x01; //设置P1口为AD口
ADC_RES=0; //清除结果寄存器
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
Delay(20); //ADC上电并延时
}
/*******************************************************************************
* 函 数 名 : Hc595SendByte(u8 dat)
* 函数功能 : 向74H595发送一个字节的数据
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Hc595SendByte(BYTE dat)
{
BYTE a;
SRCLK =1;
RCLK = 1;
for(a=0;a<8;a++) //发送8位数
{
SER = dat >> 7; //从最高位开始发送
dat <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}
/*---------------------------------------------
软件延时
---------------------------------------------*/
void Delay(WORD n)
{
WORD x;
while(n--)
{
x=5000;
while(x--);
}
}