📄 adc.c
字号:
/*;==========================================================================*
* File name : adc.c *
* Author: Davidlee *
* Data: 2007.05.13*
* Version: 2.0 *
* Organization: Tianhuang Technology Co.ltd
* Description : Analog signals change to digital signals (A/D)
* show by three nixietubes.
;==========================================================================*
*/
#include "F2407_c.H" //;the header file
#define led_0 port2000 //对应发光二极管外部存储单元地址
#define led_en port6000 //对应数码管使能脚外部存储单元地址
#define led_da port8000 //对应送数码管数据脚外部存储单元地址
ioport unsigned port2000;
ioport unsigned port6000;
ioport unsigned port8000;
unsigned int temp1,voltage,AD[8];
unsigned long int sum;
unsigned int data1,data2,data3,data4;
unsigned int led_en1,led_en2,led_en3,led_en4;
asm(" .word #0ffffh "); //密码位
asm(" .word #0ffffh ");
asm(" .word #0ffffh ");
asm(" .word #0ffffh ");
//=======================================================
//子程序声明
//=======================================================
void interrupt nothing(); /*空指令,直接返回*/
void Delay(); /*延时子程序*/
void KICK_DOG(); /*看门狗子程序*/
void system_init(); /*系统初始化子程序*/
void ADCinitial(); /*A/D转换初始化子程序*/
void conversion(); /*A/D转换结果转数码管显示子程序*/
void Led_show(unsigned int led_en,unsigned int data);/*数码管显示相应数码值子程序*/
//=======================================================
//定义数组,对应数码管显示数字的代码.代表从0~f共16个数
//=======================================================
unsigned int data_table[]={0x03F,0x006,0x05B,0x04F,0x066,0x06D,0x07D,0x007,
0x07F,0x06F,0x077,0x07C,0x039,0x05E,0x079,0x071};
//=======================================================
main() /*主程序*/
{
system_init(); /*系统初始化*/
ADCinitial(); /*A/D转换初始化子程序*/
sum=0;
data1=0; //显示初始值均为0
data2=0;
data3=0;
data4=0;
led_en1=0x0E0; //使能LED1
led_en2=0x0D0; //使能LED2
led_en3=0x0B0; //使能LED3
led_en4=0x0F0; //不使能LED4(0x070使能)
while(1)
{
int i,j,k;
unsigned int m;
ADCTRL2=0x4000; //软件启动A/D转换
ADCTRL2=0x2000;
loop: if(k==1)
{k=ADCTRL2&0x8; //等待AD转换完成
goto loop;
}
asm(" CLRC SXM ");
AD[0]=RESULT0>>6; //把AD转换的结果右移6位后存入规定的数组
AD[1]=RESULT1>>6;
AD[2]=RESULT2>>6;
AD[3]=RESULT3>>6;
AD[4]=RESULT4>>6;
AD[5]=RESULT5>>6;
AD[6]=RESULT6>>6;
AD[7]=RESULT7>>6;
for(i=0;i<8;i++)
{
sum=sum+AD[i];
}
voltage=sum>>3; //取8次采样的平均值
conversion(voltage); //电压转化子程序
for(m=0;m<1000;m++) //循环1000次
{
Led_show(led_en1,data_table[data1]|0x80); //每次显示一个数码管值,加小数点
Led_show(led_en2,data_table[data2]);
Led_show(led_en3,data_table[data3]);
Led_show(led_en4,data_table[data4]);
}
data1=0; //显示完一次后将相应值清0,
data2=0; //然后进行下一次转换显示.
data3=0;
data4=0;
sum=0;
ADCTRL2=0x4000; //再次软件启动A/D转换
ADCTRL2=0x2000;
led_en=0xFFFF; //关闭数码管显示
Delay(5); //延时
}
}
//=======================================================
//该中断服务程序主要是为了防止干扰,不作任何其他操作
//=======================================================
void interrupt nothing()
{
asm(" CLRC INTM");
return; /*中断直接返回*/
}
void Delay(int delay) /*延时子程序*/
{
while(delay>0) delay--;
}
void KICK_DOG() /*复位看门狗密钥*/
{
WDKEY=0x5555;
WDKEY=0xAAAA;
}
//=======================================================
//系统初始化子程序
//=======================================================
void system_init()
{
asm(" SETC INTM " ); //关中断
asm(" CLRC SXM " ); //符号位不作扩展
asm(" SETC OVM " ); //遇到溢出,累加器被设置为它的最大正值或负值
asm(" CLRC CNF " ); //B0设置为数据存储区
IMR=0;
IFR=0xFFFF; //清除全部中断标志,"写1清0"
WDCR=0x6F;
KICK_DOG(); //看门狗不使能
temp1=0x0;
asm(" OUT _temp1,0ffffh"); //设置外部等待为0
MCRB=0xFFFD; //设置仿真端口
led_0=0xFF; //关闭发光二极管的显示 led_0为设定的扩充I/O
}
//=======================================================
//ADC初始化子程序
//=======================================================
void ADCinitial() /*A/D转换初始化子程序*/
{
SCSR1=0x008C; //仅使能ADC,EVA,EVB模块
ADCTRL1=0x4000;
ADCTRL1=0x3000;
MAX_CONV=0x7;
CHSELSEQ1=0x3333;
CHSELSEQ2=0x3333;
}
void conversion(int temp) /*A/D转换结果转数码管显示子程序*/
{
if(temp>1024) return;
while((temp-310)>=0)
{
data1=data1+1;
temp=temp-310;
}
while((temp-31)>=0)
{
data2=data2+1;
temp=temp-31;
}
while((temp-3)>=0)
{
data3=data3+1;
temp=temp-3;
}
}
void Led_show(unsigned int _led_en,unsigned int data)
{
led_en = _led_en; //数码管使能(即使数码管有显示输出).led_en为设定的扩充I/O
led_da = data; //往数码管送要显示的数据.led_da为设定的扩充I/O
Delay(100); //延时
led_da = 0x0; //数码管不使能(即使数码管无显示输出)
//因为是动态显示,送完数据之后
} //要对相应数码管数据清零,准备送下一个数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -