一、题目
二、难点分析
如何记录最低电压和最高电压:
定义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;
}