蓝桥杯单片机 第十届 测频代码

  • main.c
  • iic.c
  • iic.h

main.c

#include<STC15F2K60S2.H>
#include<iic.h>
#define keypress P3
#define u8 unsigned char
#define u16 unsigned int
u16 volt;
u16 voltled;
sbit buzzer = P0^6;
bit flag500ms, flag1s, key_flag;
u8   smg_count, key_count, smg_i, table1[8], table2[8];
bit  smg_translator=0;//按下S4数码管界面转换的诶,我们假装第一个界面是频率显示界面
bit DAC_flag=1, LED_flag=1, smg_dispaly=1;//按下S5DAC变化
u16 pulse,count_500;
u8 code d_display[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x71 ,0x3e};
u8 code w_display[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void led_light();
void volt_smg();
void dac();
void display()
{P2 = 0xE0; if(smg_translator){P0 =  ~table1[smg_i];}else{P0 =  ~table2[smg_i];//dianya}P2=0x00;//~table1[smg_i];P2 = 0xC0; P0 = w_display[smg_i];P2=0x00;smg_i++;if(smg_i == 8) smg_i = 0;
}
void dispear()
{P2 = 0xE0; P0 =  ~0x00; P2=0x00;//~table1[smg_i];P2 = 0xC0; P0 = w_display[smg_i];P2=0x00;smg_i++;if(smg_i == 8) smg_i = 0;
}void allint()
{P0=0XFF;P2=0X80;P2=0X1F;P0=0X00;P2=0XA0;P2=0X1F;}typedef unsigned char BYTE;
typedef unsigned int WORD;//-----------------------------------------------WORD count;                         //1000 times countervoid tm1_isr() interrupt 3 using 1
{if (count-- == 0)               //1ms * 1000 -> 1s{count = 500; flag1s = 1;         //reset counter}if (count_500-- == 0)               //1ms * 1000 -> 1s{flag500ms = 1;count_500 = 250;               //reset counter}if (key_count-- == 0)               //1ms * 1000 -> 1s{key_count = 4;               //reset counterkey_flag = 1;}if(smg_dispaly){display();}else{dispear();  //按键s7}}//-----------------------------------------------void Timer0Init(void)       //@11.0592MHz
{AUXR |= 0x80;     //定时器时钟1T模式TMOD &= 0x04;       //设置定时器模式TL0 = 0x00;       //设置定时初值TH0 = 0x00;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时
}void Timer1Init(void)      //2毫秒@11.0592MHz
{AUXR |= 0x40;     //定时器时钟1T模式TMOD = 0x04;        //设置定时器模式TL1 = 0x9A;       //设置定时初值TH1 = 0xA9;        //设置定时初值TF1 = 0;       //清除TF1标志TR1 = 1;      //定时器1开始计时ET1=1;
}u8 trg,cont;
void keyread()
{u8  readdat = keypress^0xff;trg = readdat&(readdat^cont);cont = readdat;
}void main()
{Timer1Init();count = 0;                     Timer0Init();EA = 0;PCF_ADC_w(0x03);
//    volt = PCF_adc(0x03)*100/51;//保留两位小数害,要一直读取才行,所以放在while循环中EA = 1;   allint(); while (1){if(key_flag){  key_flag = 0;keyread();switch(trg){case 0x08: smg_translator = ~smg_translator; break;case 0x04: DAC_flag = ~DAC_flag; break;case 0x02: LED_flag = ~LED_flag;   break;case 0x01: smg_dispaly = ~smg_dispaly;  break;}dac();//V display}led_light();//按键s6if(flag500ms){flag500ms = 0;TR0 = 0;                //计数器关闭pulse = TH0*256 + TL0; //脉冲数pulse = pulse*2; //1s内的脉冲数TH0 = 0; TL0 = 0;TR0 = 1;}if(flag1s){flag1s = 0;table1[0] = d_display[10];table1[1]   = 0x00;if( pulse>99999 )    table1[2] = d_display[pulse/100000];else   table1[2] = 0x00;      if( pulse>9999 )     table1[3] = d_display[pulse/10000%10];else     table1[3] = 0x00;table1[4] = d_display[pulse/1000%10];table1[5] = d_display[pulse/100%10];table1[6] = d_display[pulse/10%10];table1[7] = d_display[pulse%10];pulse = 0;volt_smg();}}
}
void led_light()
{if(LED_flag){P2 = 0x80;P0 = ~0x00;P2 = 0x00;}else{P2 = 0x80;if(smg_translator){P0 = ~0x02;}else{P0 = ~0x01;}if(voltled > 350 ||  (voltled>=150 && voltled<=250)){P0 &= ~0x04; }if(pulse>10000 || (pulse >=1000 && pulse <=5000)){P0 &= ~0x08;}if(DAC_flag)   P0 &= ~0x20;else  P0 &= 0xcf;P2=0X00;}
}
15单片机工作方式0x00自动装载,也就是中断里面无论是否设置初值,都是一样的。
这里比较疑惑的一点是我设置的初值溢出后是1ms,所以按照计算500ms内的脉冲数却是
初值溢出值为2ms脉冲数的两倍。
void volt_smg()
{table2[0] = d_display[11];table2[1] = 0x00;table2[2] = 0x00;table2[3] = 0x00;table2[4] = 0x00;table2[5] = d_display[volt/100%10]|0x80;table2[6] = d_display[volt/10%10];table2[7] = d_display[volt%10];
}
void dac()
{//  P2 = 0x80;if(DAC_flag){volt = 200;//          P0 &= ~0x20;    //da kai L5EA = 0;voltled = PCF_adc(0x03);//保留两位小数voltled = voltled/255.0f*500;EA = 1; }else{EA = 0;volt = PCF_adc(0x03)/255.0f*500;//保留两位小数
//          volt = volt/255.0*500;EA = 1; //关闭l5,其他位置0不变,L5=0voltled = volt;}
//  P2 = 0x00;
}

iic.c

/*程序说明: IIC总线驱动程序软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台 8051,12MHz日    期: 2011-8-9
*/#include "reg52.h"
#include "intrins.h"
#define u8 unsigned char#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)   //我知道了,憨憨,这得先写再读,PCF85芯片才知道你干了啥!
{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;
}void PCF_ADC_w(u8 add)
{IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Stop();
}unsigned int PCF_adc(u8 add)
{u8 temp;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();temp = IIC_RecByte();
//  IIC_WaitAck();
//  IIC_SendAck(0);IIC_Stop();return temp;
}void writePCF( u8 add)
{IIC_Start();IIC_SendByte(0x90);//writewhile(!IIC_WaitAck());IIC_SendByte(add);while(!IIC_WaitAck());IIC_Stop();}u8 readPCF( u8 add)   //通道1光敏电阻,通道3电压信号
{u8 temp;IIC_Start();IIC_SendByte(0x90);//writewhile(!IIC_WaitAck());IIC_SendByte(add);while(!IIC_WaitAck());IIC_Start();IIC_SendByte(0x91);//readwhile(!IIC_WaitAck());temp=IIC_RecByte();while(!IIC_WaitAck());IIC_Stop();return temp;
}

iic.h

#ifndef _IIC_H
#define _IIC_H
#define u8 unsigned charvoid 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);
unsigned int PCF_adc(u8 add);
void PCF_ADC_w(u8 add);
u8 readPCF( u8 add) ;
void writePCF( u8 add);
#endif

蓝桥杯单片机 第十届 测频代码相关推荐

  1. 蓝桥杯单片机第十届国赛练习

    单片机型号:IAP15F2K60S2. 蓝桥杯第十届国赛有串口,本文着手进行一番练习, 文末会附上整个工程下载地址. 这一届赛题的练习对我来说还是有些难度 我看题后做了以下几个设计方面的点总结列举: ...

  2. 蓝桥杯单片机第十届国赛

    今天是第十三届蓝桥杯单片机国赛的比赛时间,刚比完,简单说一下感想,这次国赛必须要用到三个定时器,昨天刚看了定时器2的使用,不太熟练,所以写的也不是很好,超声波和频率有点冲突,就个人而言,我觉得这一届最 ...

  3. 蓝桥杯单片机第十届省赛题程序实现

    文章目录 main.c iic.c main.c #include<reg52.h> #include<intrins.h> #include<iic.h>sbit ...

  4. 蓝桥杯单片机第十届省赛

    如果有用请点赞,还会继续更新的 题目: 好久没有更新了,今天又写了一个第十届的,感觉这次就是555的频率计数时那个定时器的使用有点小注意事项,要用定时器0来计数,定时器1来计时,同时定时器1要计数55 ...

  5. 蓝桥杯单片机第十届省赛程序题

    这套题总体来说还是比较简单的,我今天用了一个半小时就写出来了,但是还是用点问题,就是当S7按键的功能还有点没有实现,希望各位大佬帮帮忙,指教指教! #include"reg52.h" ...

  6. 蓝桥杯单片机——第十二届蓝桥杯单片机第一场省赛

    蓝桥杯单片机--第十二届蓝桥杯单片机第一场省赛 目录 蓝桥杯单片机--第十二届蓝桥杯单片机第一场省赛 一.赛题分析 二.问题总结 三.代码 一.赛题分析 前两天实验室的学妹把开发板还给我了,刚好今天没 ...

  7. 蓝桥杯单片机第七届省赛-模拟风扇控制系统

    九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第七届省赛-模拟风扇控制系统 Notes1:按键按下后在某些情况下给一定的缓冲时间 Notes2 ...

  8. 蓝桥杯嵌入式第十届省赛真题

    蓝桥杯嵌入式第十届省赛真题 文章目录 蓝桥杯嵌入式第十届省赛真题 1.题目分析 2.项目结构 2.1数组思路 2.2Key_Flag控制对应逻辑 2.3KEY控制操作 1.题目分析 总的来说这题考点特 ...

  9. 蓝桥杯单片机第十三届第二场

    第十三届蓝桥杯单片机第二场 文章目录 第十三届蓝桥杯单片机第二场 前言 一.赛题分析 二.程序调试步骤 三.部分源程序 主函数部分 DAC处理函数 数码管处理函数 ADC处理函数 超声波处理函数 LE ...

  10. 蓝桥杯单片机DS1302时钟芯片驱动代码注释

    蓝桥杯单片机DS1302时钟芯片驱动代码之前的疑惑注释了下 /* DS1302 芯片包含一个 实时时钟/日历和 31 字节的静态 RAM. 与时钟/RAM 通讯只需要三根线: CE,I/O (数据线) ...

最新文章

  1. 字节跳动招聘2年工作经验:30-60k!什么岗位这么香?
  2. Linux学习总结(四十七)NFS服务配置 上篇
  3. Kata Container — Overview
  4. JavaScript流程控制之分支结构
  5. while用法_语法宝典:连词while的四种用法,你都学会了吗?
  6. 【MATLAB】 csvwrite数据缺失怎么办
  7. 有类和无类路由下的路由匹配原则
  8. anaconda安装tensorflow后,matplotlib无法调用的解决方法
  9. 表达式类型( 一个表达式和一棵二叉树之间,存在着自然的对应关系。写一个程序,实现 基于二叉树表示的算术表达式Expression的操作)
  10. kubernetes之CI/CD工具jenkins第二篇,helm的使用
  11. 【LeetCode】剑指 Offer 22. 链表中倒数第k个节点
  12. 35、html制作QQ彩贝热销时装页面(注意:需要素材)
  13. 最小二乘法曲线拟合(c++实现)
  14. python视频补帧_视频补帧软件(DAIN APP)
  15. 2500个常用汉字(用来练普通话的)
  16. 业务流程管理工具的概览和比较分析
  17. 【2019-游记】中山纪念中学暑期游Day5
  18. tcl脚本学习-基础语法
  19. Java岗大厂面试百日冲刺【Day49】— 十个面试九个秒杀1 (日积月累,每日三题)
  20. eosjs 文档(浏览器)

热门文章

  1. 无法打开计算机桌面图标,桌面图标打不开如何修复?桌面图标无法打开的处理方法...
  2. illustrator插件-常用功能开发-直角圆角化-js脚本开发-AI插件
  3. audioread函数未定义_为什么运行时提示未定义函数或变量 'wavread'。
  4. Java 学习笔记:第十一章 多线程技术
  5. 工行电子银行收费标准
  6. 系统的稳定性判定matlab,matlab分析系统稳定性的方法.doc
  7. 服务器解压文件出错,四大方法解决解压文件出错问题|解压文件出错
  8. win10输入法转win7模式
  9. python寻找完全平方数_279 完全平方数(bfs)
  10. 龙蜥开发者说:我眼里的龙蜥社区:一个包容的大家庭 | 第 10 期