第十一屆藍橋杯 單片機設計與開發 省賽
在昨天舉辦了第一波11屆藍橋杯比賽,第2波大概在10月份左右,看了看比賽題目,這次題目對於我來說,程序設計題簡單,客觀題全靠蒙!
本次比賽涉及:
1.數碼管顯示
2.矩陣按鍵
3.AD
4.AT24C02
5. LED
6.定時器
進入正題,先看一下程序設計題目:
-
猜到了這次考試肯定考矩陣鍵盤,只不過他沒有考全部的,只考了後兩列,用電位器模擬電壓輸入和AT24C02都用到了 IIC,定時器用的是定時器0 , 代碼功能全部實現
-
iic.h
#ifndef _IIC_H
#define _IIC_H
//函數聲明
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Ack(bit ackbit);
void IIC_SendByte(unsigned char byt);
bit IIC_WaitAck(void);
unsigned char IIC_RecByte(void);
void a24c02xie(unsigned char add,unsigned char dat);
unsigned char a24c02read(unsigned char add);
int getad(unsigned char add);
#endif
- iic.c
/*
程序說明: IIC總線驅動程序
軟件環境: Keil uVision 4.10
硬件環境: CT107單片機綜合實訓平臺 8051,12MHz
日 期: 2011-8-9
*/
#include "reg52.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_();_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;
}
//應答位控制
void IIC_Ack(bit ackbit)
{
if(ackbit)
{
SDA = 0;
}
else
{
SDA = 1;
}
somenop;
SCL = 1;
somenop;
SCL = 0;
SDA = 1;
somenop;
}
//等待應答
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;
}
void a24c02xie(unsigned char add,unsigned char dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
unsigned char a24c02read(unsigned char add)
{
unsigned char dat;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
dat=IIC_RecByte();
IIC_Stop();
return dat;
}
int getad(unsigned char add)
{
int dat;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat=IIC_RecByte();
IIC_Stop();
dat=dat*1.961;
return dat;
}
- main.c
#include<stc15f2k60s2.h>
#include<iic.h>
typedef unsigned int uint;
typedef unsigned char uchar;
int yi,er,san,si,wu,liu,qi,ba;
uchar code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc1,0x8c,0xc8,0xff,
0xc0&0x7f,0xf9&0x7f,0xa4&0x7f,0xb0&0x7f,0x99&0x7f,0x92&0x7f,0x82&0x7f,0xf8&0x7f,0x80&0x7f,0x90&0x7f};
int dianya,jishu,diancp,jiemian,flag,t,tt,liang,wuxiao,flagg,wuu;
void delay1ms(int ms);
void display1();
void display2();
void shangdian();
void Timer0Init(void) ; //1毫秒@12.000MHz
void juzhen();
main()
{
shangdian();
Timer0Init();
diancp=a24c02read(0);
diancp=diancp*10;
while(1)
{
juzhen();
dianya=getad(0x03);
if(jiemian==0)//數據界面
{
yi=10;er=san=si=wu=13;liu=dianya/100+14;qi=dianya%100/10;ba=dianya%10;
}
else if(jiemian==1)//參數界面
{
yi=11;er=san=si=wu=13;liu=diancp/100+14;qi=diancp%100/10;ba=diancp%10;
}
else if(jiemian==2)//計數界面
{
yi=12;er=san=si=wu=liu=13;qi=jishu/10;ba=jishu%10;
}
if(dianya>diancp)
{
flag=1;
t=tt=0;
TR0=0;
liang=0;
flagg=0;
}
else if(dianya<diancp)
{
TR0=1;
flagg=1;
}
if((flag==1)&&(flagg==1))
{
jishu++;
flag=0;
flagg=0;
}
if((liang==0)&&(jishu%2==0)&&(wuu==0))
{
P2=0X80;P0=0XFF;
}
else if((liang==0)&&(jishu%2==0)&&(wuu==1))
{
P2=0X80;P0=~(0X04);
}
else if((liang==0)&&(jishu%2==1)&&(wuu==0))
{
P2=0X80;P0=~(0X02);
}
else if((liang==0)&&(jishu%2==1)&&(wuu==1))
{ P2=0X80;P0=~(0X04|0x02);
}
else if((liang==1)&&(jishu%2==0)&&(wuu==0))
{P2=0X80;P0=~(0X01);
}
else if((liang==1)&&(jishu%2==0)&&(wuu==1))
{P2=0X80;P0=~(0X01|0x04);
}
else if((liang==1)&&(jishu%2==1)&&(wuu==0))
{P2=0X80;P0=~(0X01|0x02);
}
else if((liang==1)&&(jishu%2==1)&&(wuu==1))
{ P2=0X80;P0=~(0X01|0x02|0x04);
}
display1();
display2();
}
}
void shangdian()
{
P2=0XA0;P0=0X00;
P2=0X80;P0=0XFF;
P2=0XC0;P0=0XFF;
P2=0XE0;P0=0XFF;
}
void delay1ms(int ms)
{
int i;
for(;ms>0;ms--)
{
for(i=845;i>0;i--) ;
}
}
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TL0 = 0x20; //設置定時初值
TH0 = 0xD1; //設置定時初值
TF0 = 0; //清除TF0標誌
TR0 = 0; //定時器0開始計時
EA=1;
ET0=1;
}
void time0() interrupt 1
{
t++;
if(t==1000)
{ t=0;
tt++;
if(tt==5)
{
liang=1;
}
}
}
void display1()
{
P2=0XC0;P0=0X01;
P2=0XE0;P0=smg[yi];
delay1ms(1);
P2=0XC0;P0=0X02;
P2=0XE0;P0=smg[er];
delay1ms(1);
P2=0XC0;P0=0X04;
P2=0XE0;P0=smg[san];
delay1ms(1);
P2=0XC0;P0=0X08;
P2=0XE0;P0=smg[si];
delay1ms(1);
}
void display2()
{
P2=0XC0;P0=0X10;
P2=0XE0;P0=smg[wu];
delay1ms(1);
P2=0XC0;P0=0X20;
P2=0XE0;P0=smg[liu];
delay1ms(1);
P2=0XC0;P0=0X40;
P2=0XE0;P0=smg[qi];
delay1ms(1);
P2=0XC0;P0=0X80;
P2=0XE0;P0=smg[ba];
delay1ms(1);
P2=0XC0;P0=0X80;
P2=0XE0;P0=0xff;
}
void juzhen()
{
uchar temp;
P44=1;P42=1;P3=0XdF;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay1ms(5);
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xdb:
if(jiemian==2){
wuu=0;
jishu=0;}
else {
wuxiao++;
if(wuxiao==3)
{ wuu=1;
wuxiao=0;
}}
break;
case 0xd7:
wuu=0;
jiemian++;
if(jiemian==2)
{
a24c02xie(0,diancp/10);
delay1ms(5);
}
if(jiemian==3) jiemian=0;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
}
}
P44=1;P42=1;P3=0XeF;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay1ms(5);
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xeb:
if(jiemian==1){
wuu=0;
diancp=diancp-50;
if(diancp==-50)
{
diancp=500;
}}
else {wuxiao++;
if(wuxiao==3)
{wuu=1;wuxiao=0;}
}
break;
case 0xe7:
if(jiemian==1){
wuu=0;
diancp=diancp+50;
if(diancp==550)
{
diancp=0;
}}
else {wuxiao++;
if(wuxiao==3)
{ wuu=1;
wuxiao=0;}}
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
}
}
}