📄 de.c
字号:
/**********************************************************************
/* 文件名称: de.C
/* 文件标识: none
/* 适用器件: C8051F120
/* 摘 要:本文件是按S1,S3,DA0输出(1V);按S2,S4,DA1有1.7V输出.每间隔1S,AIN0,AIN1通过串口分别显示输入电压.
/* ;AIN0的电压由DA0提供,AIN1的电压由DA1提供;使用外部22.1184MHz晶振.
/* 当前版本:1.0
/* 作 者:李国涛
/* 完成日期:2007年12月4日
/***********************************************************************/
/**********************************************************************/
//INCLUDE引用外部头文件
#include <c8051f120_VarantReg.h>
#include <ABSACC.H>
#include "da-i.c"
#include <string.h>
#include <stdio.h>
/**********************************************************************/
/**********************************************************************
// 常量及全局变量定义
************************************************************************/
long result[2];
long mopt[2];
unsigned long voltage;
uchar key; //key 是执行keyscan读取的值
long temp; //为ADC转换后的值
uchar temp1; //temp是执行KeySPI1的结果
uchar send_flag;
uchar temp0; //temp是执行KeySPI的结果;
uchar rs232_send_size;
uchar dat[20];
uchar dac_value[4];
uchar channel0_flag;
uchar channel1_flag;
/* TIMER0 INI */
bit time_1ms_flag;
bit time_10ms_flag;
bit time_50ms_flag;
bit time_100ms_flag;
bit time_500ms_flag;
bit time_1s_flag;
bit time_60s_flag;
uchar time_1ms;
uchar time_10ms;
uchar time_50ms;
uchar time_100ms;
uchar time_500ms;
uchar time_1s;
uchar time_60s;
/**********************************************************************
* 函数名称:delay();
*
* 函数功能描述:是一个延时程序;
*
* 输入参数:x1
*
* 返回数据:none;
***********************************************************************/
void delay(int x1)
{
unsigned int y1;
for (y1=1;y1<x1;y1++);
}
/*********************************************************************
* 函数名称:getkey();
*
* 函数功能描述:按键的扫描判断与取值
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注 意:none;
**********************************************************************/
unsigned char getkey(void)
{
uchar h; //行扫描值
uchar l; //列扫描值
SFRPAGE=0x0f ;
P5=0xF0; //P5.0~P5.3 发全0.准备读列的状态
if((P5&0xF0)!=0xF0) //如果P5.4~P5.7不全为1,可能有键按下
{
delay(100);
delay(100); //延时去抖动
if((P5&0xF0) != 0xF0) //重读高4位,如果还是不全为1,有按键按下
{
h=0xFE; //P5.0置0,开始行扫描
while((h&0x10)!=0xF0) //判断是否为最后一行,若不是继续扫描=F0的时候表示没有到最后一行;
{ //如果为F0,那么还没有到最后一行;如果不为F0那么就已经到最后一行;
P5=h;
delay(100);
SFRPAGE=0x0f;
if((P5&0xF0) != 0xF0) //如果P5.4~P5.7不全为1,可能有键按下
{
l=((P5&0xF0)|0x0F); //保留P5口高四位.低四位变为1,作为列值
delay(100);
return ((~h)+(~l)); //按键值=行扫描值+列扫描值
}
else //如果该行无键按下,行扫描值左移.扫描下一行
h=(h<<1)|0x01; //这样做保证每一次就只有一位为"0"
}
}
}
return 0; //无键按下,返回0
}
/**********************************************************************
* 函数名称:keyup();
*
* 函数功能描述:按键的释放;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注 意:none;
**********************************************************************/
uchar keyup(void)
{
unsigned char val=0xff;
val=getkey();
if(val != 0)
{
while(1)
{
if(val!=getkey())break;
}
}
return val;
}
/*********************************************************************
* DAC0_Init :
*
* 1V=0X06AAH ;1.7V =0X0B54H ; 电压值 ;
*
* Return Value : None
*
* Parameters : None
*
* Configure DAC0 to update on write to
*
* REF0CN
*********************************************************************/
void DAC0_Init(void)
{
SFRPAGE = DAC0_PAGE; //DAC_PAGE包含DAC0的初始化/.
DAC0L=dac_value[0];
DAC0H=dac_value[1];
}
/********************************************************************
* DAC1_Init :
*
* Return Value : None
*
* Parameters : None
*
* Configure DAC1 to update on write to
********************************************************************/
void DAC1_Init(void)
{
SFRPAGE = DAC1_PAGE;
DAC1L=dac_value[2];
DAC1H=dac_value[3];
}
/*******************************************************************
* 函数名称:ADC0_Init
*
* 函数功能描述:ADC0 采样初始化,输入通道AIN0.0
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
*
*******************************************************************/
void ADC0_Init(void)
{
char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = ADC0_PAGE;
ADC0CF |= 0x88; //ADC转换时钟= 2.45MHz
EIE2 |= 0x02; // 关闭ADC中断
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***************************************************************
* 函数名称:ADC0_enable
*
* 函数功能描述:ADC0开关,1:打开;0:关闭
*
* 输入参数:1:打开;0:关闭
*
* 返回数据:none;
*
* 注意: none;
***************************************************************/
void ADC0_enable(unsigned char flag)
{
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
if(flag)
{
AD0EN = 1; // 打开ADC
EA = 1; // 开启全局中断
}
else
{
AD0EN = 0; // 关闭ADC
}
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/****************************************************************
* 函数名称:ADC0_Conver
*
* 函数功能描述:读取AD数据
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
******************************************************************/
void ADC0_Conver (void)
{
unsigned char i=0; // ADC mux 通道 (0-1)
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = ADC0_PAGE; // set SFR page F
for (i=0;i<2;i++)
{
AMX0SL = i; // 设置mux到通道
delay(1000);
AD0INT = 0; // 清除ADC转换完成标志
AD0BUSY = 1;
while (!AD0INT);
temp = ADC0H;
temp = temp*256 + ADC0L;
result[i] = temp; // 读ADC值
}
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/*******************************************************************
* 函数名称:Uart0_Enable;
*
* 函数功能描述:Uart0初始化;
*
* 输入参数:,打开输入1;关闭输入0;
*
* 返回数据:none;
*
* 注意: none;
********************************************************************/
void Uart0_Enable( Flag)
{
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = UART0_PAGE;
if(Flag)
{
TR1=1; // 打开串口Uart0
}
else
{
TR1=0; // 关闭串口Uart0
}
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/*******************************************************************
* TIMER0
*
*定时器0;
********************************************************************/
void timer0() interrupt 1
{
TH0=0xfa;
TL0=0x00; //1ms的初始值
time_1ms_flag=1;
time_10ms++;
if(time_10ms == 10)
{
time_50ms++;
time_10ms=0;
time_10ms_flag=1;
}
if(time_50ms == 5) //设置50ms扫描一次键盘
{
time_100ms++;
time_50ms = 0;
time_50ms_flag = 1;
key=keyup(); //按键扫描
if( key!= 0 ) //判断是否有按键按下
{
send_flag = 1;
}
}
if(time_100ms == 2)
{time_500ms++;time_100ms=0;time_100ms_flag=1;}
if(time_500ms == 5)
{time_1s++;time_500ms=0;time_500ms_flag=1;}
if(time_1s == 2)
{time_60s++;time_1s=0;time_1s_flag=1;}
if(time_60s == 60)
{time_60s=0;time_60s_flag=1;}
}
/*******************************************************************
* 函数名称:value_change
*
* 函数功能描述:ADC转换后的电压变换处理。
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:none;
********************************************************************/
uchar value_change()
{
int i;
if(channel0_flag==1)
{
DAC0_Init();
DAC1_Init();
delay(300);
{
ADC0_Conver();
i=0;
{
EA=0;
voltage=result[0]; //读取值。
EA=1;
voltage=2450*voltage;
voltage=voltage>>12;
voltage=voltage/100;
mopt[0]=voltage;
EA=0;
}
ADC0_Conver();
i=0;
{
EA=0;
voltage=result[0]; //读取值。
EA=1;
voltage=2450*voltage;
voltage=voltage>>12;
voltage=voltage/100;
mopt[0]=voltage;
EA=0;
}
ADC0_Conver();
i=0;
{
EA=0;
voltage=result[0]; //读取值。
EA=1;
voltage=2450*voltage;
voltage=voltage>>12;
voltage=voltage/100;
mopt[0]=voltage;
EA=0;
}
}
delay(300);
channel0_flag=0;
}
if(channel1_flag==1)
{ DAC0_Init();
DAC1_Init();
delay(300);
ADC0_Conver();
i=1;
{
EA=0;
voltage=result[i]; //读取值。
EA=1;
voltage=2450*voltage;
voltage=voltage>>12;
voltage=voltage/100;
mopt[i]=voltage;
EA=0;
}
ADC0_Conver();
i=1;
{
EA=0;
voltage=result[i]; //读取值。
EA=1;
voltage=2450*voltage;
voltage=voltage>>12;
voltage=voltage/100;
mopt[i]=voltage;
EA=0;
}
ADC0_Conver();
i=1;
{
EA=0;
voltage=result[i]; //读取值。
EA=1;
voltage=2450*voltage;
voltage=voltage>>12;
voltage=voltage/100;
mopt[i]=voltage;
EA=0;
}
channel1_flag=0;
}
strcpy(dat,"AIN1=");
dat[5]=(uchar)(mopt[0]/10)+0x30;
dat[6]='.';
dat[7]=(uchar)(mopt[0] % 10)+0x30;
dat[8]='V';
dat[9]=','; //AIN1=x.xV, AIN2=x.xV
dat[10]='A';
dat[11]='I';
dat[12]='N';
dat[13]='2';
dat[14]='=';
dat[15]=(uchar)(mopt[1]/10)+0x30;
dat[16]='.';
dat[17]=(uchar)(mopt[1] % 10)+0x30;
dat[18]='V';
delay(500);
return 1;
}
/*******************************************************************
* 函数名称:send_232;
*
* 函数功能描述:向232发送字符到SBUF0;
********************************************************************/
void send_232(send_232_end,uchar send_232_code[])
{
if(rs232_send_size<send_232_end)
{
SBUF0=send_232_code[rs232_send_size];
rs232_send_size++;
}
}
/*******************************************************************
* 函数名称:serial_0();
*
* 函数功能描述:UART0采用定时中断的方式通过串0口发送字符,
*
* 输入参数:none
*
* 返回数据:none;
********************************************************************/
void serial_0(void) interrupt 4
{
if ( TI0 )
{
send_232(sizeof(dat),&dat);
TI0=0;
}
if ( RI0 )
{
RI0=0;
}
}
/*******************************************************************
*主循环程序
*
********************************************************************/
main()
{
uchar i=0;
uchar dat[20];
DAC0L=0;
DAC0H=0;
DAC1L=0;
DAC1H=0;
memset(dat,0,sizeof(dat));
Init_Device();
Uart0_Enable(1);
ADC0_Init();
ADC0_enable(1);
while(1)
{
if(send_flag== 1)
{
switch(key)
{
case 0x11:
dac_value[0]=0xaa;
dac_value[1]=0x06;
dac_value[2]=0;
dac_value[3]=0;
channel0_flag=1;
break;
case 0x21:
dac_value[0]=0x54;
dac_value[1]=0x0b;
dac_value[2]=0;
dac_value[3]=0;
channel0_flag=1;
break;
case 0x41:
dac_value[0]=0;
dac_value[1]=0;
dac_value[2]=0xaa;
dac_value[3]=0x06;
channel1_flag=1;
break;
case 0x81:
dac_value[0]=0;
dac_value[1]=0;
dac_value[2]=0x54;
dac_value[3]=0x0b;
channel1_flag=1;
break;
default:
DAC0L=0;
DAC0H=0;
DAC1L=0;
DAC1H=0;
break;
}
send_flag= 0;
}
EA=1;
value_change();
delay(500);
if(time_1s_flag==1)
{
rs232_send_size=0;
SFRPAGE=UART0_PAGE;
delay(100);
TI0=1;
time_1s_flag=0;
}
if(time_1ms_flag==1)
{
P3_5=~P3_5;
P2_4=~P2_4;
P2_5=~P2_5;
P2_6=~P2_6;
time_1ms_flag=0;
}
}
}
/*******************************************************************/
// 文件结束
/*******************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -