蓝桥杯单片机第九届初赛试题-彩灯控制器
主要涉及IIC通信中的 EEPROM和PCF8951。注意将驱动中的延时扩大8-12倍。在写本届赛题时字节超过2K,需要对软件进行破解,参考上篇
#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,0xbf,0xff,0xc6};
uchar yi,er,san,si,wu,liu,qi,ba;
uchar led_start=0;
uchar mode=1;//模式编号
uchar set=0;//s6设置
uint jiange=400;//流转间隔
uint LED_tt=0,set_tt=0,AD_tt=0;//0.8秒闪烁
uint RB2=0;//AD转换
uchar flag4=0;//s4长按标志
uchar LED_n=0;
uchar Light=0,LED_T=0;void allinit();
void Delay1ms(uint ms);
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);
void keyscan();
void Timer0Init(void);void main()
{allinit();Timer0Init();mode=EEPROM_Read(0x10);Delay1ms(5);jiange=EEPROM_Read(0x20)*100;Delay1ms(5);yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;while(1){
// RB2=AD_Read(0x03);if((set==0)&&(flag4==1)){if(RB2<64){yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=10;ba=1;}else if((RB2>=64)&&(RB2<128)){yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=10;ba=2;}else if((RB2>=128)&&(RB2<192)){yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=10;ba=3;}else if((RB2>=192)&&(RB2<255)){yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=10;ba=4;}} else if(set==0){yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;}keyscan();display1(yi,er);display2(san,si);display3(wu,liu);display4(qi,ba);}}void keyscan()
{
if(P30==0)//s7{Delay1ms(5);if(P30==0){if(led_start==0)led_start=1;else if(led_start==1)led_start=0;}while(!P30);}else if(P31==0)//s6{Delay1ms(5);if(P31==0){if(set==0){set=1;set_tt=0;if(jiange>=1000){yi=10;er=mode;san=10;si=11;wu=jiange/1000;liu=jiange%1000/100;qi=jiange%100/10;ba=jiange%10;}else{yi=10;er=mode;san=10;si=11;wu=11;liu=jiange/100;qi=jiange%100/10;ba=jiange%10;}}else if(set==1){ set=2;set_tt=0;if(jiange>=1000){yi=10;er=mode;san=10;si=11;wu=jiange/1000;liu=jiange%1000/100;qi=jiange%100/10;ba=jiange%10;}else{yi=10;er=mode;san=10;si=11;wu=11;liu=jiange/100;qi=jiange%100/10;ba=jiange%10;}}else if(set==2){set=0;set_tt=0;yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;EEPROM_Write(mode,0x10);Delay1ms(5);EEPROM_Write(jiange/100,0x20);Delay1ms(5);}}while(!P31);}else if(P32==0)//s5{Delay1ms(5);if(P32==0){if(set==1){mode+=1;if(mode>4){mode=4;}}else if(set==2){jiange+=100;if(jiange>1200){jiange=1200;}}}while(!P32);}else if(P33==0)//s4{Delay1ms(5);if(P33==0){flag4=1; }}if((flag4==1)&&(P33==1)){flag4=0;if(set==1){mode-=1;if(mode<1){mode=1;}}else if(set==2){jiange-=100;if(jiange<400){jiange=400;}}}}void Timer0Init(void) //1毫秒@12.000MHz
{AUXR |= 0x80; //定时器时钟1T模式TMOD &= 0xF0; //设置定时器模式TL0 = 0x20; //设置定时初值TH0 = 0xD1; //设置定时初值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时EA=1;ET0=1;
}void Timer0() interrupt 1
{set_tt++;LED_tt++;AD_tt++;if((LED_tt==1)&&(led_start==1))//每1ms扫描一次模式{if(mode==1){P2=0X00;P0=0XFF;P2=0X80;P0=~(0X01<<LED_n);P2=0X00;}else if(mode==2){P2=0X00;P0=0XFF;P2=0X80;P0=~(0X80>>LED_n);P2=0X00;}else if(mode==3){P2=0X00;P0=0XFF;P2=0X80;if(LED_n==0)P0=0X7E;else if(LED_n==1)P0=0XBD;else if(LED_n==2)P0=0XDB;else if(LED_n==3)P0=0XE7;P2=0X00;}else if(mode==4){P2=0X00;P0=0XFF;P2=0X80;if(LED_n==0)P0=0XE7;else if(LED_n==1)P0=0XDB;else if(LED_n==2)P0=0XBD;else if(LED_n==3)P0=0X7E;P2=0X00;}}else if(LED_tt==Light)//PWM控制 每一次循环20ms mode1 LED_tt=1亮 2-20熄灭 占空比5% // mode2 LED_tt=1-4亮 占空比20% // mode3 1-9占空比45% mode4 1-19 占空比95% {P2=0X00;P0=0XFF;P2=0X80;P0=0XFF;P2=0X00;}else if(LED_tt==20)//每20ms计时一次 LED_T +1{LED_tt=0;LED_T++;if((LED_T*20)>=jiange)//到了对应时间间隔之后 重新计时{LED_T=0;if(mode==1){LED_n++;if(LED_n>=8)LED_n=0;}else if(mode==2){LED_n++;if(LED_n>=8)LED_n=0;}else if(mode==3){LED_n++;if(LED_n>=4)LED_n=0;}else if(mode==4){LED_n++;if(LED_n>=4)LED_n=0;} } }if(AD_tt==200)//每200ms读取一次RB2值{AD_tt=0;RB2=AD_Read(0x03);if(RB2<64)Light=2;else if((RB2>=64)&&(RB2<128))Light=5;else if((RB2>=128)&&(RB2<192))Light=10;else if((RB2>=192)&&(RB2<256))Light=19;} if(set_tt==800)
{if(set==1){if(jiange>=1000){yi=11;er=11;san=11;si=11;wu=jiange/1000;liu=jiange%1000/100;qi=jiange%100/10;ba=jiange%10;}else{yi=11;er=11;san=11;si=11;wu=11;liu=jiange/100;qi=jiange%100/10;ba=jiange%10;}}else if(set==2){if(jiange>=1000){yi=10;er=mode;san=10;si=11;wu=11;liu=11;qi=11;ba=11;}else{yi=10;er=mode;san=10;si=11;wu=11;liu=11;qi=11;ba=11;}} }if(set_tt==1600){set_tt=0;if(set==1){if(jiange>=1000){yi=10;er=mode;san=10;si=11;wu=jiange/1000;liu=jiange%1000/100;qi=jiange%100/10;ba=jiange%10;}else{yi=10;er=mode;san=10;si=11;wu=11;liu=jiange/100;qi=jiange%100/10;ba=jiange%10;}}else if(set==2){if(jiange>=1000){yi=10;er=mode;san=10;si=11;wu=jiange/1000;liu=jiange%1000/100;qi=jiange%100/10;ba=jiange%10;}else{yi=10;er=mode;san=10;si=11;wu=11;liu=jiange/100;qi=jiange%100/10;ba=jiange%10;}}}}void allinit()
{P2=0X80;P0=0XFF;P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;P2=0XA0;P0=0X00;
}
void Delay1ms(uint ms) //@12.000MHz
{uint k;unsigned char i, j;for(k=ms;k>0;k--){i = 12;j = 169;do{while (--j);} while (--i);}
}void display1(uchar yi,uchar er)
{P2=0XC0;P0=0X01;P2=0XE0;P0=tab[yi];Delay1ms(1);P2=0XC0;P0=0X02;P2=0XE0;P0=tab[er];Delay1ms(1);}void display2(uchar san,uchar si)
{P2=0XC0;P0=0X04;P2=0XE0;P0=tab[san];Delay1ms(1);P2=0XC0;P0=0X08;P2=0XE0;P0=tab[si];Delay1ms(1);
}
void display3(uchar wu,uchar liu)
{P2=0XC0;P0=0X10;P2=0XE0;P0=tab[wu];Delay1ms(1);P2=0XC0;P0=0X20;P2=0XE0;P0=tab[liu];Delay1ms(1);}void display4(uchar qi,uchar ba)
{P2=0XC0;P0=0X40;P2=0XE0;P0=tab[qi];Delay1ms(1);P2=0XC0;P0=0X80;P2=0XE0;P0=tab[ba];Delay1ms(1);P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;//关闭所有数码管使其亮度一致
}
驱动参考
/*程序说明: IIC总线驱动程序软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台 8051,12MHz日 期: 2011-8-9
*/#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_();_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;
}//AD转换
unsigned char AD_Read(unsigned char add)
{unsigned char temp;IIC_Start(); IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(add);//采集AD信息的地址IIC_WaitAck();IIC_Stop();IIC_Start(); IIC_SendByte(0x91);IIC_WaitAck();temp=IIC_RecByte();IIC_Stop();return temp;
}//EEPROM读
unsigned char EEPROM_Read(unsigned char add)
{unsigned char temp;IIC_Start(); IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Stop();IIC_Start(); IIC_SendByte(0xa1);IIC_WaitAck();temp=IIC_RecByte(); IIC_Stop();return temp;
}//EEPROM写
void EEPROM_Write(unsigned char dat,unsigned char add)
{IIC_Start();IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_SendByte(dat);IIC_WaitAck();IIC_Stop();}
#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);
//添加//AD转换
unsigned char AD_Read(unsigned char add);
//EEPROM读
unsigned char EEPROM_Read(unsigned char add);
//EEPROM写
void EEPROM_Write(unsigned char dat,unsigned char add);#endif
蓝桥杯单片机第九届初赛试题-彩灯控制器相关推荐
- 蓝桥杯嵌入式 - 第九届决赛试题(电子秤)
第九届决赛试题(电子秤),在群文件里找到,应该是第九届的决赛题目. 先放上去代码及题目,后面博客慢慢写哈! 因为时间很久了,记不清楚具体资料是哪个了,把失效链接删除,下面这个是更新的全部蓝桥杯的资料. ...
- 第jiu届蓝桥杯单片机省赛真题_第九届蓝桥杯单片机组省赛试题.pdf
第九届蓝桥杯单片机组省赛试题 "彩灯控制器"的程序设计与调试 (70 分) 一.基本要求 1.1 使用CT107D 单片机竞赛板,完成"彩灯控制器"功能的程序设 ...
- 蓝桥杯单片机14届省赛
蓝桥杯单片机14届省赛代码(省一) 欢迎使用Markdown编辑器 main.c #include "HC138.h" #include "PCF8591.h" ...
- 【蓝桥杯】第九届蓝桥杯单片机国赛 代码程序
第九届蓝桥杯单片机国赛 程序 题目 hex文件 代码 工程文件 B站视频 更多资料 题目 历届的省赛和国赛的题目我已经在前面的文章(点击查看)里给大家分享了(网盘资源),需要的话,直接去下载,我在这里 ...
- 2016年蓝桥杯C++ A组初赛试题
2016年3月20日参加了蓝桥杯C++ A组的比赛,果然不出所料,被虐的体无完肤,自己还是差的太远,哎,先分享一下试题 第七届蓝桥杯大赛个人赛省赛真题(软件类) C/C++ 大学A组 考生须知: l ...
- 蓝桥杯嵌入式-第九届省赛-电子定时器
/*程序说明: 蓝桥杯大赛嵌入式-第九届省赛-电子定时器软件环境: Keil uVision 4.11 硬件环境: CT117E嵌入式竞赛板(代码兼容ILI932X系列.uc8230液晶控制器)日 期 ...
- 蓝桥杯 单片机原理及应用-试题汇总及答案
单片机原理及应用-试题汇总及答案 1.单片机是将微处理器.一定容量的 RAM 和ROM以及 I/O 口.定时器等电路集成在一块芯片上而构成的微型计算机. 2.单片机89C51片内集成了 4 KB的FL ...
- 蓝桥杯单片机12届第二场
这是第三次写了,都挺顺畅的,就是长按键那里卡了一下,就是发现还可以把按键写在定时器里,这样就方便多了,我之前写的长按键确实麻烦了些. main.c #include "sys.h" ...
- 【蓝桥杯单片机(24)】历届单片机客观题及答案解析
目录 考前冲刺,专栏完结篇 ## 推荐链接: 推荐视频–小蜜蜂老师讲解 赛点资源包下载,提取码:brno 三极管基本知识总结 运算放大电路的基础 第十三届蓝桥杯单片机官方直播课录屏 目录 一些刷题后的 ...
- 蓝桥杯单片机第十三届第二场
第十三届蓝桥杯单片机第二场 文章目录 第十三届蓝桥杯单片机第二场 前言 一.赛题分析 二.程序调试步骤 三.部分源程序 主函数部分 DAC处理函数 数码管处理函数 ADC处理函数 超声波处理函数 LE ...
最新文章
- 细心看完这篇文章,刷新对Javascript Prototype的理解
- github 视觉测量_教你如何提高双目立体视觉系统的精度
- 说说我的ID:fxh7622
- msfconsole 无法启动,解决办法
- 从C语言过渡到C++并不容易啊,大家说呢?
- opencv 图像颜色空间转换和特定颜色物体追踪
- unity怎么根据坐标绘制线_怎么根据阴线和阳线判断股票将稳步上涨或者下跌不止,K线组合...
- matlab工具箱使用50hz低通滤波器设计 和FFT 变化截取50hz工频信号幅值
- 我的NVIDIA开发者之旅——Caffe教程(2)[Jetson TK1]Caffe工具环境(Linux)搭建实例
- ionic代码压缩与代码混淆
- xp系统怎么进pe修改计算机名,PE下安装原版XP系统装系统图文教程
- python如何拼读英语单词怎么写_如何拼读英语单词
- Java实现经纬度格式转化
- C++核心准则边译边学-I.6 表达前提条件最好使用Expects()
- 随手记录第二话 -- 高并发情况下秒杀、抢红包都有哪些实现方式?
- scons 自定义命令行参数传递
- 如何快速办理软件著作权?
- js13位时间戳转换,10位时间戳转换
- Java——super关键字
- Python办公自动化实战 13 | Python-docx库:Python与Word的完美结合_学员考试准考证批量生成