试题
代码
sys.h
cpp
#ifndef __SYS_H__
#define __SYS_H__
#include <STC15F2K60S2.H>
//ds1302.c
extern unsigned char time[3];
void w_ds1302();
void r_ds1302();
//iic.c
float v_adc(unsigned char addr);
//sys.c
extern float light_v;
extern float rb2_v;
extern unsigned char UI;
extern unsigned char UI_keep;
extern unsigned char ui2_son;
extern unsigned char ui2_son_flag;
extern unsigned char flag_touch[3];
extern unsigned char time_touch[3][3];
extern bit flag_happen;
void init74hc138(unsigned char addr);
void init();
void led_ui();
void rb2_or_light();
//seg_key.c
extern unsigned char Seg_Buff[8];
void Seg_Loop();
void Key_Loop();
void seg_ui();
#endif
main.c
cpp
#include "sys.h"
bit flag_seg=0;
bit flag_key=0;
bit flag_ds=0;
bit flag_rb2=0;
bit flag_light=0;
void Timer0_Init(void) //100微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x50; //设置定时初始值
TH0 = 0xFB; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1;
}
void main(){
init();
Timer0_Init();
w_ds1302();
while(1){
led_ui();
if(flag_seg){
flag_seg=0;
Seg_Loop();
}
if(flag_key){
flag_key=0;
Key_Loop();
seg_ui();
}
if(flag_ds){
flag_ds=0;
r_ds1302();
}
if(flag_light){
flag_light=0;
light_v=v_adc(3);
seg_ui();
}
if(flag_rb2){
flag_rb2=0;
rb2_v=v_adc(1);
seg_ui();
}
rb2_or_light();
}
}
void Timer0_Isr(void) interrupt 1
{
static unsigned char count1=0,count2=0;
static unsigned int count3=0,count4=0,count5=0;
count1++;count2++;count3++;count5++;
if(count1==2){
count1=0;
flag_seg=1;
}
if(count2==50){
count2=0;
flag_key=1;
}
if(count3==1000){
flag_light=1;
}else if(count3==2000){
count3=0;
flag_rb2=1;
}
if(flag_happen){
count4++;
if(count4==30000){
count4=0;
flag_happen=0;
UI=UI_keep;
}
}
if(count5==5000){
count5=0;
flag_ds=1;
}
}
【第十六届蓝桥杯单片机省赛赛前贴士-哔哩哔哩】 https://b23.tv/rFzFcL2
根据up主的建议,暂且将电压读取方式改为连续读取两次,否则光敏和rb2读取的数值正好相反。
sys.c
cpp
#include "sys.h"
unsigned char UI=0;
unsigned char UI_keep;
unsigned char ui2_son=0;
unsigned char ui2_son_flag=0;
unsigned char flag_touch[3]={0,0,0};
unsigned char time_touch[3][3]={0,0,0,0,0,0,0,0,0};
bit flag_happen=0;
float light_v;
float rb2_v;
void init74hc138(unsigned char addr){
P2=(P2&0x1f)|(addr<<5);
P2&=0x1f;
}
void init(){
P0=0x00;
init74hc138(5);
P0=0xff;
init74hc138(4);
}
void led(unsigned char addr){
P0=~(0x01<<(addr-1));
init74hc138(4);
}
void led_ui(){
switch(UI){
case 0:led(1);break;
case 1:led(2);break;
case 2:led(3);break;
case 4:led(8);break;
}
}
void rb2_or_light(){
EA = 0;
if(light_v<rb2_v&&flag_happen==0){
flag_happen=1;
flag_touch[ui2_son_flag]=1;
ui2_son_flag++;
if(ui2_son_flag==3)ui2_son_flag=0;
time_touch[2][0]=time_touch[1][0];
time_touch[2][1]=time_touch[1][1];
time_touch[2][2]=time_touch[1][2];
time_touch[1][0]=time_touch[0][0];
time_touch[1][1]=time_touch[0][1];
time_touch[1][2]=time_touch[0][2];
time_touch[0][0]=time[0];
time_touch[0][1]=time[1];
time_touch[0][2]=time[2];
UI_keep=UI;
UI=4;
}
EA =1;
}
seg_key.c
cpp
#include "sys.h"
sbit ROW3=P3^2;
sbit ROW4=P3^3;
sbit COL1=P4^4;
sbit COL2=P4^2;
code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A 10
0xc6, //C 11
0x8c, //P 12
0xbf, //- 13
0xff, //熄灭 14
0xc1 //U 15
};
unsigned char Seg_Buff[8]={14,14,14,14,14,14,14,14};
unsigned char keyval,keyold,keyup,keydown;
void seg(unsigned char addr,unsigned char num){
P0=0xff;
init74hc138(7);
P0=0x01<<addr;
init74hc138(6);
P0=Seg_Table[num];
if(UI==1&&(addr==1||addr==5))
P0&=0x7f;
init74hc138(7);
}
void Seg_Loop(){
static unsigned char i=0;
seg(i,Seg_Buff[i]);
i++;
if(i==8) i=0;
}
unsigned char key_scan(){
COL1=0;COL2=1;
if(ROW3==0) return 5;
if(ROW4==0) return 4;
COL1=1;COL2=0;
if(ROW4==0) return 8;
return 0;
}
void Key_Loop(){
keyval=key_scan();
keydown=keyval&(keyold^keyval);
keyup=~keyval&(keyold^keyval);
if(keyval==4&&keyold!=4){
UI++;
if(UI==3) UI=0;
ui2_son=0;
}
if(UI==2){
if(keyval==5&&keyold!=5){
ui2_son++;
if(ui2_son==3) ui2_son=0;
}
if(keyval==8&&keyold!=8){
ui2_son_flag=0;
flag_touch[0]=0;
flag_touch[1]=0;
flag_touch[2]=0;
}
}
keyold=keyval;
keyval=0;
}
void ui0(){
Seg_Buff[7]=time[0]%10;
Seg_Buff[6]=time[0]/10;
Seg_Buff[5]=13;
Seg_Buff[4]=time[1]%10;
Seg_Buff[3]=time[1]/10;
Seg_Buff[2]=13;
Seg_Buff[1]=time[2]%10;
Seg_Buff[0]=time[2]/10;
}
void ui1(){
Seg_Buff[7]=(unsigned char)(rb2_v*100+0.5)%10;
Seg_Buff[6]=(unsigned char)(rb2_v*100+0.5)/10%10;
Seg_Buff[5]=(unsigned char)(rb2_v*100+0.5)/100%10;
Seg_Buff[4]=15; //U
Seg_Buff[3]=(unsigned char)(light_v*100+0.5)%10;
Seg_Buff[2]=(unsigned char)(light_v*100+0.5)/10%10;
Seg_Buff[1]=(unsigned char)(light_v*100+0.5)/100%10;
Seg_Buff[0]=12; //p
}
void ui2(){
Seg_Buff[0]=10;
Seg_Buff[1]=ui2_son+1;
if(flag_touch[ui2_son]){
Seg_Buff[7]=time_touch[ui2_son][0]%10;
Seg_Buff[6]=time_touch[ui2_son][0]/10;
Seg_Buff[5]=time_touch[ui2_son][1]%10;
Seg_Buff[4]=time_touch[ui2_son][1]/10;
Seg_Buff[3]=time_touch[ui2_son][2]%10;
Seg_Buff[2]=time_touch[ui2_son][2]/10;
}else{
Seg_Buff[7]=13;
Seg_Buff[6]=13;
Seg_Buff[5]=13;
Seg_Buff[4]=13;
Seg_Buff[3]=13;
Seg_Buff[2]=13;
}
}
void ui4(){
Seg_Buff[7]=time_touch[0][0]%10;
Seg_Buff[6]=time_touch[0][0]/10;
Seg_Buff[5]=time_touch[0][1]%10;
Seg_Buff[4]=time_touch[0][1]/10;
Seg_Buff[3]=time_touch[0][2]%10;
Seg_Buff[2]=time_touch[0][2]/10;
Seg_Buff[1]=11;
Seg_Buff[0]=11;
}
void seg_ui(){
switch(UI){
case 0:ui0();break;
case 1:ui1();break;
case 2:ui2();break;
case 4:ui4();break;
}
}
iic.c
cpp
#include "sys.h"
#include "intrins.h"
#define DELAY_TIME 10
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);
}
unsigned char adc(unsigned char addr){
unsigned char temp;
EA = 0;
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
temp=I2CReceiveByte();
I2CSendAck(1);
I2CStop();
EA = 1;
return temp;
}
float v_adc(unsigned char addr){
return (float)(adc(addr)/256.0*5.0);
}
ds1302.c
cpp
#include "sys.h"
#include "intrins.h"
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST=P1^3;
unsigned char time[3]={50,59,23};
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK = 0;
SDA = temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat/10*16|dat%10);
RST=0;
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
unsigned char dat1,dat2;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
dat1=temp/16;
dat2=temp%16;
temp=dat1*10+dat2;
return (temp);
}
void w_ds1302(){
unsigned char i,addr=0x80;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<3;i++){
Write_Ds1302_Byte(addr,time[i]);
addr+=2;
}
Write_Ds1302_Byte(0x8e,0x80);
}
void r_ds1302(){
unsigned char i,addr=0x81;
for(i=0;i<3;i++){
time[i]=Read_Ds1302_Byte(addr);
addr+=2;
}
}