第九届蓝桥杯单片机省赛题彩灯

2023-11-16

参考佬中佬,但不搬运 !!!

 http://t.csdn.cn/4tnjz

#include <STC15F2K60S2.H>
#include <IIC.H>
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
#define u8 unsigned char
#define u16 unsigned int

u8 smg[8]={11,11,11,11,11,11,11,11};//初始显示10,全息数码管
u8 tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
u8 LED1[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //模式1
u8 LED2[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //模式2
u8 LED3[4]={0x7e,0xbd,0xdb,0xe7}; //模式3
u8 LED4[4]={0xe7,0xdb,0xbd,0x7e}; //模式4
 
u16 smg_t;
u16 led_t;
u16 gap;
u8 num;

u8 smg_flag;
u8 smg_mode;

u8 led=0xff;
u8 led_mode;
u8 led_flag;

u8 pwm_duty;
u8 pwm_t;

u8 s6_sta;
u8 s7_flag;
u8 key_flag;
//============================初始化函数================================
void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;
	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}
void Delay5ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 54;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
void Timer1Init(void)		//1毫秒@12.000MHz led流转
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x18;		//设置定时初值
	TH1 = 0xFC;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	EA=1;ET1=1;
}
void Timer0Init(void)		//8毫秒@12.000MHz 扫描按键
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x60;		//设置定时初值
	TH0 = 0xF0;		//设置定时初值
	TF0 = 0;		//清除TF0标志
  TR0=1;//定时器0开始计时
	EA=1;ET0=1;
}
void Initsystem()
{
	P2=(P2&0x1f)|0x80;
	P0=0xff;
	P2=(P2&0x1f)|0xa0;
	P0=0x00;
	P2=(P2&0x1f)|0xc0;
	P0=0xff;
	P2=(P2&0x1f)|0xe0;
	P0=0xff;
}
//============================led流转================================
void  setled()
	{
		switch(led_mode)
						{
							case 1:if(num>=8)num=0;led=LED1[num];break;//led1
							case 2:if(num>=8)num=0;led=LED2[num];break;//led2
							case 3:if(num>=4)num=0;led=LED3[num];break;//led3
							case 4:if(num>=4)num=0;led=LED4[num];break;//led4
						}	
	}

void Timer1Service() interrupt 3
{
if(smg_mode==0)
  {
	if(s7_flag)
	{
	led_t++;

   //控制流转间隔
   if(led_t>=gap){
		  led_t=0; 
		 
		 if(led_flag) led_flag=0;
		 else{num++; led_flag=1;}
	  }
	 
	 if(led_flag) {
    //控制亮度
		  pwm_t++;
  		if(pwm_t==pwm_duty)
			 led=0xff;
      if(pwm_t==5)
	    {  	pwm_t=0; 	
		      setled();
	    }
		}
	else led=0xff;
	}
	else led=0xff;
}
else//数码管0.8s闪烁
	{
	led=0xff;
	smg_t++;
	if(smg_t>=800)
	{
		smg_t=0; smg_flag=~smg_flag;
	}
}
}
//============================PWm_duty调节================================
u8 PCF8591NUM()
{
	u8 Val;
	EA = 0;
	IIC_Start();				//IIC启动
	IIC_SendByte(0x90); 		//IIC选择地址,并发送写指令
	IIC_WaitAck();				//等待IIC应答
	IIC_SendByte(0x03);			//选择模拟量输入通道
	IIC_WaitAck();
	IIC_Stop();    				//IIC停止,接下来开始读取数据
	
	IIC_Start();				//IIC启动
	IIC_SendByte(0x91); 		//IIC选择地址,并发送读指令
	IIC_WaitAck();				//IIC等待应答
	Val = IIC_RecByte();		//接收PCF8591数据
	IIC_SendAck(1);				//发送应答位
	IIC_Stop();
	EA = 1;
	if(Val>=0&&Val<50)
		Val = 1;
	else if(Val>=50&&Val<100)
		Val = 2;
	else if(Val>=100&&Val<150)
		Val = 3;
	else if(Val>=150&&Val<256)
		Val = 4;
	/*根据所得ad值返回四种不同的数据给PWM*/
	return Val;
}
//============================数据保存================================
void eeprom_weite(u8 addr ,u8 val)
{

	IIC_Start();				//IIC启动
	IIC_SendByte(0xA0); 		//IIC选择地址,并发送写指令
	IIC_WaitAck();				//等待IIC应答
	IIC_SendByte(addr);			//选择模拟量输入通道
	IIC_WaitAck();
	IIC_SendByte(val); 
  IIC_WaitAck();
	IIC_Stop();    				//IIC停止,接下来开始读取数据
}
u8 eeprom_read(u8 addr)
{
	u8 Val;
	EA = 0;
	IIC_Start();				//IIC启动
	IIC_SendByte(0xA0); 		//IIC选择地址,并发送写指令
	IIC_WaitAck();				//等待IIC应答
	IIC_SendByte(addr);			//选择模拟量输入通道
	IIC_WaitAck();
  
  IIC_Start();				//IIC启动
	IIC_SendByte(0xA1); 		//IIC选择地址,并发送读指令
	IIC_WaitAck();				//IIC等待应答
	Val = IIC_RecByte();		//接收PCF8591数据
	IIC_SendAck(1);				//发送应答位
	IIC_Stop();
	EA=1;
 return Val;
}
//============================显示数码管================================	
void setgap()  //流转间隔数据
{
 if(gap>999)
 {
	 smg[4]=gap/1000;
	 smg[5]=gap/100%10;
 }
 else
 {
	 smg[4]=11;
	 smg[5]=gap/100;
  }
	 smg[6]=gap/10%10;
	 smg[7]=gap%10;
}	
void setsmg()  //显示界面
{
  switch(smg_mode)
	{
		case 0 : smg[0]= smg[1]=smg[2]= smg[3]=smg[4]= smg[5]=smg[6]= smg[7]=11;
		break;
		case 1 : smg[0]= smg[2]=10; smg[3]=11,  setgap(); 
		
		         if(smg_flag)  { smg[1]=led_mode; } 
						 else            smg[1]=11;
		break;
		case 2 : smg[0]= smg[2]=10; smg[3]=11;  smg[1]=led_mode; 
						 if(smg_flag)    setgap();
						 else          { smg[4]= smg[5]=smg[6]= smg[7]=11;}
    break;
	}
}
void outputsmg() //数码管输出
{
	u8 i;
	
	for(i=0;i<8;i++) {
	P2=(P2 &0x1f) |0xc0;
	P0=(1<<i);
	P2=(P2 &0x1f) |0xe0;
	P0=tab[smg[i]];
	Delay1ms();
	}
	P2=(P2 &0x1f) |0xc0;
	P0=0xff;
	P2=(P2 &0x1f) |0xe0;
	P0=0xff;
}
//============================按键处理================================
void Timeber0service() interrupt 1
{
key_flag=1;
}	


void scankey()
{
 if(key_flag)
 {
	 key_flag=0;
 if(s7==0)
	{
		while(s7==0);
   s7_flag=~s7_flag;
	}
  else if(s6==0)
  {
		switch(s6_sta)
		{
		case 0:  smg_mode=1; s6_sta=1; break;
		case 1:  smg_mode=2; s6_sta=2; break;
		case 2:  smg_mode=0;TR0=0; 	eeprom_weite(0x00,led_mode);	 Delay5ms();	eeprom_weite(0x01,gap/10);	TR0=1;  s6_sta=0;break;
		}
				while(s6==0){outputsmg();}
	}
	else if(s5==0)
	{
		while(s5==0){outputsmg();}
		switch(smg_mode)
		{
			case 1: if(led_mode>=4) led_mode=1;else led_mode+=1;  break; 
			case 2: if(gap>=1200) gap=100;else gap+=100; break;
	  }
	}
		else if(s4==0)
	{
     	while(s4==0){outputsmg();}
		switch(smg_mode)
		{	
			case 1: if(led_mode<=1) led_mode=1; else led_mode-=1; break; 
			case 2: if(gap<=100) gap=100; else gap-=100; break;
	  }	
  }
}
}
//============================main函数================================
void main()
{
	Timer1Init();
	Timer0Init();
	Initsystem();
	led_mode=eeprom_read(0x00); //上电数据读取
	gap=eeprom_read(0x01);
	gap*=10;
	while(1)
	{
		scankey(); 
		if(smg_mode) //数码管没有熄灭
    {
     setsmg(); 
		 outputsmg();
    }

	  else    //数码管熄灭
		{ 
    	 while(s4==0)  //长按S4
			 {
			 led=0xff; P2=0x80;
             smg[0]= smg[1]=smg[2]= smg[3]=smg[4]= smg[5]=11;
			 smg[6]=10; smg[7]= pwm_duty;
			 outputsmg();
			}
  	}
	  pwm_duty=PCF8591NUM();  //读取Pwm_duty
		P2=0x80;	P0=led;       //输出led值
}
}

驱动程序

/*
  程序说明: IIC总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台 8051,12MHz
  日    期: 2011-8-9
*/

#include "reg52.h"
#include "intrins.h"

#define DELAY_TIME 5

#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */

void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}
//总线启动条件
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}

//总线停止条件
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;  					// 0:应答,1:非应答
    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;    
}
#ifndef _IIC_H_
#define _IIC_H_

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); 

#endif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第九届蓝桥杯单片机省赛题彩灯 的相关文章

  • 聊透spring @Configuration配置类

    本章节我们来探索Spring中一个常用的注解 Configuration 我们先来了解一下该注解的作用是 用来定义当前类为配置类 那啥是配置类啊 有啥用啊 这个我们得结合实际使用场景来说 通常情况下 加了 Configuration的配置类
  • 机器学习——决策树(Decision Trees)

    决策树 决策树是机器学习中一种最为常见的算法 顾名思义 决策树是基于树结构来进行决策的 这恰是人类在面对决策问题时一种很自然的处理机制 决策树的生成算法可以说是信息论的一种应用 但它其实只用到了信息论中的一小部分思想 因此对信息论有个基础性
  • Python系列教程-目录

    转载至 http www cricode com 3086 html Python初级教程 Python快速教程 手册 Python基础01 Hello World Python基础02 基本数据类型 Python基础03 序列 Pytho
  • CSS 之层叠规则(权级、权重、顺序)详解

    文章目录 参考 描述 定义 层叠 层叠与冲突 规则 权重 优先级 权重值的叠加 顺序 权级 权级 层叠规则的运用 顺序 尾声 参考 项目 描述 MDN WEB Docs 优先级 Amily mo 令人烦恼的css选择器权值问题 Amily
  • 《TCP/IP网络编程》--基于TCP实现字符串对话和文件传输

    1 基于TCP实现字符串对话 主要需求 服务器端和客户端各传递 1 次字符串 基于 TCP 协议 传递字符串前先以 4 字节整数型方式传递字符串长度 剩余部分为字符串数据 注 下面的代码基于 Windows 系统实现 1 1 服务器端 gc
  • Java中实现ftp下载文件至本地(详细)

    Java中实现ftp下载文件至本地 详细 欢迎关注蚕豆公众号 不定时分享技术 同时欢迎加入蚕豆技术群哦 扫描公众号点击关于作者加群 2020 09 13 今天记录一下java中实现ftp下载文件至本地的功能模块 同此与大家交流分享有什么不对
  • js每日定时请求接口

    需求是每日十点请求一次接口 初始方法是写一个一分钟的轮询 定时查询系统时间 如果时间为10点就执行请求函数 但是考虑这样太浪费资源 在师傅的帮助下找到了一个更优的方法 计算当前时间和目标时间的时间间隔 如果超过 则设置定时查询的时间间隔为距
  • 线段树合并例题

    https www luogu com cn problem P3224 1 永无乡 题意 给 n 个岛屿 每个岛有一个标号 初始修有 m 条路 有两个操作 操作1 为 给两个岛屿之间修路 操作2为求出 所有能从当前岛屿到达的岛 中标号第k

随机推荐

  • shell脚本之if多分支和case分支语句

    文章目录 一 多分支if语句 二 case分支语句 三 实操 3 1 系统控制服务脚本 控制服务的启动 重启 停止 3 2 根据学生的成绩 判断优秀 良好 和不及格几个等级 3 3 删除家目录 3 4 剪刀石头布 电脑与人 3 5 case
  • 软件测试从业人员学历和专业分布情况

    随着 十四五 规划对科技创新提出了更迫切的要求 国内人工智能 AI 物联网 大数据 云计算等IT产业得到了迅速发展 可是现阶段 我国软件测试基础人才不足 已成为制约我国软件产业发展的瓶颈 据国家权威部门统计 中国软件测试人才缺口近40万 并
  • 华为手机连电脑_华为手机也能连苹果电脑!文件互传超方便~

    每个人手机里 都存了许多回忆 有人会珍藏很多难忘的影像 有人会保存甜蜜或珍贵的聊天记录 也有人小心翼翼地保管着自己的通讯录 俗话说 未雨绸缪才能有备无患 为防止手机里的数据丢失 做好备份实在是太有必要了 今天花部长就来给大家讲一讲 华为 荣
  • jsp自定义tag标签

    首先定义use tag 存放目录在 WEB INF tags use tag div p This is a test p br div
  • JAVA中方法的值传递

    首先了解在程序设计语言中 有关将参数传递给方法的一些专业术语 按值调用 call by value 表示方法接收的是调用者提供的值 而按引用调用 call by reference 表示方法接收的是调用者提供的变量地址 一个方法可以修改传递
  • 【uniapp】五、通用插件封装与运行平台判断(续集)

    一 uniapp项目目录 uniapp给我们的项目框架介绍 有一些文件夹是没有在模板中内置的 因此我们需要自己手动创建以下 例如最外层的components 用来放置我们的一些全局通用组件 components 符合vue组件规范的uni
  • Mybatis 查询出来的数据集合数量正确,但是具体数据为null

    目录 回顾场景 问题分析 解决方案 把对应的实体类字段名与数据库的保持一致 然后查询 回顾场景 确认sql语句没有问题 可以在数据库查询出来 3条数据 但是通过代码查询出来List集合 看到数量是对的 但是里面的数据全部为空null 问题分
  • 服务大厅支撑系统 服务器,GB∕T 36639-2018 信息安全技术 可信计算规范 服务器可信支撑平台(高清版).pdf...

    2018年新发布国家标准 即将实施 及早知悉 把握先机 ICS35 040 L80 中华人 民共和 国国家标准 GBT36639 2018 信息安全技术 可信计算规范 服务器可信支撑平台 Informationsecurittechnolo
  • 模拟电路设计(11)--- 运算放大器实际使用注意事项

    判断是否负反馈状态 我们先来说下什么是负反馈 凡是将放大电路输出量 电压或电流 直流或交流 的一部分或全部 通过一定的电路 称为反馈电路 以一定的方式 串联或并联 反送到放大电路的输入电路 减小净输入量 从而使输出量比无反馈时也随之减小的反
  • 灾难恢复! 关于做过快照的AVHD文件合并成VHD .

    http bbs 51cto com thread 964919 1 html 应用实例 某公司新装一台虚拟化服务器 采用W2008R2 用三个硬盘 其中一个固态硬盘用来做父系统 2个SAS硬盘做RAID1 存储VHD 某管理员3个月前安装
  • 防火墙双机热备

    目录 防火墙双机热备概述 VRRP VRRP术语 VRRP和Cisco的HSRP的区别 VRRP的状态机 VRRP的工作原理 双机热备的备份方式自动备份 该莫试下 和双机热备有关的配置命令只能在主用设备上配置 主用设备自动将状态信息同步到备
  • Elasticsearch5.5-IK分词器安装

    0 下载对应的版本IK https github com medcl elasticsearch analysis ik releases 1 在elasticsearch的plugins文件夹下新建ik目录 2 讲下载下来的ik分词器解压
  • python 解决约瑟夫环问题

    题目1 计算约瑟夫环问题 tips 幸运的基督徒 有15个基督徒和15个非基督徒在海上遇险 为了能让一部分人活下来不得不将其中15个人扔到海里面去 有个人想了个办法就是大家围成一个圈 由某个人开始从1报数 报到9的人就扔到海里面 他后面的人
  • (div+css特效代码) 导航菜单栏

    截图效果 Jsp代码
  • System用法详细解析

    System类代表系统 系统级的很多属性和控制方法都放置在该类的内部 该类位于java lang包 由于该类的构造方法是private的 所以无法创建该类的对象 也就是无法实例化该类 其内部的成员变量和成员方法都是static的 标准输入输
  • OpenStack实例控制台报错

    OpenStack实例控制台报错1006 环境说明 操作系统信息 CentOS Linux release 7 9 2009 Core Linux node2 yun com 5 4 226 1 el7 elrepo x86 64 Open
  • Mysql数据库第十三课-----------sql语句的拔高3--------直冲云霄

    作者前言 作者介绍 作者id 老秦包你会 简单介绍 喜欢学习C语言和python等编程语言 是一位爱分享的博主 有兴趣的小可爱可以来互讨 个人主页 小小页面 gitee页面 秦大大 一个爱分享的小博主 欢迎小可爱们前来借鉴 sql语句的拔高
  • linux常用性能观测工具---硬件相关

    rdmsr 在Linux内核源码中提供了读写CPU MSR寄存器模块 使可以在用户空间直接读写MSR寄存器 开源社区提供msr寄存器读写工具msrtools 其中有两个命令 rdmsr wrmsr 要使rdmsr wrmsr命令真正可以读写
  • 红帽linux系统安装指导

    第1步 在虚拟机管理界面中单击 开启此虚拟机 按钮后数秒就看到RHEL 7系统安装界面 如图1 26所示 在界面中 Test this media install Red Hat Enterprise Linux 7 0和Troublesh
  • 第九届蓝桥杯单片机省赛题彩灯

    参考佬中佬 但不搬运 http t csdn cn 4tnjz include