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

📄 adc.c

📁 C51开发板测试程序 C51开发板测试程序
💻 C
字号:
#include	<reg52.h>
#ifndef 	__STC12C5410AD_H__
#define 	__STC12C5410AD_H__
#include 	<STC12C5410AD.h>



bdata unsigned char flag;
sbit led_fleg	=flag^0;	//3秒切换显示标志

sbit J1			=P2^2;
sbit J2			=P2^3;
sbit KEY_1		=P3^4;
sbit KEY_2		=P3^5;
sbit SPEAKER	=P2^4;
sbit LED_A		=P1^5;
sbit LED_B		=P1^6;
sbit LED_C		=P2^0;
sbit LED_D		=P1^1;
sbit LED_E		=P1^2;
sbit LED_F		=P1^4;
sbit LED_G		=P1^7;
sbit LED_H		=P1^3;
sbit LED_S0		=P2^6;		//流水灯			
sbit LED_S2		=P2^7;		//左2,十位
sbit LED_S1		=P3^7;		//左3,个位
sbit LED_S3		=P2^1;		//左1,百位
sbit LED_S4		=P2^5;		//左4,符号位
sbit INT_0		=P3^2;
sbit INT_1		=P3^3;
void warter();
char warter_led;

char l_bai;
char l_shi;
char l_ge;
char t_bai;
char t_shi;
char t_ge;
unsigned int	disptimer;
char gPulseCount;
char scan;
char TimeSub;
unsigned int	TimeAdd;
unsigned char	temperaturn;		//温度单元
unsigned char	buff	=0;
unsigned char code table[]=
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x38,0xb9,		//38=L,b9=度
0x39,0x5e,0x79,0x71
};

/*
unsigned char code T_table[]={
//0	 1   2	 3   4   5  6   7    8   9
367,362,358,353,348,344,339,335,330,326,
322,317,313,309,305,300,296,292,288,283,
279,275,271,267,262,258,254,250,246,241,
237,233,229,225,221,216,212,208,204,200,
196,192,188,184,180,176,173,169,166,163,
159,156,153,150,147,144,141,139,136,133,
130,127,125,122,119,117,114,112,109,107,
104,102,100, 98, 96, 94, 92, 90, 88, 86,
 84, 82, 80, 79, 77, 75, 73, 71, 70, 68,
 66, 64, 63, 61, 59, 58, 56, 54, 53, 51, //99
 50,//100
 0 //短路
}
*/
void Initialization()
{	
//	AUXR	=0x10;						//f=fosc/12
	TMOD	=0x21;						//定时器0设为方式1定时器1设为方式2自动重装
	TH1=TL1	=0xE8;						//11.0592MHz时1200波特率
	TH0		=(65536-1000)/256;
	TL0		=(65536-1000)%256;			//定时器0定时1ms
	TR1		=1;							//启动定时器1	
	TR0		=1;							//启动定时器0
	ET0		=1;							//开定时器0中断
	EA		=1;							//开总中断
//	IE		=0x07;						//外部中断
//	IP		=0x05;
	IT1		=1;							//external interrupt falling edge take effect
	IT0		=1;							//下沿触发
	ADC_CONTR	=0xE0;					//ADC intialization,只加上了ADC的电源,P1.0为AD口
}
/*************显示数送端口**************/
void send_port()
{
	LED_A			=!(buff>>0 & 0x01);		//send data to IO port
	LED_B			=!(buff>>1 & 0x01);
	LED_C			=!(buff>>2 & 0x01);
	LED_D			=!(buff>>3 & 0x01);
	LED_E			=!(buff>>4 & 0x01);
	LED_F			=!(buff>>5 & 0x01);
	LED_G			=!(buff>>6 & 0x01);
	LED_H			=!(buff>>7 & 0x01);}
/*********************流水灯********************************/
void warter()
{	
	switch (warter_led)
	{
		case 0:
			LED_F = 1;				//流水灯高低次序
			LED_C = 0;
			LED_E = 0;
			LED_D = 0;
			LED_B = 1;
			LED_A = 0;
			LED_H = 0;
			LED_G = 0;
			break;
		case 1:
			LED_F = 0;				//流水灯高低次序
			LED_C = 0;
			LED_E = 0;
			LED_D = 1;
			LED_B = 0;
			LED_A = 0;
			LED_H = 0;
			LED_G = 1;
			break;
		case 2:
			LED_F = 0;				//流水灯高低次序
			LED_C = 0;
			LED_E = 1;
			LED_D = 0;
			LED_B = 0;
			LED_A = 0;
			LED_H = 1;
			LED_G = 0;
			break;
		case 3:
			LED_F = 0;				//流水灯高低次序
			LED_C = 1;
			LED_E = 0;
			LED_D = 0;
			LED_B = 0;
			LED_A = 1;
			LED_H = 0;
			LED_G = 0;
	}
}
//*********************三秒显示切换************************************
void Disp()
{	

	char bai	=0;
	char shi	=0;
	char ge		=0;
	char fuha;
	buff = 0;
	if(disptimer>3000)						//disptimer放在定时中断中递减
	{
		disptimer=0;						//3秒显示切换定时值
		led_fleg=led_fleg^1;				//每执行一次,标志改变一次
	}
	else if(led_fleg==1)	
	{
		bai = l_bai;						//流量百位
		shi = l_shi;						//流量十位
		ge  = l_ge;							//流量个位
		fuha= 10;
	}
	else
		{									//百位不显示,段码送全1
		bai = t_bai;
		shi = t_shi;						//温度十位
		ge  = t_ge;							//温度个位
		fuha= 11;
		}
//*********显示位选择**********
	LED_S0			=1;						//disable all bits
	LED_S1			=1;						//关显示
	LED_S2			=1;
	LED_S3			=1;
	LED_S4			=1;
	switch (scan)							//
	{
		case 0:							  	//s4显示设置脉冲计数
			warter();						//led dynamic scan
			LED_S0			=0;	
			break;
		case 1:								
			buff=table[ge];					//
			send_port();					//显示段送端口
			LED_S1			=0;
			break;
		case 2:								
			if(bai||shi>0)
				{
				buff=table[shi];				//
 				send_port();					//显示段送端口
	//			LED_H = 1;						//小数点显示
				LED_S2		=0;
				}
			else
				LED_S2		=1;	
			break;
		case 3:								
			if(bai>0)
				{
				buff=table[bai];			//
				send_port();				//显示段送端口
				LED_S3	=0;
				}
			else 
				LED_S3	=1;
			break;
		case 4:								
			buff=table[fuha];				//改A字码为L(x038),B为C符号
			send_port();					//显示段送端口
			LED_S4			=0;
			break;
	}
	scan++;
	if(scan==5)	scan=0;
}
/*************定时器1中断服务*********/
void Timer0Srv() interrupt 1 			//定时器1ms定时中断
{
	TH0		=(65536-1000)/256;
	TL0		=(65536-1000)%256;			//定时器0初装值定时1ms
	TimeAdd++;							//最大计数值:65535ms
	TimeSub--;							//最大计数值:256ms
	disptimer++;						//显示计时
//	warter();  	
	Disp();								//定时器中断时扫描显示一次
}
void AD_DATA()							//InterruptSrv()interrupt 5 using 0
{
	
//	int adc=0;

/*	ADC_CONTR	&=CLEAR_ADC_INTR;	//zhouhua
	ad			=ADC_DATA;
	ad			<<=2;
	ad			|=(ADC_LOW2)&0x03;
	gTemperature=LookupTemperatureTable(ad);	

WORD readadc(void)					//shenkaiyou
{   WORD adc_result;
    adc_result=0;
	ADC_DATA=0;
    ADC_LOW2=0x00; 					//need further test
	ADC_CONTR|=ADC_START;
	while(!(ADC_CONTR&ADC_FLAG)) ;
	ADC_CONTR&=~ADC_FLAG;//ADC_START;
	adc_result|=ADC_DATA<<2;
	
	//adc_result|=ADC_DATA;
	//adc_result =adc_result<<2;
	adc_result|=ADC_LOW2;
	//adc_result&=0x3ff;//0615
    return(adc_result);
}
查表值I等于温度值
  for(i=0;i<102;i++) //108


*/
	int adc;
	char i;
	if(ADC_CONTR&&0x10>0)			//查询AD转换标志是否建立
	{
	adc		=ADC_DATA;
	adc		<<=2;
	adc		|=(ADC_LOW2)&0x03;		//&运算是只保留后2位,前六位置0,10位AD值
	for(i=0;i<102;i++)
	{
	if(T_table[i]<adc)				//AD值查表得到温度值 
		{
		temperaturn=i;
		break;
		}
	}

	t_bai	=adc/100;
	t_shi	=adc%100/10;						//温度十位
	t_ge	=adc%10;
	ADC_CONTR=0x88;					//加ADC电源,清ADC-FLAG,重新开始AD转换	
	
	}
}
void main()
{
	Initialization();
	while(1)
		{
		J1		= 1;
		J2		= 0;
		l_bai	= 1;
		l_shi	= 7;
		l_ge	= 4;
		if(TimeAdd==500)			//流水灯流动触发,0.5秒滚动一次
			{
			warter_led++;
			TimeAdd=0;
			}
		if(warter_led==4) (warter_led=0);
		AD_DATA();

		}
}

⌨️ 快捷键说明

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