⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 perfcet.c

📁 1、应用C8051F330的10位ADC和片内温度传感器实现一个数字温度计
💻 C
字号:
#include<C8051F330.h>
#include<math.h>

sbit mode = P0^5;	//mode
sbit led1 = P0^6;
sbit led2 = P0^7;
sbit key2 = P0^4;	//frquency

unsigned int data sf = 0;
unsigned int data pl = 0;
unsigned char state = 0;
unsigned int code buff[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0xbf};
unsigned int xdata TABLE[150];

void sine(void)				//计算正弦波
{	
	unsigned int data y;
	unsigned int data i;
	for(i=0;i<150;i++)
	{
		y=sin(3.1415*2*i/150)*512+512;
		if (y>1023)	y=1023;
		TABLE[i]=y;
	}
}

void SysClkInit(void)	//配置系统时钟
{
  	OSCICN |= 0x03;		//22.11 MHz
	OSCICL=OSCICL+22;
}

void SystemInit(void)	//系统配置
{
	PCA0MD &= ~0x40;	//禁止看门狗定时器
	EA = 1;
}

void PortInit(void)		//端口配置
{
    P0SKIP = 0x0d;
	P0MDIN = 0xf3;		//配置P0、P1口输入输出方式
	P0MDOUT = 0xff;
	XBR1 = 0x40;
	P1MDOUT = 0xff;
	ADC0CN = 0X00;
	IE=0x81;			//开外部中断
	IT01CF=0x45;		//设置P0.5,0.4外部中断0,1
	TMR2RLH=(65536-10000)/256;
	TMR2RLL=(65536-10000)%256;
}

void delayms(int n)		//延时n秒
{
	unsigned int i;
	for(;n>0;n--)
		{
			for(i=2211;i>0;i--);
		}
}

void myoutput(int n)    //输出译码
{
	P1 = buff[n];
}

void Thermometer(void)
{	
	char flag;
	unsigned int Temp1;
	float temp;
	unsigned int ge,shi,fen;
	REF0CN = 0x0e;		//选择3.3v
	AMX0P = 0x10;	
	AMX0N = 0x11;

	ADC0CF=(22114800/2500000)<<3;	//ADC转换时钟
	ADC0CF&=~0x07; 
	AD0EN = 1;
	led1 = 1;
	led2 = 1;			///////////初始化灯

	delayms(2);
	AD0BUSY=1;//开始转换
	delayms(2);
	while(!AD0INT);
	Temp1 = ADC0H;
	Temp1 <<= 8;
	Temp1 &= 0xff00;
	Temp1 |= ADC0L;
	temp = (3.22*Temp1-776)/2.86;//(112*Temp1/47-776)*50/143;
	shi = (int)temp/10;
	ge = (int)temp%10;
	fen = (int)(temp*10)%10;
	myoutput(shi);
			while(state)
				goto flag1;
			delayms(1000);
	myoutput(ge);
			while(state)
				goto flag1;
			delayms(1000);
	myoutput(10);
			while(state)
				goto flag1;
			delayms(500);
	myoutput(fen);
			while(state)
				goto flag1;
			delayms(2000);
	flag1:
		flag = 1;
}

void Voltager()		///////////////////////////////////////////////////////////////////////////////////2路电压测量
{	
	char flag;
	float dianya1,dianya2;
	int shi1,ge1,fen1,shi2,ge2,fen2;		//第一路由P0.2进入,第二路由P0.3进入
	unsigned int Temp1,Temp2;
	led1 = 1;
	led2 = 0;
	REF0CN = 0x0a;
	AMX0P = 0x02;AMX0N = 0x11;	//测量第一路的电压值;
	ADC0CF = (22114800/2500000)<<3;	//ADC转换时钟
	ADC0CF &= ~0x07; 
	AD0EN = 1;
	delayms(2);
	AD0BUSY = 1;
	delayms(2);while(!AD0INT);
	Temp1 = ADC0H;
	Temp1 <<= 8;
	Temp1 &= 0xff00;
	Temp1 |= ADC0L;
	dianya1 = 3.3/1024*Temp1;
	shi1 = (int)dianya1/10;
	ge1 = (int)dianya1%10;
	fen1 = (int)(dianya1*10)%10;

	AD0BUSY = 0;
	delayms(20);
	
	AMX0P = 0x03;AMX0N = 0x11;
	delayms(2);AD0BUSY = 1;delayms(2);while(!AD0INT);
	Temp2 = ADC0H;
	Temp2 <<= 8;
	Temp2 &= 0xff00;
	Temp2 |= ADC0L;
	dianya2 = 3.3/1024*Temp2;
	shi2 = (int)dianya2/10;
	ge2 = (int)dianya2%10;
	fen2 = (int)(dianya2*10)%10;

	myoutput(1);
		while(state != 1)
			goto flag1;
		delayms(500);
	myoutput(11);
		while(state != 1)
			goto flag1;
		delayms(1000);
	myoutput(shi1);
		while(state != 1)
			goto flag1;
		delayms(1000);
	myoutput(ge1);
		while(state != 1)
			goto flag1;
		delayms(1000);
	myoutput(10);
		while(state != 1)
			goto flag1;
		delayms(500);
	myoutput(fen1);
		while(state != 1)
			goto flag1;
		delayms(1000);
	myoutput(2);
	while(state != 1)
			goto flag1;
		delayms(500);
	myoutput(11);
	while(state != 1)
			goto flag1;
		delayms(1000);
	myoutput(shi2);
		delayms(1000);
		while(state != 1)
			goto flag1;
	myoutput(ge2);
		delayms(1000);
		while(state != 1)
			goto flag1;
	myoutput(10);
		while(state != 1)
			goto flag1;
		delayms(1000);
	myoutput(fen2);
		while(state != 1)
			goto flag1;
		delayms(2000);
	flag1:
		flag = 1;
}

void DAC0_Init(void)
{
	OSCICN |= 0x03;//bu分频  24MHz
	REF0CN = 0x0f;//参考电压
	IDA0CN = 0xf1;
	EX1 = 1;
	//IP = 0x05;
	ET2 = 1;
	TR2 = 1;
	AD0EN = 0;
	led1 = 0;
	led2 = 0;
}

void DAC0_Des(void)
{
	EX1 = 0;
	ET2 = 0;
	TR2 = 0;
}

void keyint(void) interrupt 2 using 2
{
	delayms(20);
	switch (pl)
	{
	case 0:		pl=1;
				TMR2RLH=(65536-1300)/256;
				TMR2RLL=(65536-1300)%256;
				break;
	case 1:		pl=2;
				TMR2RLH=(65536-130)/256;
				TMR2RLL=(65536-130)%256;
				break;
	case 2:		pl=3;
				TMR2RLH=(65536-13)/256;
				TMR2RLL=(65536-13)%256;
				break;
	case 3:		pl=0;
				TMR2RLH=(65536-13000)/256;
				TMR2RLL=(65536-13000)%256;
				break;
	}
	while(!key2);
	delayms(20);
}

void Timer2_ISR (void) interrupt 5 using 3	//定时器2中断
{    
	unsigned int temp;
	TF2H = 0;								// 清除T2溢出标志
	myoutput(pl);
	temp = TABLE[sf];
	temp <<= 6;
	temp &= 0x00c0;
	IDA0L = temp;
	temp = TABLE[sf];
	temp >>= 2;
	IDA0H = temp;
	sf++;
	if(sf>149)
		sf = 0;
}

/*void fungen()
{
	while(mode);
	delayms(20);
	while(mode);
	state++;
	if(state == 3)
		state = 0;
}*/

void timer0(void) interrupt 0 using 1
{
	delayms(20);
	if(state < 3)
		state++;
	else
		state = 0;
	while(!mode);
	delayms(20);
} 


void main()
{
	SystemInit();	//系统配置
	SysClkInit();	//配置系统时钟
	PortInit();		//端口配置
	sine();
	while(1)
	{
	
				switch(state)
				{
					case 0:					
							DAC0_Des();Thermometer();
						break;
					case 1:
							Voltager();
						break;
					case 2:
						DAC0_Init();break;
					default:
						state = 0;break;
				}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -