首先这套题也比较常规,可能频率测量大家不熟悉,掌握这套代码就不用恐惧频率测量的题目了
工程文件在博主的资源中可自行下载(免费)
1.首先配置文件(关键)
#include "key.h"
#include <STC15F2K60S2.H>
#include "iic.h"
uint segtab[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff
,0x4e,0x3e, 0xc0&0x7f, 0xF9&0x7f,0xA4&0x7f,0xB0&0x7f, 0x99&0x7f,
0x92&0x7f,0x82&0x7f,0xF8&0x7f, 0x80&0x7f,0x90&0x7f}; //储存显示界面
uint segbuff[8]={0};
uint count_f=0; //频率次数每个时钟周期加1
uint sum=2035; //1s的总频率
uint count=0; //计时1s
uint count_v=0; //数据采集计数
bit flag_v=0; //可以采集标志位
uint v; // 采集数据
uchar mod1=0; //界面切换
uchar mod2=0; //模式切换
uint count_s=0; //长按时间
uint flag_s=0; //1s标志位
uchar aaa=0; //是否启动led
uint temp1; //存储电压
uint temp2; //存储频率
void delay(uint t)
{
while(t--);
}
void time0()
{
TMOD=0x06;
TH0=0xff;
TL0=0xff;
TR0=1;
ET0=1;
EA=1;
}
void time2(void)
{
T2H=(65535-10000)/256; //10ms
T2L=(65535-10000)%256;
EA=1;
IE2|=0x04; //定时器2中断允许
AUXR|=0x10; //开启定时器2
}
void time1()
{ //1ms
TMOD|=0x10;
TH1=(0-5000)/256;
TL1=(0-5000)%256;
TR1=1;
ET1=1;
}
void init() //关闭蜂鸣器和led
{
select(4);
P0=0xff;
select(5);
P0=0xaf;
}
void Timer0() interrupt 1
{
count_f++; //频率次数
}
void Timer1() interrupt 3 //5ms
{
TH1=(0-5000)/256;
TL1=(0-5000)%256;
count++;
if(count==200) //1s采集频率
{
sum=count_f;
count_f=0;
count=0;
}
count_v++;
if(count_v==100) // 0.5s采集电压
{
flag_v=1;
count_v=0;
}
}
void Timer2() interrupt 12
{
count_s++; //判断S7是否长按
if(count_s==100)
{
count_s=0;
flag_s++;
}
}
void scan_kbd()
{
if(S4==0)
{
delay(100);
if(S4==0)
{
mod1++; //切换界面
if(mod1==3)mod1=0;
while(!S4){ //判断弹起的时候刷新数码管
show_seg(0);delay(500);
show_seg(4);delay(500);
show_seg(5);delay(500);
show_seg(6);delay(500);
show_seg(7);delay(500);led_work();}
}
}
if(S5==0&&mod1==2)
{
delay(100);
if(S5==0)
{
mod2++; if(mod1==1)mod2=0; //模式切换
while(!S5){ //判断弹起的时候刷新数码管
show_seg(0);delay(500);
show_seg(4);delay(500);
show_seg(5);delay(500);
show_seg(6);delay(500);
show_seg(7);delay(500);}
}
}
if(S7==0)
{
delay(100);
if(S7==0)
{ count_s=0;
flag_s=0;
while(!S7)
{
//判断弹起的时候刷新数码管
show_seg(0);delay(500);
show_seg(4);delay(500);
show_seg(5);delay(500);
show_seg(6);delay(500);
show_seg(7);delay(500);
}
if(flag_s>=1) //大于1s
{
if(aaa<1)aaa++;
else aaa=0;
} //¶Ì°´±£´æƵÂÊ
else temp2=sum;
}
}
if(S6==0)
{
delay(100);
if(S6==0)
{ //保存电压
temp1= adc_read(0x41)*100/51;
while(!S6)
{
show_seg(0);delay(500);
show_seg(4);delay(500);
show_seg(5);delay(500);
show_seg(6);delay(500);
show_seg(7);delay(500);
// led_work();
}
}
}
}
void select(uchar n)
{
switch(n)
{
case 0:P2=P2&0x1f;break;
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;
}
}
void show_seg(uchar wei)
{
select(6);
P0=1<<wei;
select(7);
P0=segtab[segbuff[wei]];
select(0);
}
//²É¼¯ÆµÂÊ
void SMG1()
{
segbuff[0]=11;
segbuff[1]=10;
segbuff[2]=10;
segbuff[3]=10;
if(sum>=1000)
segbuff[4]=sum/1000;
else segbuff[4]=10;
if(sum<100)
segbuff[5]=10;
else segbuff[5]=sum/100%10;
if(sum<10) segbuff[6]=10;
else segbuff[6]=sum/10%10;
if(sum>0)
segbuff[7]=sum%10;
else segbuff[7]=10;
}
void led_work()
{
if(aaa==0)
{
if(temp1>v)
{
P2=P2&0x1f|0x80;
P0=0xfe;
}
if(temp2<v)
{
P2=P2&0x1f|0x80;
P0=0xef;
}
}
if(aaa>0)
{
P2=P2&0x1f|0x80;
P0=0xff;
}
}
//ÖÜÆÚÏÔʾ
void SMG2()
{
uint dat_t=1000000/sum;
segbuff[0]=11;
segbuff[1]=10;
segbuff[2]=10;
segbuff[3]=10;
if(sum>=1000)
segbuff[4]=dat_t/1000;
else segbuff[4]=10;
if(sum<100)
segbuff[5]=10;
else segbuff[5]=dat_t/100%10;
if(sum<10) segbuff[6]=10;
else segbuff[6]=dat_t/10%10;
if(sum>0)
segbuff[7]=dat_t%10;
else segbuff[7]=10;
}
//²É¼¯µçѹ
void SMG3()
{
segbuff[0]=12;
segbuff[1]=11;
segbuff[2]=mod2+1; //²É¼¯Í¨µÀ
segbuff[3]=10;
segbuff[4]=10;
segbuff[5]=v/100+13;
segbuff[6]=v/10%10;
segbuff[7]=v%10;
}
void SMG()
{
if(mod1==0)SMG1();
else if(mod1==1)SMG2();
else SMG3();
}
2.main函数(主要调用函数)
#include "key.h"
#include "iic.h"
uchar mod_v=0x40;
void main()
{
init();
time0(); //初始化定时器0
time1(); //初始化定时器1
time2(); //初始化定时器2
while(1)
{
if(flag_v) //采集数据标志位
{
if(mod2==0)mod_v=0x41; //光敏
else mod_v=0x43; //电压
v=adc_read(mod_v)*1.96;
flag_v=0;
}
scan_kbd();//扫描按键
SMG(); //数组赋值,显示什么数据
led_work();//led控制
//刷新数码管
show_seg(0);delay(500);
show_seg(4);delay(500);
show_seg(5);delay(500);
show_seg(6);delay(500);
show_seg(7);delay(500);
}
}
3.然后就是iic.c文件
#include "iic.h"
#define DELAY_TIME 5
//I2C????????
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
//I2C??????
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
//I2C??????
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//??????????
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit;
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//????
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
//I2C??????????
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
//I2C??????????
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
unsigned char adc_read(unsigned char addr)
{
unsigned char date;
IIC_Start();
IIC_SendByte(0x90);//ͨÐÅ·¢ËÍдÈëÇëÇó
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Stop();//¹Ø±ÕIIC
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
date=IIC_RecByte();
IIC_SendAck(1);
return date;
}
/*
void dac_out(unsigned char date)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40); //0x43
IIC_WaitAck();
IIC_SendByte(date);
IIC_WaitAck();
IIC_Stop();
}
*/
4.H文件
#ifndef _IIC_H
#define _IIC_H
#include <STC15F2K60S2.H>
#include "intrins.h"
sbit SDA = P2^1;
sbit SCL = P2^0;
void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendAck(bit ackbit);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
unsigned char adc_read(unsigned char addr);
void dac_out(unsigned char date);
#endif
key.h
#ifndef _KEY_H
#define _KEY_H
#define uchar unsigned char
#define uint unsigned int
#define S4 P33
#define S5 P32
#define S6 P31
#define S7 P30
extern bit flag_v;
extern uchar mod2;
extern uint v;
void delay(uint t);
void time0();
void time1();
void init();
void scan_kbd();
void select(uchar n);
void show_seg(uchar wei);
void SMG1();
void SMG2();
void SMG3();
void SMG();
void time2(void);
void led_work();
void delay(uint t);
#endif