#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)
|