题目
代码
这一届考的内容和以前的基本一样,没整那么变换,就是多了个NE555,国赛经常考的模块,就劝退了很多人,其实也就只是把定时器设为计数模式,很简单
timer.c
#include <timer.h>
void TimerInit(void) //1毫秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F;
TMOD |= 0X05; //设置定时器模式
TL1 = 0x18; //设置定时初值
TH1 = 0xFC; //设置定时初值
TL0 = 0; //设置定时初值
TH0 = 0; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
EA=ET0=ET1=1;
}
timer.h
#ifndef _TIMER_H_
#define _TIMER_H_
#include <STC15F2K60S2.H>
void TimerInit(void);
#endif
smg.c
#include <smg.h>
unsigned char code smgduan[23]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,
0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0XC1,0X8E,0XFF};
//U:20 F:21 灭:22 小数点加10
unsigned char dspbuf[8];
void smg_display(void)
{
static unsigned char i=0;
P2=(P2&0X1F)|0XE0;
P0=0XFF;
P2&=0X1F;
P2=(P2&0X1F)|0XC0;
P0=1<<i;
P2&=0X1F;
P2=(P2&0X1F)|0XE0;
P0=smgduan[dspbuf[i]];
P2&=0X1F;
if(++i==8)
i=0;
}
smg.h
#ifndef _SMG_H_
#define _SMG_H_
#include <STC15F2K60S2.H>
extern unsigned char dspbuf[8];
void smg_display(void);
#endif
key.c
#include <key.h>
unsigned char key_sum=0,k4_press,k5_press,k6_press,k7_press;
void key_read(void)
{
static unsigned char k4_time=0,k5_time=0,k6_time=0,k7_time=0;
key_sum=0;
if(k4==0)
{
k4_time++;
if(k4_time==1)
key_sum=4;
else if(k4_time==20)
{
key_sum=0;
k4_time=1;
}
}
else
k4_time=0;
if(k5==0)
{
k5_time++;
if(k5_time==1)
key_sum=5;
else if(k5_time==20)
{
key_sum=0;
k5_time=1;
}
}
else
k5_time=0;
if(k6==0)
{
k6_time++;
if(k6_time==1)
key_sum=6;
else if(k6_time==20)
{
key_sum=0;
k6_time=1;
}
}
else
k6_time=0;
if(k7==0)
{
k7_time++;
if(k7_time==1)
key_sum=7;
else if(k7_time==20)
{
key_sum=0;
k7_time=1;
}
}
else
k7_time=0;
}
void key_control(void)
{
if(key_sum==4) k4_press=1;
else if(key_sum==5) k5_press=1;
else if(key_sum==6) k6_press=1;
else if(key_sum==7) k7_press=1;
}
key.h
#ifndef _KEY_H_
#define _KEY_H_
#include <STC15F2K60S2.H>
sbit k4=P3^3;
sbit k5=P3^2;
sbit k6=P3^1;
sbit k7=P3^0;
extern unsigned char k4_press;
extern unsigned char k5_press;
extern unsigned char k6_press;
extern unsigned char k7_press;
void key_read(void);
void key_control(void);
#endif
iic.c
#include <iic.h>
#include "intrins.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
//总线引脚定义
sbit SDA = P2^1; /* 数据线 */
sbit SCL = P2^0; /* 时钟线 */
//总线启动条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
somenop;
SDA = 0;
somenop;
SCL = 0;
}
//总线停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
somenop;
SDA = 1;
}
//等待应答
bit IIC_WaitAck(void)
{
SDA = 1;
somenop;
SCL = 1;
somenop;
if(SDA)
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byt&0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
somenop;
SCL = 1;
byt <<= 1;
somenop;
SCL = 0;
}
}
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++)
{
SCL = 1;
somenop;
da <<= 1;
if(SDA)
da |= 0x01;
SCL = 0;
somenop;
}
return da;
}
unsigned char adc_read(void)
{
unsigned char vol=0;
IIC_Start();
IIC_SendByte(0X90);
IIC_WaitAck();
IIC_SendByte(0X43); //dac :0x40 adc_an03:0x03 合起来就是0X43
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0X91);
IIC_WaitAck();
vol=IIC_RecByte();
IIC_Stop();
return vol;
}
void dac_out(unsigned char vol)
{
IIC_Start();
IIC_SendByte(0X90);
IIC_WaitAck();
IIC_SendByte(0X43);
IIC_WaitAck();
IIC_SendByte(vol);
IIC_WaitAck();
IIC_Stop();
}
iic.h
#ifndef _IIC_H_
#define _IIC_H_
#include <STC15F2K60S2.H>
unsigned char adc_read(void);
void dac_out(unsigned char vol);
#endif
main.c
#include <STC15F2K60S2.H>
#include <timer.h>
#include <smg.h>
#include <key.h>
#include <iic.h>
unsigned int fre;
unsigned char flag_smg=1,flag_smg_mode;
unsigned char flag_key;
unsigned char k4_count=0,k5_count=0,k6_count=0,k7_count=0;
long vol; unsigned int v=200;
unsigned char flag_adc;
unsigned char flag_led,flag_led_on=1;
unsigned char flag_20ms;
unsigned char flag_vol_auto=0;
void bee_init(void)
{
P2=(P2&0X1F)|0XA0;
P0=0X00;
P2&=0X1F;
}
void main(void)
{
bee_init();
TimerInit();
while(1)
{
/**********key**********/
if(flag_key)
{
flag_key=0;
key_read();
key_control();
}
if(k4_press)
{
k4_press=0;
if(flag_smg==1)
{
if(k4_count^=1)
flag_smg_mode=1;
else
flag_smg_mode=0;
}
}
else if(k5_press)
{
k5_press=0;
if(k5_count^=1)
flag_vol_auto=1;
else
{
flag_vol_auto=0;
v=200;
}
}
else if(k6_press)
{
k6_press=0;
if(k6_count^=1)
flag_led_on=0;
else
flag_led_on=1;
}
else if(k7_press)
{
k7_press=0;
if(k7_count^=1)
flag_smg=0;
else
flag_smg=1;
}
/**********adc&&dac**********/
if(flag_vol_auto)
{
if(flag_adc)
{
flag_adc=0;
vol=adc_read();
v=(unsigned int)(vol*500/255);
}
dac_out(vol);
}
else
dac_out(102); //255*2/5
/**********led**********/
if(flag_smg_mode==0)
{
if(v<150) flag_led=1;
else if((v>=150)&&(v<250)) flag_led=3;
else if((v>=250)&&(v<350)) flag_led=1;
else if(v>350) flag_led=3;
}
else if(flag_smg_mode==1)
{
if(fre<1000) flag_led=2;
else if(fre>=1000&&fre<5000) flag_led=4;
else if(fre>=5000&&fre<10000) flag_led=2;
else if(fre>=10000) flag_led=4;
}
if(flag_20ms)
{
flag_20ms=0;
if(flag_led_on)
{
if(flag_led==1)
{
P2=(P2&0X1F)|0X80;
P0=0XFE;
P2&=0X1F;
}
else if(flag_led==2)
{
P2=(P2&0X1F)|0X80;
P0=0XFD;
P2&=0X1F;
}
else if(flag_led==3)
{
P2=(P2&0X1F)|0X80;
P0=0XFA;
P2&=0X1F;
}
else if(flag_led==4)
{
P2=(P2&0X1F)|0X80;
P0=0XF5;
P2&=0X1F;
}
}
else if(flag_led_on==0)
{
P2=(P2&0X1F)|0X80;
P0=0XFF;
P2&=0X1F;
}
}
/**********smg**********/
if(flag_smg==0)
{
dspbuf[0]=22;
dspbuf[1]=22;
dspbuf[2]=22;
dspbuf[3]=22;
dspbuf[4]=22;
dspbuf[5]=22;
dspbuf[6]=22;
dspbuf[7]=22;
}
else if(flag_smg==1)
{
if(flag_smg_mode==0)
{
dspbuf[0]=20;
dspbuf[1]=22;
dspbuf[2]=22;
dspbuf[3]=22;
dspbuf[4]=22;
dspbuf[5]=v/100+10;
dspbuf[6]=v%100/10;
dspbuf[7]=v%10;
}
else if(flag_smg_mode==1)
{
dspbuf[0]=21;
dspbuf[1]=22;
dspbuf[2]=22;
if(fre%100000/10000<1)
dspbuf[3]=22;
else
dspbuf[3]=fre%100000/10000;
if(fre%10000/1000<1&&fre%100000/10000<1)
dspbuf[4]=22;
else
dspbuf[4]=fre%10000/1000;
if(fre%1000/100<1&&fre%10000/1000<1&&fre%100000/10000<1)
dspbuf[5]=22;
else
dspbuf[5]=fre%1000/100;
if(fre%100/10<1&&fre%1000/100<1&&fre%10000/1000<1&&fre%100000/10000<1)
dspbuf[6]=22;
else
dspbuf[6]=fre%100/10;
if(fre%10<1&&fre%100/10<1&&fre%1000/100<1&&fre%10000/1000<1&&fre%100000/10000<1)
dspbuf[7]=22;
else
dspbuf[7]=fre%10;
}
}
}
}
void timer1_isr(void) interrupt 3
{
static unsigned char flag_key_time=0;
static unsigned char flag_adc_time=0;
static unsigned char flag_20ms_time=0;
static unsigned int flag_1s_time=0;
if(++flag_20ms_time>=20)
{
flag_20ms_time=0;
flag_20ms=1;
}
if(++flag_key_time>=30)
{
flag_key_time=0;
flag_key=1;
}
if(++flag_adc_time>=100)
{
flag_adc_time=0;
flag_adc=1;
}
if(++flag_1s_time>=1000)
{
flag_1s_time=0;
fre=(TH0<<8)|TL0;
TH0 = TL0 = 0;
TF0 = 0;
TR0 = 1;
}
smg_display();
}