基于ADuC7060单片机的电子称设计
0赞目前,数字电子称是日常生活中上广泛使用的一种称量工具,但市场上使用的各式小量程电子称还存在一定的局限性,这些电子称体积大、成本高、计量误差大。本文提出的电子称选用ADI公司生产的ADUC7060模拟微控制器,设计一种体积小、低成本、计量精度高、工作可靠的小量程电子称。


#define BIT1 0x02
#define BIT2 0x04
#define BIT4 0x10
#define BIT7 0x80
#define BIT8 0x100
#define BIT10 0x400
#define BIT15 0x8000
#include<aduc7060.h> //包含ADuC7060头文件
void delay (int length) ; //声明延时函数
void senddata(int to_send); //声明串口发送函数
volatile int Temp;
volatile int Temp2;
/*******************************************************************************
函数名称:main()
函数功能:配置主ADC单端模式转换,并将转换结果通过串口发出
******************************************************************************/
int main(void)
{
POWKEY1 = 0x1;
POWCON0 = 0x78; //设置CPU内核时钟最大到10.24MHZ
POWKEY2 = 0xF4;
/*初始化UART串口*/
GP1CON |= BIT0 + BIT4; // 硬件接口选择P1.0和P1.1
COMCON0 = BIT7;
COMDIV0 = 0x21; //设置波特率为9600bps
COMDIV1 = 0x00;
COMCON0 = BIT0 + BIT1 + BIT2;
/*初始化ADC1*/
ADCMSKI = BIT1; // 使能ADC转换完成中断
ADCFLT = 0x7; // 1Khz 转换频率, 斩波关
ADCMDE = BIT0+BIT7; // ADC连续转换,正常模式
ADC1CON =BIT7 + BIT8 // ADC1 输入通道选择ADC8/ADC9 差分模式
+ BIT11+BIT15 ; //单极性编码输出,辅助ADC使能
ADCCFG = 0;
IRQEN = BIT10 ; // 使能ADC1 中断
while (1)
{
GP1DAT=0x40000000; //指示灯亮,进入循环
senddata(Temp); //将转换结果按位从串口发出
delay (200000) ; //延时便于观察结果
}
}
/*******************************************************************************
函数名称:senddata ()
函数功能:将24位AD转换结果每8位一组发出
******************************************************************************/
void senddata(int to_send)
{
while(!(0x020==(COMSTA0 & 0x020))){}
COMTX = 0x0A; // 输出0A
while(!(0x020==(COMSTA0 & 0x020))){}
COMTX = 0x0D; // 输出0D
while(!(0x020==(COMSTA0 & 0x020))){}
COMTX = ((to_send >> 24) & 0xFF); //输出24~31位
while(!(0x020==(COMSTA0 & 0x020))){}
COMTX = ((to_send >> 16) & 0xFF); //输出16~23位
while(!(0x020==(COMSTA0 & 0x020))){}
COMTX = ((to_send >> 8) & 0xFF); //输出8~15位
while(!(0x020==(COMSTA0 & 0x020))){}
COMTX = (to_send & 0xFF); //输出0~7位
}
/*******************************************************************************
函数名称:delay()
函数功能:延时等待
******************************************************************************/
void delay (int length)
{
while (length >=0)
length--;
}
/*******************************************************************************
函数名称:IRQ_Handler()
函数功能:ADC1中断服务程序
******************************************************************************/
void IRQ_Handler(void) __irq
{
unsigned long IRQSTATUS = 0;
IRQSTATUS = IRQSTA; //读出中断状态寄存器值
if ((IRQSTATUS & BIT10) == BIT10) //判断ADC1转换完成触发中断
{
Temp2 = ADC0DAT; //读出主ADC转换结果
Temp= ADC1DAT; //读出辅助ADC转换结果
}
}
