【聚沙成塔 | 4T网单片机练习】光敏电压min&max记录器

一、题目 

二、难点分析 

如何记录最低电压和最高电压:

定义unsigned char 类型的min、max分别表示最低电压和最高电压

min初始化最大值50(实际是5.0,但想要表示1位小数就要扩大10倍,所以是50)

max初始化最小值0

这样极端的初始值,确保了一上电的值不管是多少都可以同时判断为min和max。

if(time_ad>=500)
{
	time_ad=0;
	ad_light = AD_read(0x01);
	ad_light = AD_read(0x01);
	ad_light = ad_light*10/51; //ad_light = ad_light*5*10/255
	if(ad_light<min)
		min=ad_light;
	if(ad_light>max)
		max=ad_light;
}

三、main.c代码

#include <STC15F2K60S2.H>

#define Y0C P2=P2&0X1F|0X00
#define Y4C P2=P2&0X1F|0X80
#define Y5C P2=P2&0X1F|0XA0
#define Y6C P2=P2&0X1F|0XC0
#define Y7C P2=P2&0X1F|0XE0

typedef unsigned char u8;
typedef unsigned int u16;

//define arrays
code unsigned char Seg_Table[] =  
{ 
0xc0,  //0
0xf9,  
0xa4,  
0xb0,  
0x99,  
0x92,  //5
0x82,  
0xf8,  
0x80,  
0x90,  //9
//decimals
0x40,  //10
0x79,  
0x24,  
0x30,  
0x19,  
0x12,  //15
0x02,  
0x78,  
0x00,  
0x10,  //19
0xff	 //blank 20 
};
code u8 com[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 index[8]={0};

//external declaration
extern unsigned char AD_read(unsigned char channel);
	

//define variates

u16 time_ad=0, ad_light;
u8 min=50,max=0;

//functions

void init()
{
	Y4C;P0=0XFF;Y0C;
	Y5C;P0=0X00;Y0C;
	Y6C;P0=0XFF;Y0C;
	Y7C;P0=0XFF;Y0C;
}

void seg()
{
	static num=0;
	Y7C;P0=0XFF;Y0C;
	Y6C;P0=com[num];Y0C;
	Y7C;P0=Seg_Table[index[num]];Y0C;
	if(++num>=8) num=0;
}

void display(u8 d0,d1,d2,d3,d4,d5,d6,d7)
{
	index[0]=d0;
	index[1]=d1;
	index[2]=d2;
	index[3]=d3;

	index[4]=d4;
	index[5]=d5;
	index[6]=d6;
	index[7]=d7;
}

void Timer1Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x40;		//定时器时钟1T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x20;		//设置定时初值
	TH1 = 0xD1;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	ET1 = 1;
	EA  = 1;
}

void tm1_isr() interrupt 3
{
  seg();
	time_ad++;
}

//main function
main()
{
	init();
	Timer1Init();
	
	while(1)
	{
		if(time_ad>=500)
		{
			time_ad=0;
			ad_light = AD_read(0x01);
			ad_light = AD_read(0x01);
			ad_light = ad_light*10/51; //ad_light = ad_light*5*10/255
			if(ad_light<min)
				min=ad_light;
			if(ad_light>max)
				max=ad_light;
		}
		
		display(ad_light/10+10, ad_light%10, 20, min/10+10, min%10, 20, max/10+10, max%10);
		
		
	}
}

四、iic.c代码

#include <STC15F2K60S2.H>
#include <INTRINS.H>


#define DELAY_TIME	10

sbit sda=P2^1;
sbit scl=P2^0;



static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}

//
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}

//
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}

//
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}

//
unsigned char I2CReceiveByte(void)
{
	unsigned char da;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;
		I2C_Delay(DELAY_TIME);
		da <<= 1;
		if(sda) 
			da |= 0x01;
		scl = 0;
		I2C_Delay(DELAY_TIME);
	}
	return da;    
}

//
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}

//
void I2CSendAck(unsigned char ackbit)
{
    scl = 0;
    sda = ackbit; 
	I2C_Delay(DELAY_TIME);
    scl = 1;
	I2C_Delay(DELAY_TIME);
    scl = 0; 
	sda = 1;
	I2C_Delay(DELAY_TIME);
}

//ADC
unsigned char AD_read(unsigned char channel)
{
	unsigned char addata;
	EA=0;
	
	//five 
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(channel);
	I2CWaitAck();
	//four
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	addata = I2CReceiveByte();
	
	//two bye
	I2CSendAck(1);
	I2CStop();
	
	EA=1;
	return addata;
}

	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值