找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3035|回复: 0
打印 上一主题 下一主题
收起左侧

蓝桥杯第十届单片机频率测量与电压控制-独家例程

[复制链接]
跳转到指定楼层
楼主

#include<STC15F2K60S2.H>
#include "iic.h"
typedef unsigned int u16;
typedef unsigned char u8;

sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;

u8 code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
u8 code smgduan_Vout[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x8e,0xc1,0xff};// F U  ff  .

u8 change=0;//切换电压与频率
u16 F_Hz=0;//频率值
u16 Vout=0,Vout_RB2=0;//Vout转换后的电压值, Vout_RB2滑动变阻器实际电压值
u16 count_f=0,count_t=0,count_tt=0;//count_f记录NE555在1s内的次数,count_t定时
bit LED_state=0,SMG_state=0,RB2_change=0;
void Key_Scan();
void Set_Display();
void Frequency_Display();
void Voltage_Display();
void Smg_Display(u8 wei,u8 duan);
void Smg_Vout_Display(u8 wei,u8 duan);
void Delay_ms(u16 ms);
void LED_Display();
void Timer0Init();
void Timer1Init();

void Init()//初始化
{
        P2 = (P2 & 0X1F)|0X80;//打开LED锁存
        P0=0XFF;                                                        //熄灭
        P2 = P2 & 0X1F;                                //恢复锁存,避免影响其他位锁存
        
        P2 = (P2 & 0X1f) | 0xa0;//打开蜂鸣器、继电器锁存
        P0 = 0x00;
        P2 = P2 & 0X1f;////恢复锁存,避免影响其他位
        
        P2 = (P2 & 0X1f) | 0xc0;//打开位选锁存
        P0 = 0x00;
        P2 = P2 & 0X1f;//恢复锁存,避免影响其他位
        
        P2 = (P2 & 0X1f) | 0xe0;//打开段选锁存
        P0 = 0xff;
        P2 = P2 & 0X1f;//恢复锁存,避免影响其他位
}
void main()
{
        Init();//初始化
  Timer0Init();
        Timer1Init();
        ADC_Init();
        while(1)
        {
                Key_Scan();
                Set_Display();
          LED_Display();
        
        }
}
void Key_Scan()//按键扫描
{
        if(S7==0)
        {
                Delay_ms(5);
                if(S7==0)
                {
                        SMG_state=~SMG_state;
                }while(!S7);
        }
//************************        
        if(S6==0)
        {
                Delay_ms(5);
                if(S6==0)
                {
                        LED_state=~LED_state;
                }while(!S6);
        }
//*************************
        if(S5==0)
        {
                Delay_ms(5);
                if(S5==0)
                {
                        RB2_change=~RB2_change;
//                if(RB2_change==1)
//                {
//                        DAC_Read(Vout_RB2);
//                }else{
//                        DAC_Read(102);
//                }
                }while(!S5);
        }
//***************************        
        if(S4==0)
        {
                Delay_ms(5);
                if(S4==0)
                {
                        change++;
                        if(change==2)change=0;
                }while(!S4);
        }
}
void Set_Display()//
{
                if(SMG_state==0)//打开数码管
                {
                                if(change==0)
                                {
                                                Voltage_Display();//电压显示               
                                }else if(change==1)
                                        {
                                                Frequency_Display();//频率显示                        
                                        }
                }
        
}
void Voltage_Display()//电压显示
{
        Smg_Vout_Display(0,11);
        Smg_Vout_Display(5,(Vout/100)%10);
        Smg_Display(6,(Vout/10)%10);
        Smg_Display(7,Vout%10);                    
}
void Frequency_Display()//频率显示
{
                        Smg_Vout_Display(0,10);
                        if(F_Hz>9999)
                        Smg_Display(3,F_Hz/10000);        
                        if(F_Hz>999)
                        Smg_Display(4,F_Hz%10000/1000);        
                        if(F_Hz>99)
                        Smg_Display(5,F_Hz%1000/100);        
                        if(F_Hz>9)
                        Smg_Display(6,F_Hz%100/10);                        
                        Smg_Display(7,F_Hz%10);        
}
void LED_Display()//LED显示功能
{
        if(LED_state==1)//关闭LED
                {
                                P2 = (P2 & 0X1F)|0X80;
                                P0 = 0xff;//1111 0111
                                P2 = P2 & 0X1F;
                }else//打开LED
                {                                       
                                        if(change==0)//电压LED
                                        {
                                                        P2 = (P2 & 0X1F)|0X80;
                                                        P0 = 0XFE;//1111 1110
                                                        P2 = P2 & 0X1F;        
                                        }else if(change==1)//频率LED
                                                {
                                                                P2 = (P2 & 0X1F)|0X80;
                                                                P0 = 0XFD;//
                                                                P2 = P2 & 0X1F;        
                                                }         
        //*************LED电压**********************************
                                         if(Vout<150 | (250<=Vout && Vout<350))//熄灭
                                         {
                                                        P2 = (P2 & 0X1F)|0X80;
                                                        P0 |=0X04;//1111 1111                 
                                                        P2 = P2 & 0X1F;
                                         }
                                        if(Vout>=350 | (150<=Vout && Vout<250))        //亮
                                        {
                                                        P2 = (P2 & 0X1F)|0X80;
                                                        P0 &= ~0X04;//0000 1011
                                                        P2 = P2 & 0X1F;
                                        }        
                                //*************LED频率**************************        
                                         if(F_Hz<1000 | (5000<=F_Hz && F_Hz<10000))//熄灭
                                         {
                                                        P2 = (P2 & 0X1F)|0X80;
                                                        P0 = P0 | 0X08;//0000 1000|        
                                                        P2 = P2 & 0X1F;
                                         }
                                        if(F_Hz>=10000 | (1000<=F_Hz && F_Hz<5000))        //亮
                                        {
                                                        P2 = (P2 & 0X1F)|0X80;
                                                  P0 &=0XF7;//1111 0111                                                      
                                                        P2 = P2 & 0X1F;
                                        }        
//******************************************************                                       
                                        if(RB2_change==0)//跟随,L5熄灭
                                                {
                                                        P2 = (P2 & 0X1F)|0X80;
                                                        P0 = P0 | 0X10;//0001 0000
                                                        P2 = P2 & 0X1F;
                                                }else//不跟随  L5亮
                                                {                                                
                                                        P2 = (P2 & 0X1F)|0X80;
                                                        P0 = P0 & 0XEF;//1110 1111
                                                        P2 = P2 & 0X1F;
                                                }
                        }        
        
}
void Timer0Init()//计数
{
        //  AUXR &= 0x7F;                //定时器时钟12T模式
           TMOD|=0x06;//8位重装载计数
           TL0=0xff;
           TH0=0xff;//1us
           ET0=1;
           TR0=1;
                 TF0 = 0;                //清除TF0标志
            EA=1;
}
void Timer1Init()//定时
{
                //        AUXR &= 0xBF;                //定时器时钟12T模式
                //        TMOD &= 0x0F;                //设置定时器模式
            TMOD|=0X10;
                        TL1=(65536-50000)%256;//给定时器赋初值,定时50ms
                        TH1=(65536-50000)/256;
                        TF1 = 0;                //清除TF1标志
                        TR1 = 1;                //定时器1开始计时
                        ET1 = 1;    //打开定时器1中断
            EA=1;
}

void Time0_Service() interrupt 1
{
        count_f++;//累计NE555输出信号个数
}
void Time1_Service() interrupt 3
{
       TH1=(65536-50000)/256;//50ms
        TL1=(65536-50000)%256;
        count_t++;
        count_tt++;
        if(count_t==20)//每1秒刷新一次频率数据
        {
                  ET0=0;//关闭定时器,从中取出数值后再打开
                        TR0=0;
                  TR1=0;        
               
                        F_Hz=count_f;//取值
                        TR0=1;
                  TR1=1;
                        ET0=1;               
                        count_f=0;
                        count_t=0;
        }
        if(count_tt==10)//0.5秒刷新一次电压采集
        {
               
            Vout_RB2=ADC_Read();        
       Vout=Vout_RB2*1.963125;               
                                count_tt=0;
        }
}

全部资料51hei下载地址:
第十届蓝桥杯单片机设计与开发项目省赛程序试题.pdf (251.64 KB, 下载次数: 20)
10、第十届频率测量与电压控制.zip (270.48 KB, 下载次数: 33)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表