蓝桥杯单片机学习过程记录(十八)第十届电压频率采集N555
作者:互联网
蓝桥杯单片机学习过程记录(十八)第十届电压频率采集N555
今天完成了第十届的省赛试题,有了新的模块N555,但其实没有用到什么新内容,通过对N555的计数定时来获取其高低频率,试题很明确,将P34 与 SIGNAL短接,什么意思呢,N555是一个频率产生器,频率是产生高低电平反应,那么通过P34反应高低电平的变化,还有一点要注意,为什么要连接P34呢,P34是定时器0进入中断的触发接口,即P34处于上升沿或下降沿时,即可触发定时器0的中断。那么通过对1s内上升沿的计数,即可求得频率,获得结果。
这里是后来参考网上的经验得来,自己做的时候,由于对接口的定义不熟悉,是通过定时1s内,计算1s内高低电平的比例来得到的结果,但是变化不是很规律,所以后来放弃了。
应用内容:
小灯、数码管
独立按键
定时器计数
IIC通信滑动电阻
主函数:
//第十届电压频率采集N555
#include<STC15F2K60S2.H>
#include<iic.h>
#include<intrins.h>
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
sbit led4=P0^3;
sbit led5=P0^4;
sbit pinlv_flag=P3^4;
unsigned char t,pinlv,pinlv_temp;
unsigned char flag_yemian,flag_dac,flag_seg,flag_led;
int dianya,dac_out=200;
unsigned char yi,er,san,si,wu,liu,qi,ba;
unsigned char seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0xff,0x8e,0xc1};
void allinit();
void display_12(yi,er);
void display_34(san,si);
void display_56(wu,liu);
void display_78(qi,ba);
void delayms(int ms);
void key_scan();
void the_led();
unsigned char iic_read();
void main(){
allinit();
TMOD=0x16;TH0=0xFF; TL0=0xFF; TH1=0x28; TL1=0x00; ET0=1; ET1=1; EA=1;
TR0=1; TR1=1;
yi=10;er=10;san=10;si=10;wu=10;liu=10;qi=10;ba=10;
while(1){
dianya=iic_read();
dianya=dianya*1.96;
//判断界面
if(flag_yemian==0){
yi=23;er=21;san=21;si=21;wu=21;liu=dac_out/100+10;qi=dac_out%100/10;ba=dac_out%10;
}
else if(flag_yemian==1){
if(pinlv<100){
yi=22;er=21;san=21;si=21;wu=pinlv%100/10;liu=pinlv%10;qi=0;ba=0;
}
else if(pinlv<10){
yi=22;er=21;san=21;si=21;wu=21;liu=pinlv%10;qi=0;ba=0;
}
else {
yi=22;er=21;san=21;si=pinlv/100;wu=pinlv%100/10;liu=pinlv%10;qi=0;ba=0;
}
}
key_scan();
//判断DAC
if(flag_dac==1)dac_out=dianya;
else dac_out=200;
//判断小灯
if(flag_led==0)the_led();
else if(flag_led==1){
P2=0X80;P0=0XFF;
}
//判断数码管
if(flag_seg==0){
display_12(yi,er);
display_34(san,si);
display_56(wu,liu);
display_78(qi,ba);
}
else if(flag_seg==1){
P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
}
}
}
按键及小灯
//按键功能控制
void key_scan(){
//s7灭数码管
if(s7==0){
delayms(1);
if(s7==0){
if(flag_seg==0)
flag_seg=1;
else
flag_seg=0;
}
while(!s7);
}
//s6灭灯
else if(s6==0){
delayms(1);
if(s6==0){
if(flag_led==0)
flag_led=1;
else if(flag_led==1)
flag_led=0;
}
while(!s6);
}
//s5转换dac输出
else if(s5==0){
delayms(1);
if(s5==0){
if(flag_dac==0)flag_dac=1;
else flag_dac=0;
}
while(!s5);
}
//s4转换显示界面
else if(s4==0){
delayms(1);
if(s4==0){
if(flag_yemian==0)
flag_yemian=1;
else
flag_yemian=0;
}
while(!s4);
}
}
//小灯闪烁控制
void the_led(){
P2=0X80;
if(flag_yemian==0){
led1=0;led2=1;
if(dac_out<150)led3=1;
else if(dac_out<250)led3=0;
else if(dac_out<350)led3=1;
else led3=0;
if(pinlv<10) led4=1;
else if(pinlv<50) led4=0;
else if(pinlv<100) led4=1;
else led4=0;
if(flag_dac==0)led5=0;
else led5=1;
}
else{
led1=1;led2=0;
if(dac_out<150)led3=1;
else if(dac_out<250)led3=0;
else if(dac_out<350)led3=1;
else led3=0;
if(pinlv<10) led4=1;
else if(pinlv<50) led4=0;
else if(pinlv<100) led4=1;
else led4=0;
if(flag_dac==0)led5=0;
else led5=1;
}
}
N555计数及初始化函数等
//计数
void time0(void) interrupt 1
{
pinlv_temp++;
}
//定时
void time1() interrupt 3
{
TH1=0x28; TL1=0x00;
t++;
if(t==20){
pinlv=pinlv_temp;
pinlv_temp=0;
t=0;
}
}
//获取电压
unsigned char iic_read(){
unsigned char temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03);
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=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
P2=0X80;P0=0XFF;
}
void display_12(yi,er){
P2=0XC0;P0=0X01;P2=0XE0;P0=seg[yi];delayms(1);
P2=0XC0;P0=0X02;P2=0XE0;P0=seg[er];delayms(1);
}
void display_34(san,si){
P2=0XC0;P0=0X04;P2=0XE0;P0=seg[san];delayms(1);
P2=0XC0;P0=0X08;P2=0XE0;P0=seg[si];delayms(1);
}
void display_56(wu,liu){
P2=0XC0;P0=0X10;P2=0XE0;P0=seg[wu];delayms(1);
P2=0XC0;P0=0X20;P2=0XE0;P0=seg[liu];delayms(1);
}
void display_78(qi,ba){
P2=0XC0;P0=0X40;P2=0XE0;P0=seg[qi];delayms(1);
P2=0XC0;P0=0X80;P2=0XE0;P0=seg[ba];delayms(1);
P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;delayms(1);
}
void delayms(int ms){
int q,w;
for(q=0;q<ms;q++)
for(w=0;w<845;w++);
}
小老弟哟
发布了39 篇原创文章 · 获赞 41 · 访问量 7212
私信
关注
标签:P2,seg,P0,N555,void,delayms,蓝桥,单片机,flag 来源: https://blog.csdn.net/weixin_44747240/article/details/104459921