51hei截圖_20200303222708.png (115.54 KB, 下載次數: 58)
下載附件
2020-3-3 22:27 上傳
#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)
2020-3-3 22:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
10、第十屆頻率測量與電壓控制.zip
(270.48 KB, 下載次數: 33)
2020-3-3 22:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|