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

📄 w79e201.c

📁 功能:arm7平台的I2c驱动程序
💻 C
字号:

#include <w79e201.h>
#include "at24x.h"
#include <intrins.h>
#include <stdio.h>
#define uint8 unsigned char
#define uint16 unsigned int
#define uchar unsigned char
#define uint unsigned int

uint8 led[2];
//led code 共阳极       0    1   2    3    4    5    6    7    8     9   a     b   c     d    e   f    灭  高位先出  bit顺序 h,g,f,e,d,c,b,a : Q1--a.....Q8--h
uint8 code tab[17] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0x0a,0x86,0x8e,0xff};

uchar basetime,sec;
sbit LED_CLK = P3^5;			//LED串行显示时钟
sbit LED_DATA = P3^4;			//LED串行显示数据
sbit relay = P2^5;
uchar tx_buff[18];
uchar rx_buff[18];
uchar adc_save;
uchar Rxtemp;

bit MYTI;

#define nop() _nop_();_nop_();_nop_();_nop_();


void init_cpu(void);
uint8 HexBcd(uint8 h);
void Dispv(v);
void Display(void);
void Dis_key(void);
uint Adc_test(void);
uchar key_scan(void);
void delay(unsigned char i);
void myputchar(uchar c);
void trace(uchar *str,uchar len);
void ADC_Select(ADC_C);
void ADC_EN(void);
void ADC_DIS(void);
void Disptime(t);
uchar convert2(uint adc_r);

//串口中断程序
void UART_isr(void) interrupt 4
{ 
	if(RI)
    {
        RI = 0;
        Rxtemp = SBUF;   
        SBUF = Rxtemp; 
		return;
	}
	if(TI)
	{
		TI = 0;
		MYTI = 1;		
 	}
}


uchar temp_s[2];

#define HIGH_TEMP 70
#define LOW_TEMP 30
bit run;		//=1,运行,不能设置

void main(void)
{
	uint i;
	uchar aa;
	uchar key,n,m;
	uchar key_value;
	uchar wendu;uint ad_data;
	init_cpu();
//	P0=0x00;		
//	for(i=0;i<0xfffe;i++);
//	for(i=0;i<0xfffe;i++);
//	P0=0xff;		
//	for(i=0;i<0xfffe;i++);
//	aa = 0x01;
//	key = 1;
//	key_value = 1;
	sec = 0;
	m = 1;
	read64c(0x0,1,temp_s);
	if((temp_s[0]>25)&&(temp_s[0]<70))
	{
		Dispv(temp_s[0]);
	}
	else
	{
		temp_s[0] = 50;
		Dispv(temp_s[0]);
	}
	run = 0;
	for(;;)
	{
		aa = aa << 1;
		if(aa==0) aa = 0x01;		
		P0=(~aa);
		for(n=0;n<(m+(m-1)*5);n++)		
		{for(i=0;i<0x0ffe;i++);}
		
		if((sec >= 1)&&(run == 1))
		{
			sec = 0;			
			ad_data = Adc_test();	
			if(ad_data != 0x3ff)
			{		
				wendu = convert2(ad_data);					
				Dispv(wendu);
			}
			else
			{
				wendu = 99;
				Dispv(wendu);
			}			
			if(wendu > temp_s[0])
			{
				relay = 1;
				m = 3;
			}			
			if(wendu <= (temp_s[0]-3))
			{
				relay = 0;
				m = 1;
			}
			
		}
						
		if(run == 0)
		{
			n = key;
			key = key_scan();	//测试键盘		
			if(key != 0xff)
			{
				if(key == 2)
				{
					temp_s[0]++;
					if(temp_s[0] > HIGH_TEMP)
						temp_s[0] = LOW_TEMP;	
					Dispv(temp_s[0]);	
					sec = 0;
				}
				else if(key == 1)
				{
					temp_s[0]--;
					if(temp_s[0] < LOW_TEMP)
						temp_s[0] = HIGH_TEMP;	
					Dispv(temp_s[0]);		
					sec = 0;
				}
				else if(key == 3)
				{
					write64c(0x0,1,temp_s);
				}
				else if(key == 4)
				{
					run = 1;	
				}
			}				
			while(key_scan()!=0xff);
		}
	}
}

void init_cpu(void)
{	
	TMOD = 0x21;	
	SCON  = 0x50;			/* SCON: mode 1, 8-bit UART, enable rcvr      */	
	TH1   = 0xfd;            /* TH1:  reload value for 9600 baud @ 11.0592MHz   */
    TL1   = 0xfd;			
    TR1   = 1;  			//T1 timer run
    ES    = 1;				//uart interrupt enable	
	EA = 1;					//all interrupt enable
	P1 = 0xff;
	C_T2 = 0;
	TL2 = 0x01;
	TH2 = 0x4e;
	RCAP2L = 0x01;
	RCAP2H = 0x4e;
	TR2 = 1;
	ET2 = 1;
}


void Dispv(v)
{
	uint8 temp1;	
	temp1 = HexBcd(v);	
	led[0] = (temp1&0x0f);
	led[1] = (temp1&0xf0)>>4;
	
	Display();

}


void Display(void)
{
	uint8 j;
	uint8 temp;	
		temp = led[0];
		temp = tab[temp];
		for(j=0;j<8;j++)
		{		
			LED_DATA = (temp&0x80);	
			nop();		
			LED_CLK = 0;
			nop();
			temp = temp << 1;
			LED_CLK = 1;
			nop();
		}
		temp = led[1];
		temp = tab[temp];//&0x7f;
		for(j=0;j<8;j++)
		{		
			LED_DATA = (temp&0x80);	
			nop();		
			LED_CLK = 0;
			nop();
			temp = temp << 1;
			LED_CLK = 1;
			nop();
		}
		
}


void Dis_key(void)
{
	uint8 j;
	uint8 temp;

	adc_save = 0xff;
		temp = led[0];
		temp = tab[temp];
		for(j=0;j<8;j++)
		{		
			LED_DATA = (temp&0x80);	
			//nop();		
			LED_CLK = 0;
			//nop();
			temp = temp << 1;
			LED_CLK = 1;
			//nop();
		}
		temp = led[1];
		temp = tab[temp];
		for(j=0;j<8;j++)
		{		
			LED_DATA = (temp&0x80);	
			//nop();		
			LED_CLK = 0;
			//nop();
			temp = temp << 1;
			LED_CLK = 1;
			//nop();
		}
		
}



uint8 HexBcd(uint8 h)
{
	uint8 b;
	if(h > 99)	return 0x99;
	b=h/10*0x10 + h%10;
	return b;
}

//delay 1002*i instruction period
//void delay(unsigned char i)
//{
//	unsigned char  j;
//	i=i*2;
//	for(;i>0;i--)
//	{
//	   j = 246;
//		while(--j);
//	}
//}



void trace(uchar *str,uchar len)
{
	uint i;
	for(i=0;i<len;i++)
	{
		myputchar(*str);
		str++;
	}
}

void myputchar(uchar c)
{	
	ES = 0;
	SBUF = c;
	while (TI == 0);
	TI = 0;
	ES = 1;
}

uint Adc_test(void)
{
	uchar adc_h,adc_l;
	uint adc_data;
	ADC_Select(0);	//select channel
	ADC_EN();		//enable adc
	ADCCON = ADCCON | 0x08;	//start adc
	while(!(ADCCON & 0x10));//wait adc finish
	adc_h = ADCH;
	ADCCON = ADCCON & 0xF7;	//DISABLE adc
	adc_l = ADCCON;
	ADC_DIS();
	adc_l = adc_l>>6;
	adc_data = adc_h;
	adc_data = adc_data<<2;
	adc_data = adc_data | adc_l;
	return adc_data;	
}

uchar key_scan(void)
{
	uchar adc_h,adc_l;
	uint adc_data;
	ADC_Select(1);	//select channel
	ADC_EN();		//enable adc
	ADCCON = ADCCON | 0x08;	//start adc
	while(!(ADCCON & 0x10));//wait adc finish
	adc_h = ADCH;
	ADCCON = ADCCON & 0xF7;	//DISABLE adc
	adc_l = ADCCON;
	ADC_DIS();
	adc_l = adc_l>>6;
	adc_data = adc_h;
	adc_data = adc_data<<2;
	adc_data = adc_data | adc_l;
	tx_buff[0] = (uchar)adc_data;
	//trace(tx_buff,1);
	if((tx_buff[0]>0x06)&&(tx_buff[0]<0x0c))
	{
		led[0] = 1;
		led[1] = 0x10;
		//Dis_key();		 
		return 1;
	}
	if((tx_buff[0]>0x10)&&(tx_buff[0]<0x17))
	{
		led[0] = 2;
		led[1] = 0x10;
		//Dis_key();
		return 2;
	}
	if((tx_buff[0]>0x2e)&&(tx_buff[0]<0x36))
	{
		led[0] = 3;
		led[1] = 0x10;
		//Dis_key();
		return 3;
	}
	if((tx_buff[0]>0x5e)&&(tx_buff[0]<0x66))
	{
		led[0] = 4;
		led[1] = 0x10;
		//Dis_key();
		return 4;
	}
	return 0xff;
}

void ADC_Select(ADC_C)
{
	ADCCON = 0x00;
	ADCCON = ADC_C;
}

void ADC_EN(void)
{
	ADCCEN = 0;
}

void ADC_DIS(void)
{
	ADCCEN = 1;
}


/**********************************************************/
//TIMER2中断服务程序:
//每50毫秒中断一次,。
/**********************************************************/
void timer2(void) interrupt 5 using 2
{
    //uchar i;
	//TL0 = 0x01;
	//TH0 = 0x4e;				//补偿6us
	TF2 = 0;
	if(19 != basetime)
	{
		basetime++;
		return;
	}
	basetime = 0;
	if(29 != sec)		//30 sec//1分钟
	{		
		sec++;		
		return;
	}
	else 
	{
		run = 1;
		sec = 0;		
	//	OneMin = 1;		//每隔1分钟设定主动上发,看PC端软件是否正常
	//	min++;
	//	min10++;
	}
}

//void Disptime(t)
//{
//	uint8 temp1;uint8 j;	
//	temp1 = HexBcd(t);	
//	led[0] = (temp1&0x0f);
//	led[1] = (temp1&0xf0)>>4;		
//	temp1 = led[0];
//	temp1 = tab[temp1];
//	for(j=0;j<8;j++)
//	{		
//		LED_DATA = (temp1&0x80);	
//		nop();		
//		LED_CLK = 0;
//		nop();
//		temp1 = temp1 << 1;
//		LED_CLK = 1;
//		nop();
//	}
//	temp1 = led[1];
//	temp1 = tab[temp1];
//	for(j=0;j<8;j++)
//	{		
//		LED_DATA = (temp1&0x80);	
//		nop();		
//		LED_CLK = 0;
//		nop();
//		temp1 = temp1 << 1;
//		LED_CLK = 1;
//		nop();
//	}
//}

uchar convert2(uint adc_r) 
{
  	uint idata buffer;
  	uchar  t; 
   	long float code tmp_tab3[]={
   		//11-20
   		191.111,182.111,173.555,165.555,157.888,150.666,143.888,137.333,131.111,125.333,
  		//21-30
		119.655,114.355, 109.355, 104.555, 100.000, 95.7555, 91.6155, 87.7255, 84.0155, 80.4855, 
		//31-40
		76.1255, 72.9255, 69.8755, 66.9655, 64.1855, 61.5455, 59.5155, 56.6555, 54.3555, 51.1155, 
		//41-50
		49.5155, 47.0155, 45.1555, 44.2755, 43.5255, 41.8555, 40.2655, 38.7355, 37.2655, 35.8755, 
		//51-60
		34.5355, 33.2555, 32.0255, 30.8455, 29.7255, 28.6455, 27.6555, 26.6155, 25.6555, 24.7455, 
		//61-70
		23.8655, 23.0255, 22.2255, 21.4455, 20.7555, 19.9855, 19.2955, 18.6355, 18.0055, 17.3955, 
		//71-80
		16.8555, 16.2455, 15.7555, 15.1855, 14.6755, 14.1955, 13.7355, 13.2855, 12.8555, 12.4355,
  	    //81-90
		12.0455, 11.6555, 12.2855, 10.9255, 10.5855, 10.2555, 9.9265, 9.6165, 9.3185, 9.0355
		};  
        
        
    if(adc_r < 1020 && adc_r > 10)
    { 
       	t = 0; 
        buffer = (uint)((100/(100+tmp_tab3[t]))*1024);
        while(buffer < adc_r)   
        { 
            buffer = (uint)((100/(100+tmp_tab3[t]))*1024);
            t++;
        } 
        t = t +11;  
    }   
    return (t-1);
}

⌨️ 快捷键说明

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