历程源码:
main.c
#include <STC15F2K60S2.H>
#include "iic.h"
void smg_show();
void led_kong();
sbit S4=P3^3;
sbit S5=P3^2;
sbit S6=P3^1;
sbit S7=P3^0;
unsigned int V_smg=0;
unsigned char V=0,mode=1;
unsigned char mode_Vda=1,Vda=1;
unsigned char led_state=0xff,led_kai=1;
unsigned int mai_c=0,hz=0;
unsigned char count=0;
unsigned char smg_kai=1;
unsigned char code smg_nodot[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,
~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
unsigned char code smg_dot[]={~0xBF,~0x86,~0xDB,~0xCF,~0xE6,~0xED,~0xFD,~0x87,~0xFF,~0xEF,~0x46};
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(--xms)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
void HC138(unsigned char Y,dat)
{
P0=dat;
switch(Y)
{
case 4:
P2=(P2&0x1f)|0x80;
break;
case 5:
P2=(P2&0x1f)|0xa0;
break;
case 6:
P2=(P2&0x1f)|0xc0;
break;
case 7:
P2=(P2&0x1f)|0xe0;
break;
case 0:
P2=(P2&0x1f)|0x00;
break;
}
P2=(P2&0x1f)|0x00;
}
void read_pcf8591_rb2()
{
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x43);
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
V=I2CReceiveByte();
I2CSendAck(1);
I2CStop();
V_smg=V*100*(5.0/255);
}
void read_pcf8591_da(unsigned char da)
{
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x43);
I2CWaitAck();
I2CSendByte(da);
I2CWaitAck();
I2CStop();
}
void init_T()
{
TMOD=0X16;
TH0=0XFF;
TL0=0XFF;
TH1=(65535-50000)/256;
TH1=(65535-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
void T0_ZD() interrupt 1
{
mai_c++;
}
void T1_ZD() interrupt 3
{
TH1=(65535-50000)/256;
TH1=(65535-50000)%256;
count++;
if(count==20)
{
hz=mai_c;
mai_c=0;
count=0;
}
}
void scankeys()
{
if(S4==0)
{
Delay(10);
if(S4==0)
{
if(mode==1)
mode=2;
else
mode=1;
}
while(S4==0)
smg_show();
}
if(S5==0)
{
Delay(10);
if(S5==0)
{
if(mode_Vda==1)
mode_Vda=2;
else
mode_Vda=1;
if(mode_Vda==1)
{
read_pcf8591_rb2();
Vda=V_smg;
read_pcf8591_da(Vda*51);
}
else if(mode_Vda==2)
{
Vda=2;
read_pcf8591_da(V*51);
}
}
while(S5==0)
{
smg_show();
led_kong();
}
}
if(S6==0)
{
Delay(10);
if(S6==0)
{
if(led_kai==1)
led_kai=0;
else if(led_kai==0)
led_kai=1;
}
while(S6==0)
{
smg_show();
led_kong();
}
}
if(S7==0)
{
Delay(10);
if(S7==0)
{
if(smg_kai==1)
smg_kai=2;
else if(smg_kai==2)
smg_kai=1;
}
while(S7==0)
{
led_kong();
smg_show();
}
}
}
void led_kong()
{
if(led_kai==1)
{
if(V_smg<150||(V_smg>=250&&V_smg<350))//led3
{
led_state|=0x04;
HC138(4,led_state);
}
else
{
led_state&=~0x04;
HC138(4,led_state);
}
if(mode_Vda==2)
{
led_state|=0x10;
HC138(4,led_state);
}
else
{
led_state&=~0x10;
HC138(4,led_state);
}
if(hz<1000||(hz>=5000&&hz<10000))
{
led_state&=~0x08;
HC138(4,led_state);
}
else
{
led_state|=0x08;
HC138(4,led_state);
}
if(mode==1)
{
led_state&=~0x01;
HC138(4,led_state);
}
else
{
led_state|=0x01;
HC138(4,led_state);
}
if(mode==2)
{
led_state&=~0x02;
HC138(4,led_state);
}
else
{
led_state|=0x02;
HC138(4,led_state);
}
}
if(led_kai==0)
{
led_state=0xff;
HC138(4,led_state);
}
}
void smg(unsigned char wei,shu)
{
HC138(6,0x01<<wei);
HC138(7,shu);
Delay(2);
HC138(6,0xff);
HC138(7,0xff);
}
void smg_show()
{
if(smg_kai==1)
{
switch(mode)
{
case 1:
if(hz)
{
smg(0,smg_nodot[15]);
if(hz>9999)
smg(3,smg_nodot[hz/10000%10]);
if(hz>999)
smg(4,smg_nodot[hz/1000%10]);
if(hz>99)
smg(5,smg_nodot[hz/100%10]);
if(hz>9)
smg(6,smg_nodot[hz/10%10]);
smg(7,smg_nodot[hz%10]);
break;
case 2:
smg(0,0xc1);
smg(5,smg_dot[V_smg/100]);
smg(6,smg_nodot[V_smg/10%10]);
smg(7,smg_nodot[V_smg%10]);
}
break;
}
}
if(smg_kai==2)
{
HC138(6,0xff);
HC138(7,0xff);
}
}
void init_sys()
{
HC138(0,0x00);
HC138(4,0xff);
HC138(5,0x00);
HC138(6,0xff);
HC138(7,0xff);
}
void main()
{
init_sys();
init_T();
while(1)
{
scankeys();
led_kong();
read_pcf8591_rb2();
smg_show();
}
}
iic.c
/* # I2C代码片段说明
1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
中对单片机时钟频率的要求,进行代码调试和修改。
*/
#define DELAY_TIME 5
#include <STC15F2K60S2.H>
#include <intrins.H>
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
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);
}
iic.h
#ifndef __IIC_H_
#define __IIC_H_
void I2CStart(void);
void I2CStop(void);
void I2CSendByte(unsigned char byt);
unsigned char I2CReceiveByte(void);
unsigned char I2CWaitAck(void);
void I2CSendAck(unsigned char ackbit);
#endif
注意:
1.上电时有些板子数码管显示的hz可能是0,在数码管之前过滤一下即可:
2.为什么没写大于10万hz时数码管的显示?
一位频率最大值在13000左右,根本不可能达到十万,所以我就没有写,想写也可以加上,只需要再定义个变量接一下即可,因为我们定义的hz为int型,不能超过65535.
3.调用iic文件时一定要先完善文件一般出错在iic.c的开头处: