第十届赛题是我第一次尝试写的比赛真题,当时刚把模块的东西学习一遍就开始尝试写,当初写那真是七零八落 bug百出,很是难受。
经过几个月的漫长学习以及沉淀,比赛将近我又又又把这届赛题写了一遍,现在这种感觉可谓是畅通无阻,当然除了LED模块那调试了几次,
main.c
#include "stc15f2k60s2.h"
#include "iic.h"
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
0xbf,0xff,0x8e,0xc1};
uchar Digbuf[]={0,1,2,3,4,5,6,7};//数码管显示位数
uchar Digcom=0,led_kai,led_bit;
bit DAC=0,bz;
uchar mode,yemian;
uint coun_f,count,pinlv,dianya,AD;
void keyscan(); //按键函数
void Timer2Init(void) ;//数码管显示定时器
void delayms(int ms);//延时函数
void Allinit();//初始化函数
void pinlv_dis();//频率电压显示界面
void timer0_init();//NE555定时器初始化函数
void led_dis();//LED显示函数
void main()
{
Timer2Init();
Allinit();
timer0_init();
// Digbuf[0]=1;Digbuf[1]=2;Digbuf[2]=3;Digbuf[3]=4;Digbuf[4]=5;Digbuf[5]=6;Digbuf[6]=7;Digbuf[7]=8;
while(1)
{
AD=AD_read(0x03);//获取AD的值
if(DAC==0){AD_wirte(102);}//当DAC等于0时读取固定电压值2V
else if(DAC==1){AD_wirte(AD);}//当DAC等于1时读取RB2模拟电压值
keyscan();
led_dis();//led显示函数
pinlv_dis();
}
}
void led_dis()
{
if(led_kai==0)//打开led
{
if(yemian==0){P2=(P2&0X1F)|0X80;led_bit=0XFE;led_bit|=0x02;P0=led_bit;}
if(yemian==1){P2=(P2&0X1F)|0X80;led_bit=0XFD;led_bit|=0x01;P0=led_bit;}
if(dianya<150){P2=(P2&0X1F)|0X80;led_bit|=0X04;P0=led_bit;}
else if((dianya<=150)&&(dianya<250)){P2=(P2&0X1F)|0X80;led_bit&=0xfb;P0=led_bit;}
else if((dianya<=250)&&(dianya<350)){P2=(P2&0X1F)|0X80;led_bit|=0X04;P0=led_bit;}
else if(dianya>=350){P2=(P2&0X1F)|0X80;led_bit&=0xfb;P0=led_bit;}
if(pinlv<1000){P2=(P2&0X1F)|0X80;led_bit|=0x08;P0=led_bit;}
else if((1000<=pinlv)&&(pinlv<5000)){P2=(P2&0X1F)|0X80;led_bit&=0xf7;P0=led_bit;}
else if((5000<=pinlv)&&(pinlv<10000)){P2=(P2&0X1F)|0X80;led_bit|=0x08;P0=led_bit;}
else if(pinlv>=10000){P2=(P2&0X1F)|0X80;led_bit&=0xf7;P0=led_bit;}
if(DAC==0){P2=(P2&0X1F)|0X80;led_bit|=0x10;P0=led_bit;}
else if(DAC==1){P2=(P2&0X1F)|0X80;led_bit&=0xef;P0=led_bit;}
}
else if(led_kai==1)//关闭led
{
P2=(P2&0X1F)|0x80;P0=0XFf;
}
}
void pinlv_dis()
{
if(yemian==0)//频率显示界面
{
if(pinlv>=10000){Digbuf[0]=22,Digbuf[1]=21;Digbuf[2]=21;Digbuf[3]=pinlv/10000;Digbuf[4]=pinlv%10000/1000;Digbuf[5]=pinlv%1000/100;Digbuf[6]=pinlv%100/10;Digbuf[7]=pinlv%10;}
else if(pinlv>=1000){Digbuf[0]=22,Digbuf[1]=21;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=pinlv/1000;Digbuf[5]=pinlv%1000/100;Digbuf[6]=pinlv%100/10;Digbuf[7]=pinlv%10;}
else if(pinlv>=100){Digbuf[0]=22,Digbuf[1]=21;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;Digbuf[5]=pinlv/100;Digbuf[6]=pinlv%100/10;Digbuf[7]=pinlv%10;}
else if(pinlv>=10){Digbuf[0]=22,Digbuf[1]=21;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;Digbuf[5]=21;Digbuf[6]=pinlv/10;Digbuf[7]=pinlv%10;}
}
else if(yemian==1)//电压界面
{
dianya=AD*1.96;
Digbuf[0]=23;Digbuf[1]=21;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;Digbuf[5]=dianya/100+10;Digbuf[6]=dianya%100/10;Digbuf[7]=dianya%10;
}
}
void timer0_init()//定时器初始化函数
{
TMOD=0X16;
TH0=0XFF;
TL0=0XFF;
TH1=(65535-50000)/255;
TL1=(65535-50000)%255;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EA=1;
}
void timer0() interrupt 1
{
count++;
}
void timer1() interrupt 3
{
coun_f++;
if(coun_f==20)
{
coun_f=0;
pinlv=count;
count=0;
}
}
void keyscan()
{
if(P30==0)
{
delayms(5);
if(P30==0)
{
if(bz==0){bz=1;EA=0;ET0=0;P2=0XC0;P0=0XFF;P2=0XFF;P0=0XFF;}//关闭数码管,我这里数码管是用定时器写的,所以我就关闭了定时器
else if(bz==1){bz=0;EA=1;ET0=1;}//开启定时器
}
while(!P30);
}
else if(P31==0)
{
delayms(5);
if(P31==0)
{
if(led_kai==0){led_kai=1;}
else if(led_kai==1){led_kai=0;}
}
while(!P31);
}
else if(P32==0)
{
delayms(5);
if(P32==0)
{
if(DAC==0){DAC=1;}
else if(DAC==1){DAC=0;}
}
while(!P32);
}
else if(P33==0)
{
delayms(5);
if(P33==0)
{
if(yemian==0){yemian=1;P2=(P2&0X1F)|0X80;led_bit=0XFD;led_bit|=0x01;P0=led_bit;}
else if(yemian==1){yemian=0;P2=(P2&0X1F)|0X80;led_bit=0XFE;led_bit|=0x02;P0=led_bit;}
}
while(!P33);
}
}
void Timer2Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0xCD; //设置定时初始值
T2H = 0xD4; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
IE2|=0X04;//开定时器2中断
EA=1; //开总中断
}
//中断服务程序(数码管显示)
void time2int() interrupt 12 //中断入口
{
P2|=0XC0;//打开位选573 U8
P2&=0XDF;
P0=(1<
iic.c
#include "stc15f2k60s2.h"
#include "intrins.h"
#include "iic.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_();_nop_();_nop_();_nop_();_nop_();_nop_();}
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
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 AD_read(unsigned char dat)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_WaitAck();
IIC_Stop();
return temp;
}
void AD_wirte(unsigned char add)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
}
iic.h
#ifndef _IIC_H
#define _IIC_H
void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
unsigned char AD_read(unsigned char dat);
void AD_wirte(unsigned char add);
#endif
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)