永州做网站的公司,设置wordpress网页私有,网页制作模板如何制作,微信小程序个人网站开发蓝桥杯单片机组备赛指南请查看 #xff1a;本专栏第1篇文章
本文章针对蓝桥杯-单片机组比赛开发板所写#xff0c;代码可直接在比赛开发板上使用。
型号#xff1a;国信天长4T开发板#xff08;绿板#xff09;#xff0c;芯片#xff1a;IAP15F2K61S2
#xff08;使…蓝桥杯单片机组备赛指南请查看 本专栏第1篇文章
本文章针对蓝桥杯-单片机组比赛开发板所写代码可直接在比赛开发板上使用。
型号国信天长4T开发板绿板芯片IAP15F2K61S2
使用国信天长蓝板也可以完美兼容与绿板几乎无差别 1. 代码目的 通过对LM555芯片的正确应用将其产生的频率数值显示在数码管上并可以通过RB3对频率进行调节。数码管不用的位全部熄灭并在0位显示F指示频率。显示格式
F6000未用到的熄灭有效数据6000Hz
2. LM555芯片简介 对LM555芯片可以实现的操作有很多但是比赛开发板上很少。以下文字内容瞟一眼即可客观题基本不会遇到 引脚2TRIG- 触发当此引脚的电压降至1/3 VCC时定时器被触发开始计时。 引脚3OUT- 输出输出引脚输出电压可以从0V到接近VCC变化。 引脚4RESET- 重置此引脚用于重置定时器。当这个引脚接收到低于0.7V的电压时定时器的输出会立即变低无论计时周期是否完成。 引脚5CTRL- 控制电压控制电压引脚可以用来改变定时器的触发和阈值电平。通常通过一个电位器连接到VCC和GND 引脚6THR- 阈值 当此引脚的电压升至2/3 VCC时定时周期结束输出引脚变低。在振荡器模式下这个引脚和放电引脚一起控制振荡频率。 引脚7DISCH- 放电 这个引脚连接到一个内部晶体管的集电极该晶体管可以提供放电路径到GND。在振荡器应用中它被用来放电计时电容。
3. 开发板原理图 我们打开官方的开发板原理图找到LM555器件 编程时用跳线帽连接J3的15和16引脚理由如下 我们只需略微观察该芯片所有的引脚都被固定了既没有与锁存器连接也没有与引脚的连接。因此该芯片在开发板上是一个彻底的硬件电路没有可编程部分。 对于NET_SIG端口与芯片的Qoutput输出端相连我们打开原理图文件按下CTRLF进行搜索该名称发现还有另一个器件有该标注 在该端口的下方标注为单片机的P34引脚因此我们可以将输出的频率数值传入到P34引脚再通过P34的T0计数器进行读取。因此我们需要用额外的跳线帽连接J3的14和15号引脚。 4. 频率计数原理
编程时我们采用T0工作在计数模式计数从P34引脚输入的脉冲个数 在采用T1工作在定时模式定时1秒的时长 在1秒内T0计数的个数就是LM产生的脉冲频率个数 当我们在比赛时不知道P34这个引脚是对应的T0还是T1时可以直接查看原理图从而确定哪一个定时计数器是用来进行计数的 5. 代码参考
#include reg52.h
#include intrins.hsfr AUXR 0x8e;unsigned char code duanma [18]{ 0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 0x80 , 0x90 , 0x88 , 0x80 , 0xc6 , 0xc0 , 0x86 , 0x8e ,0xbf , 0x7f };void select_HC573 ( unsigned char channal )
{switch ( channal ){case 4:P2 ( P2 0x1f ) | 0x80;break;case 5:P2 ( P2 0x1f ) | 0xa0;break;case 6:P2 ( P2 0x1f ) | 0xc0;break;case 7:P2 ( P2 0x1f ) | 0xe0;break;}
}void state_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{select_HC573 ( 7 );P0 0xff;select_HC573 ( 6 );P0 0x01 pos_SMG;select_HC573 ( 7 );P0 value_SMG;
}void state_SMG_all ( unsigned char value_SMG )
{select_HC573 ( 6 );P0 0xff;select_HC573 ( 7 );P0 value_SMG;
} void init_sys ()
{select_HC573 ( 4 );P0 0xff;select_HC573 ( 5 );P0 0x00;
}void Delay1ms() //11.0592MHz
{unsigned char i, j;_nop_();_nop_();_nop_();i 11;j 190;do{while (--j);} while (--i);
}void init_timer(void) //50毫秒11.0592MHz
{AUXR 0xBF; //定时器时钟12T模式TMOD 0x00; //设置定时器模式TMOD | 0x16; //设置定时器模式TL1 0x00; //设置定时初始值TH1 0x4C; //设置定时初始值TH0 0xff;TL0 0xff;TF1 0; //清除TF1标志TF0 0;TR1 1; //定时器1开始计时TR0 1;EA 1;ET1 1;ET0 1;
}unsigned int count_timer0 0;
void timer0_service () interrupt 1
{count_timer0;
}unsigned int count_fre 0;
unsigned char count_50ms 0;
void timer1_service () interrupt 3
{count_50ms;TL1 0x00; //设置定时初始值TH1 0x4C; //设置定时初始值if ( count_50ms 20 ){count_50ms 0;count_fre count_timer0;count_timer0 0;}
}void SMGrunning ()
{state_SMG ( 0 , duanma[15] );Delay1ms();if ( count_fre 999999 ){state_SMG ( 1 , duanma[count_fre/1000000%10] );Delay1ms();}if ( count_fre 99999 ){state_SMG ( 2 , duanma[count_fre/100000%10] );Delay1ms();}if ( count_fre 9999 ){state_SMG ( 3 , duanma[count_fre/10000%10] );Delay1ms();}if ( count_fre 999 ){state_SMG ( 4 , duanma[count_fre/1000%10] );Delay1ms();}if ( count_fre 99 ){state_SMG ( 5 , duanma[count_fre/100%10] );Delay1ms();}state_SMG ( 6 , duanma[count_fre/10%10] );Delay1ms();state_SMG ( 7 , duanma[count_fre%10] );Delay1ms();state_SMG_all ( 0xff );
}void main ()
{init_sys ();init_timer ();while ( 1 ){SMGrunning ();}
}