附件里面有省賽程序題及客觀題(客觀題無答案)及我自己寫的源代碼以下是程序設計題題目
10P-DPJ-2_Page1.png (34.74 KB, 下載次數: 96)
下載附件
這是程序設計題第一頁
2019-4-29 17:29 上傳
10P-DPJ-2_Page2.png (35.85 KB, 下載次數: 65)
下載附件
這是程序設計題第二頁
2019-4-29 17:29 上傳
10P-DPJ-2_Page3.png (37.82 KB, 下載次數: 62)
下載附件
這是程序設計題第三頁
2019-4-29 17:29 上傳
10P-DPJ-2_Page4.png (21.72 KB, 下載次數: 61)
下載附件
這是程序設計題第四頁
2019-4-29 17:29 上傳
以下是單片機主函數,有完整的注釋。
- #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);
- }
復制代碼 全部的程序請到附件里面下載
0.png (39.09 KB, 下載次數: 74)
下載附件
2019-4-29 21:39 上傳
全部資料51hei下載地址:
2019年第10屆.rar
(760.55 KB, 下載次數: 214)
2019-4-29 17:35 上傳
點擊文件名下載附件
這是程序源代碼及題目 下載積分: 黑幣 -5
|