📄 adc_main.c
字号:
#include<reg51.h>
sfr ADC_CONTR =0XC5;//A/D转换控制寄存器?
sfr AD_DATAH =0XC6;//A/D转换结果高八位寄存器
sfr AD_DATAL =0XBE;//A/D转换结果低二位寄存器
sfr P1M0 =0X91;//P1口模式寄存器0
sfr P1M1 =0X92;//P1口模式寄存器1
unsigned char code MCU_ID = 0x01;//从机模式(现地)机器号,(0x01~0xFF)
unsigned char c[4]; //数组C用来存放主机发来的主机真
unsigned char d[11];//数组D用来存放从机真==
unsigned int ADC_DATA;
unsigned char b[8];//
//unsigned char k;
//unsigned char MydataL;
//unsigned char MydataH;
unsigned long ad2;
unsigned long ad1;
float adcc;
//float sum1=0;
void Delay_10ms(void); //延时函数,延时10ms
void Set_ADC_P1_7(void); //将P1.7设置为适宜A/D转化的模式,高阻输入
void Init_UART(void); //串口初始化
void ADC(void); //A/D采样函数。
void Send_Byte(void); //向主机发送采样结果
void Send_Char(unsigned char ch);//发送一个字符
void Format_ADC_Data(void); //模拟电压值转化成从机砧
unsigned char Receive_Char(void);//接受一个字符
void operation();//将采样得来的数字值按要求处理成实际模拟值
unsigned char code error[4] = {0x10,0x11,0x00,0x21};
// 函数名称: void main()主函数
void main()
{
unsigned char i=0;
unsigned int sdlh = 0;//前二个字节的和
unsigned char csl = 0; //累加和的低字节
unsigned char csh = 0; //累加和的高字节
// MydataL = 0;
// MydataH = 0;
Init_UART( ); //串口初始化函数
Set_ADC_P1_7( ); //设置P1.0为高阻输入
EA=1; //开放总允许中断
while(1)
{
for(i = 0;i<4;i++)
c[i] = Receive_Char(); //接受主机命令字
sdlh = c[0] + c[1];
csl = sdlh & 0x00ff;
csh = (sdlh & 0xff00)>>4;
if(csh == c[2] && csl == c[3] && c[0] == 0x10 && c[1]==MCU_ID)//正确接受命令
{
ADC();
// MydataL = ADC_DATA;
// MydataH = ADC_DATA>>8;
// Send_Char(MydataH);//单测试AD转换数据的高8位
// Send_Char(MydataL);//单测试AD转换数据的低2位
operation();
Format_ADC_Data();
Send_Byte();
}
else
{
for(i = 0;i<4;i++)
Send_Char(error[i]);// 向主机发送从新发送命令字
}
}
}
//---------------------------------------------------------------
// 函数名称: delay10ms(void)
// 函数功能: 延时ms函数
//---------------------------------------------------------------
void Delay_10ms(void)
{
unsigned char k;
for(k=10;k>0;k--);
}
//---------------------------------------------------------------
// 函数名称: set_P1_channel()
// 函数功能: 将P1.0设置为适宜A/D转化的模式,高阻输入
//---------------------------------------------------------------
void Set_ADC_P1_7(void)
{
P1 = 0xff;//
ADC_CONTR = ADC_CONTR|0x80;
Delay_10ms();
P1M0 = 0x80;
P1M1 = 0x80;
ADC_CONTR = ADC_CONTR|0xC7;
Delay_10ms();
}
//---------------------------------------------------------------
// 函数名称: initiate_rs()
// 函数功能: 串口初始化,设置定时器1为波特率发生器,且无奇偶校验,
// 系统外部晶振为11.0592,波特率为9600
//---------------------------------------------------------------
void Init_UART(void)
{
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
TI = 1;
RI = 0;
}
//---------------------------------------------------------------
// 函数名称: putch(unsigned char ch)
// 函数功能: 发送一个字符函数
//---------------------------------------------------------------
void Send_Char(unsigned char ch)
{
SBUF = ch;
TI = 0;
while(!TI);
}
//---------------------------------------------------------------
// 函数名称: ad() A/D采样函数
// 函数功能: 从P1.0口采样模拟电压值,连续采样20次在求其平均值,
// 最后为采样结果
//---------------------------------------------------------------
void ADC(void) // A/D采样函数
{
unsigned count;
unsigned int sum = 0;
unsigned int sum_Temp = 0;
unsigned char test;
for(count=0;count<20;count++)
{
AD_DATAH=0x00;
AD_DATAL=0X00;
test=0x00;
ADC_CONTR=ADC_CONTR|0x08;//启动AD转换
Delay_10ms();
do
{
test=ADC_CONTR&0x10;
}while( test == 0);//等待AD转换结束,否则继续等待
ADC_CONTR=ADC_CONTR&0xE7;//清AD标志、启动位,停止AS转换
sum_Temp = AD_DATAH;
sum_Temp = (sum_Temp<<2)+AD_DATAL;
sum = sum+sum_Temp;
}
ADC_DATA = sum/20;
}
//---------------------------------------------------------------
// 函数名称: operation()
// 函数功能: 将采样得来的10位数字值按要求处理成模拟电压值
//---------------------------------------------------------------
void operation(void)
{
int kk = 0;
unsigned char i;
adcc = ADC_DATA * 0.0048828125;
for(i = 0;i < 6;i++)
b[i] = 0;
adcc = adcc * 1000000;
if(adcc == 0)
return;
ad2 =(long)adcc;
while(ad2 != 0)
{
b[kk++] = ad2%10;
ad2 = ad2 / 10;
}
}
//---------------------------------------------------------------
// 函数名称: unsigned char getch(void)
// 函数功能: 从机接受一个字符。
//---------------------------------------------------------------
unsigned char Receive_Char(void)// 接受一个字符
{
while(!RI);
RI = 0;
return(SBUF);
}
//---------------------------------------------------------------
// 函数名称: send_uart()
// 函数功能: 将采样得来的模拟电压值转化成从机格式
//---------------------------------------------------------------
void Format_ADC_Data(void)
{
unsigned int cshcsl;
d[0] = 0x10;
d[1] = 0x01;
d[2] = 0x00;
d[3] = 0x00;
d[4] = b[6];
d[5] = b[5] * 10 + b[4];
d[6] = b[3] * 10 + b[2];
d[7] = b[1] * 10 + b[0];
cshcsl = 0x10 + 0x01 + 0x00 + 0x00 + b[6] + (b[5] * 10 + b[4]) + (b[3] * 10 + b[2]) + (b[1] * 10 + b[0]);
d[8] = (cshcsl & 0xff00) >> 4;
d[9] = cshcsl & 0x00ff;
}
//---------------------------------------------------------------
// 函数名称: send_byte()
// 函数功能: 将从机机桢发送给主机
//---------------------------------------------------------------
void Send_Byte(void)
{
unsigned char i;
for(i = 0;i < 10;i++)
Send_Char(d[i]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -