蓝桥杯第十届单片机总结

2024-03-12 22:58

本文主要是介绍蓝桥杯第十届单片机总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://blog.csdn.net/qq_37429313/article/details/86929724

这是一篇介绍蓝桥杯板子方波N555模块的博客

我自己的理解是将定时器0设置为计数模式,定时器1设置为计时模式来定1S的时间,然后定时器0记录的次数就是频率。

怎么设置呢只需要将TMOD设置为TMOD=0x04即可

寄存器TMOD高四位是设置定时器1工作方式,低四位是设置定时器0工作方式

C/T位是设置C/T==0是计时模式,C/T==1是计数模式,所以TMOD=0x04;

之后是设置TH0和TL0位,此时可以设置为 TH0=TL0=0X00;也可以设置为 TH0=TL0=0XFF;

设置为TH0=TL0=0x00;就是用这两个记录次数。最后计算 num=(TH0<<8)+TL0;num就是1S内的次数

设置为TH0=TL0=0XFF;是用中断的方式计数,自己写中断函数,在中断函数里自己设置变量来计数。

工作时需要将P34和SIGNAL用调键帽连接在一起,这样P34才会有脉冲。

TH0=TL0=0x00;主要代码如下:

  1. void Timer0Init(void)       
  2. {
  3.     AUXR |= 0x80;       
  4.     TMOD = 0x04;    //方式1 16位模式; 
  5.     TL0 = 0x00;        //设置定时初值
  6.     TH0 = 0x00;        //设置定时初值
  7.     TF0 = 0;        //清除TF0标志 
  8.     TR0 = 1;        //定时器0开始计时  
  9. }
  10. void Timer1Init(void)        //5毫秒@11.0592MHz
  11. {
  12.     AUXR |= 0x40;        //定时器时钟1T模式
  13.     TMOD &= 0x0F;        //设置定时器模式
  14.     TL1 = 0x00;        //设置定时初值
  15.     TH1 = 0x28;        //设置定时初值
  16.     TF1 = 0;        //清除TF1标志
  17.     TR1 = 1;        //定时器1开始计时
  18.     EA=1;
  19.     ET1=1;
  20. }
  21. void main()
  22. {
  23.      while(1)
  24.      {
  25.        if(T_flag)    //频率采集
  26.      { 
  27.           T_flag=0;
  28.           num=(TH0<<8)+TL0;
  29.           TL0=0x00;
  30.           TH0=0x00;
  31.           TF0=0;
  32.           TR0=1;
  33.        }
  34.     } 
  35. }
  36. void  time1() interrupt 3
  37. {
  38.     static  uint T_cont=0;
  39.     T_cont++;
  40.     if(T_cont==200)
  41.     {     T_cont=0;
  42.          TF0 = 0;        
  43.          TR0 = 0;
  44.          T_flag=1;
  45.     }
  46. }

 TH0=TL0=0xff;主要代码如下:

  1. void Timer0() interrupt 1
  2. {
  3.     sqre_count++;  //计数
  4. }
  5. while(1)
  6.     {
  7.         if(count_flag)
  8.         {
  9.             count_flag = 0;
  10.             sqre = sqre_count;   //sqre就是频率
  11.             sqre_count = 0;
  12.             TR0 = 1;
  13.             TR1 = 1;
  14.         }
  15. }

 上面那么多介绍的都N555下面介绍第十届的编程试题这里只放了框图,试题的话大家都能找到;

 

 

我感觉这一届的试题比第九届的简单多了,按键部分也都是简单的逻辑但是因为没看方波所以直接就丢掉了一半的分数。具体实现的思路每个人都不一样,我就直接贴代码了;

主函数

#include<stc15F2K60S2.h>
#include<intrins.h>
#include<iic.h>
#define uchar unsigned char
#define uint  unsigned int
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc1,0x8e};
uchar yi,er,san,si,wu,liu,qi,ba;
bit T_flag,set_flag,a_flag,L_flag,M_flag;
//T_flag 1S时间的标记 set_flag 电压和频率
//a_flag 电压固定 L_flag灯开关,M_flag数码管开关
uchar AD(uchar add);
void display31(uchar dat1,uchar dat2);
void keyscan();
void allinit();
void keyscan();
void delayms(uint ms);
void display1(uchar dat1,uchar dat2);
void display2(uchar dat1,uchar dat2);
void display3(uchar dat1,uchar dat2);
void display4(uchar dat1,uchar dat2);void Timer0Init(void)		//1毫秒@11.0592MHz
{AUXR |= 0x80;		//定时器时钟1T模式TMOD = 0x05;		TL0 = 0x00;		//设置定时初值TH0 = 0x00;		//设置定时初值TF0 = 0;		//清除TF0标志 TR0 = 1;		//定时器0开始计时  
}
void Timer1Init(void)		//5毫秒@11.0592MHz
{AUXR |= 0x40;		//定时器时钟1T模式TMOD &= 0x0F;		//设置定时器模式TL1 = 0x00;		//设置定时初值TH1 = 0x28;		//设置定时初值TF1 = 0;		//清除TF1标志TR1 = 1;		//定时器1开始计时EA=1;ET1=1;
}void main()
{ uint num,ad;allinit();Timer0Init();Timer1Init();while(1){  ad=AD(0x03)*1.961; //ad采集 255扩大到500keyscan();    //按键扫描if(T_flag)    //频率采集{ T_flag=0;num=(TH0<<8)+TL0;TL0=0x00;TH0=0x00;TF0=0;TR0=1;}/*****电压*******************/if(set_flag==0){yi=12;er=11;san=11;si=11;wu=11;liu=ad/100;qi=ad/10%10;ba=ad%10;if(a_flag==0)  //DAC固定2V{yi=12;er=11;san=11;si=11;wu=11;liu=2;qi=0;ba=0;}if(L_flag==0)  //灯亮{if((ad<150) || (ad>=250 && ad<350)) { if(a_flag==0)//固定{P2=0x80;P0=0xfe;}else if(a_flag==1){P2=0x80;P0=0xee;}}else { if(a_flag==0)//固定{P2=0x80;P0=0xfe;}else{P2=0x80;P0=0xea;}}}else{P2=0x80;P0=0xff;}}/*******频率**********************/else {yi=13;er=11;san=11;si=num/10000;wu=num/1000%10;liu=num/100%10;qi=num/10%10;ba=num%10;if(si==0) {si=11;if(wu==0){wu=11;if(liu==0)  //数码管{liu=11;}}}if(L_flag==0)  {if((num<1000)||(num>=5000&&num<10000)){P2=0x80;P0=0xfd;}else{P2=0x80;P0=0xf5;}} else{P2=0x80;P0=0xff;}				}if(M_flag)//关闭所有数码管{yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;}display1(yi,er);display2(san,si);if(set_flag==0&& M_flag==0) display3(wu,liu);  //带小数点的else if(set_flag==1)display31(wu,liu); //不带小数点的display4(qi,ba);}
}
/****按键****************/
void keyscan()
{if(P33==0){delayms(10);if(P33==0){set_flag = ~set_flag;}while(!P33);}if(P32==0){delayms(10);if(P32==0){a_flag = ~a_flag;}while(!P32);}if(P31==0){delayms(10);if(P31==0){L_flag = ~L_flag;}while(!P31);}if(P30==0){delayms(10);if(P30==0){M_flag = ~M_flag;}while(!P30);}
}
//计时
void  time1() interrupt 3
{static  uint T_cont=0;T_cont++;if(T_cont==200){	 T_cont=0;TF0 = 0;		TR0 = 0;T_flag=1;}
}
/***********AD***************/
uchar AD(uchar add)
{uchar temp;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Stop();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();temp=IIC_RecByte();IIC_Stop();return temp;
}
/******初始化*********************/
void allinit()
{P2=0xa0;P0=0x00;P2=0x80;P0=0xff;P2=0xc0;P0=0xff;P2=0xff;P0=0xff;
}void display1(uchar dat1,uchar dat2)
{P2=0xc0;P0=0x01;P2=0xff;P0=tab[dat1];delayms(1);P2=0xc0;P0=0x02;P2=0xff;P0=tab[dat2];delayms(1);
}
void display2(uchar dat1,uchar dat2)
{P2=0xc0;P0=0x04;P2=0xff;P0=tab[dat1];delayms(1);P2=0xc0;P0=0x08;P2=0xff;P0=tab[dat2];delayms(1);
}
void display3(uchar dat1,uchar dat2)
{P2=0xc0;P0=0x10;P2=0xff;P0=tab[dat1];delayms(1);P2=0xc0;P0=0x20;P2=0xff;P0=tab[dat2]&0x7f;delayms(1);
}
void display31(uchar dat1,uchar dat2)
{P2=0xc0;P0=0x10;P2=0xff;P0=tab[dat1];delayms(1);P2=0xc0;P0=0x20;P2=0xff;P0=tab[dat2];delayms(1);
}
void display4(uchar dat1,uchar dat2)
{P2=0xc0;P0=0x40;P2=0xff;P0=tab[dat1];delayms(1);P2=0xc0;P0=0x80;P2=0xff;P0=tab[dat2];delayms(1);P2=0xc0;P0=0xff;P2=0xff;P0=0xff;
}
void delayms(uint ms)
{uint i,j;for(i=0;i<ms;i++)for(j=0;j<855;j++);
}

IIC 驱动:

/*程序说明: IIC总线驱动程序软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台 8051,12MHz日    期: 2011-8-9
*/#include<stc15F2K60S2.h>
#include "intrins.h"#define DELAY_TIME 20#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;    
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

自己给自己的话,这次比赛虽然不是什么大比赛,但也学会了很多,从过完年回来开始准备,2个星期把之前的省赛题做完,后边感觉自己会的挺多的了,后边就没看省赛之前没出过的模块,当时还做了官网模拟题就是把N555模块跳了过去。 今天之后这个比赛就算过去了,以后不管做什么事情都要要求自己做好最充分的准备,万万不可骄傲。

 

 

这篇关于蓝桥杯第十届单片机总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/802860

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern