附件里面有省赛程序题及客观题(客观题无答案)及我自己写的源代码以下是程序设计题题目
以下是单片机主函数,有完整的注释。
- #include "STC15F2K60S2.H"
- #include "MAIN.H"
- #include "HAREWARE.H"
- #include "DIG.H"
- #include "I2C.H"
- #include "DELAY.H"
- #include "LED.H"
- sbit s4 = P3^3;//按键S4
- sbit s5 = P3^2;//按键S5
- sbit s6 = P3^1;//按键S6
- sbit s7 = P3^0;//按键S7
- unsigned int PCF_NUM = 0;//电压值
- unsigned char led_mode = 0xff; //LED灯点亮模式
- unsigned int f_num = 0;//频率数值
- unsigned char j = 0;//频率测量里面的等待中断标志
- unsigned char diya_num = 0;//储存模数转换返回的电压值
- unsigned char timer = 0;
- bit s4_mode = 1;//1为电压测量模式,0为频率测量模式
- bit s5_mode = 0;//1为输出2.0v电压,为0跟随PCF8591三通道电压输出
- bit s6_mode = 1;//1为开启LED灯显示,0为关显示
- bit s7_mode = 1;//1为开启数码管显示,0为关显示
- bit gensui = 0;//0为不跟随电压输出,1为跟随电压输出
- unsigned char useg_num[]={0x3e,0,0,0,0,0,0,0};//电压数值数组
- unsigned char fseg_num[]={0x71,0,0,0,0,0,0,0};//频率数值数组
-
- void key_scan();//按键扫描函数原型
- unsigned char dian_ya_ce_liang(); //电压测量函数原型
- void TimerInit();//定时计数初始化函数原型
- /************************************************************************************************/
- /******************************************函数**************************************************/
- /************************************************************************************************/
- void main()//主函数
- {
- HAREWARE_init();//关闭外部设备
- DIG_init();//数码管初始化
- LED_init();//LED灯初始化
- TimerInit();//定时器1初始化
- P20 = 1;
- while(1)//等待中断
- {
- key_scan();//按键扫描
- if(~s5_mode)//判断是否是电压跟随模式
- {
- PCF_DA(103); //没有跟随
- gensui = 0; //没有跟随
- }
- else
- {
- gensui = 1; //跟随电压
- }
- if(s4_mode)//判断是否为电压测量模式
- {
- diya_num = dian_ya_ce_liang();
- led_mode = 0xfe;//电压测量模式指示灯亮
- if(((diya_num * 0.01953125 >= 1.5) && (diya_num * 0.01953125 < 2.5)) || (diya_num * 0.01953125 >= 3.5))
- {
- led_mode &= 0xfb;//满足条件第三个指示灯亮
- }
- if(gensui)
- {
- led_mode &= 0xef;//电压跟随第五个指示灯亮
- }
- PCF_NUM = diya_num * 1.953125;//变成十进制的数字,把小数乘一百
- useg_num[5]=DIG_CODE[PCF_NUM/100];//百位数字
- PCF_NUM = PCF_NUM % 100;
- useg_num[6]=DIG_CODE[PCF_NUM/10];//十位数字
- PCF_NUM %=10;
- useg_num[7]=DIG_CODE[PCF_NUM];//个位数字
- LED_show(led_mode);//LED等显示
- DIG_show(useg_num);//数码管显示
- if(gensui)//判断是否是电压跟随模式
- {
- PCF_DA(diya_num); //没有跟随
- }
- }
- else//频率测量模式
- {
- TR1 = 1;//开始计时
- TR0 = 1;//开始计数
- j = 1;//等待中断标志置1
- while(j);//等待中断
- }
- }
- }
- ////////////////////////////////////////////////////
- ////////////////////////////////////////////////////
- void TimerInit()//定时计数器初始化函数
- {
- AUXR &= 0x3F;//12分频
- TMOD &= 0x00;//TMOD(定时/计数器模式寄存器)清零
- TMOD |= 0x15;//T0设置为模式1,计数;T1设置为模式1,定时
- TH0 = TL0 = 0;//计数器清零
- TL1 = 0xF0; //设置定时初值
- TH1 = 0xD8; //设置定时初值
- EA = 1;//开总中断
- ET1 = 1;//开定时器1中断
- }
- ///////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////
- unsigned char dian_ya_ce_liang()
- {
- return PCF_AD(3);//返回模数转换值
- }
- //////////////////////////////////////////////////////
- //////////////////////////////////////////////////////
- void key_scan()//键盘扫描函数
- {
- P3 |= 0x0f;//P3低4位设为全1
- if(~s4)//判断S4按键
- {
- delay1ms(5);//按键消抖
- if(~s4)//判断S4按键
- {
- s4_mode = ~s4_mode;
- }
- }
- if(~s5)//判断S5按键
- {
- delay1ms(5);//按键消抖
- if(~s5)//判断S5按键
- {
- if(s4_mode)//如果在电压测量模式则改变电压跟随标志
- {
- s5_mode = ~s5_mode;//s5_mode取反
- }
-
- }
- }
- if(~s6)//判断S6按键
- {
- delay1ms(5);//按键消抖
- if(~s6)//判断S6按键
- {
- s6_mode = ~s6_mode;
- if(~s6_mode)
- {
- LED_init();//关LED灯
- }
-
- }
- }
- if(~s7)//判断S7按键
- {
- delay1ms(5);//按键消抖
- if(~s7)//判断S7按键
- {
- s7_mode = ~s7_mode;//取反
- if(~s7_mode)//如果数码管开关标志为0,关数码管显示
- {
- DIG_init();//关数码管
- }
-
- }
- }
- while(~s4||~s5||~s6||~s7)//松手检测
- {
- if(s4_mode)//如果为电压测量模式,数码管显示电压值,防止出现数码管黑屏现象
- {
- DIG_show(useg_num);//数码管显示电压测量值
- LED_show(led_mode);//LED显示电压测量模式
- }
- else//如果为频率测量模式,数码管显示频率值,防止出现数码管黑屏现象
- {
- DIG_show(fseg_num);//数码管显示频率测量值
- LED_show(led_mode);//LED显示频率测量模式
- }
- }
- }
- /*//////////////////////////////////////////
- ///////////定时器1中断函数/////////////////
- //////////////////////////////////////////*/
- void T1()interrupt 3//定时器1中断函数
- {
- unsigned char i = 0;
- unsigned int f_num2 = 0;
- P20 = ~P20;
- TR0 = 0;//停止计数
- TR1 = 0;//停止定时
- TL1 = 0xF0;//设置定时初值
- TH1 = 0xD8;//设置定时初值
- timer++;//计数器加1
- j = 0;//等待中断标志清零
- if(timer == 20)
- {
- f_num = (TH0 * 256 + TL0) * 5; //计算频率
- timer = 0;
- TL0 = TH0 = 0;//计数器清零
- for(i=7;i>2;i--)//重新初始化频率数值数组
- {
- fseg_num[i] = 0;//除数组的第一位和第二位其他的初始化为0
- }
- if((f_num >= 1000 && f_num < 5000)||(f_num >= 10000))
- {
- led_mode = 0XF5;//满足条件led4亮
- }
- else
- {
- led_mode = 0XFD;
- }
- for(i = 7;i>2 && f_num != 0;i--)
- {
- fseg_num[i] = DIG_CODE[f_num % 10];
- f_num /= 10;
- }
- }
- LED_show(led_mode);
- DIG_show(fseg_num);
- }
复制代码 全部的程序请到附件里面下载
全部资料51hei下载地址:
2019年第10届.rar
(760.55 KB, 下载次数: 212)
|