找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3365|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

藍(lán)橋杯第十屆單片機(jī)頻率測量與電壓控制-獨(dú)家例程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主

#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轉(zhuǎn)換后的電壓值, Vout_RB2滑動變阻器實(shí)際電壓值
u16 count_f=0,count_t=0,count_tt=0;//count_f記錄NE555在1s內(nèi)的次數(shù),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;                                //恢復(fù)鎖存,避免影響其他位鎖存
        
        P2 = (P2 & 0X1f) | 0xa0;//打開蜂鳴器、繼電器鎖存
        P0 = 0x00;
        P2 = P2 & 0X1f;////恢復(fù)鎖存,避免影響其他位
        
        P2 = (P2 & 0X1f) | 0xc0;//打開位選鎖存
        P0 = 0x00;
        P2 = P2 & 0X1f;//恢復(fù)鎖存,避免影響其他位
        
        P2 = (P2 & 0X1f) | 0xe0;//打開段選鎖存
        P0 = 0xff;
        P2 = P2 & 0X1f;//恢復(fù)鎖存,避免影響其他位
}
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)//打開數(shù)碼管
                {
                                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)//關(guān)閉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()//計(jì)數(shù)
{
        //  AUXR &= 0x7F;                //定時器時鐘12T模式
           TMOD|=0x06;//8位重裝載計(jì)數(shù)
           TL0=0xff;
           TH0=0xff;//1us
           ET0=1;
           TR0=1;
                 TF0 = 0;                //清除TF0標(biāo)志
            EA=1;
}
void Timer1Init()//定時
{
                //        AUXR &= 0xBF;                //定時器時鐘12T模式
                //        TMOD &= 0x0F;                //設(shè)置定時器模式
            TMOD|=0X10;
                        TL1=(65536-50000)%256;//給定時器賦初值,定時50ms
                        TH1=(65536-50000)/256;
                        TF1 = 0;                //清除TF1標(biāo)志
                        TR1 = 1;                //定時器1開始計(jì)時
                        ET1 = 1;    //打開定時器1中斷
            EA=1;
}

void Time0_Service() interrupt 1
{
        count_f++;//累計(jì)NE555輸出信號個數(shù)
}
void Time1_Service() interrupt 3
{
       TH1=(65536-50000)/256;//50ms
        TL1=(65536-50000)%256;
        count_t++;
        count_tt++;
        if(count_t==20)//每1秒刷新一次頻率數(shù)據(jù)
        {
                  ET0=0;//關(guān)閉定時器,從中取出數(shù)值后再打開
                        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下載地址:
第十屆藍(lán)橋杯單片機(jī)設(shè)計(jì)與開發(fā)項(xiàng)目省賽程序試題.pdf (251.64 KB, 下載次數(shù): 20)
10、第十屆頻率測量與電壓控制.zip (270.48 KB, 下載次數(shù): 33)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表