作品是簡陋了一些,不過功能還是比較綜合,所以文件名字取名“ZONGHE”,適合單片機入門之后的訓練
實物圖:
~[NWY5_Q03EF%9YRX_1R(ZM.png (804.58 KB, 下載次數: 40)
下載附件
2018-5-20 02:49 上傳
0.jpg (25.64 KB, 下載次數: 46)
下載附件
2018-5-20 03:24 上傳
單片機源程序如下:
- /**************************************************************/
- //作者:武夷學院 機電學院 0721de
- //地點: 宿舍
- //芯片:STC12C5A系列
- //作用:力學模型作品軟件組成,歡迎交流單片機,APP技術
- /**************************************************************/
- #include "STC12C5A.H"
- #include "ADC.h"
- #define uchar unsigned char
- #define TIME 2000 //電機轉動時間
- #define KEY_P P3 //鍵盤
- uchar KEEY=0,key=0,temp=0; //鍵盤
- sbit MOTOR1=P0^7; //簡支梁,外伸梁電機 =1驅動
- sbit MOTOR2=P0^6; //懸臂梁電機 =1驅動
- sbit LED_HONG1=P0^5; //簡支梁,外伸梁紅燈 =1驅動
- sbit LED_LV1=P0^4; //簡支梁,外伸梁綠燈 =1驅動
- sbit LED_HONG2=P0^3; //懸臂梁紅燈 =1驅動
- sbit LED_LV2=P0^2; //懸臂梁綠燈 =1驅動
- sbit lcd_l=P0^0;
- sbit lcd_h=P0^1;
- sbit DATA=P1^2; //LCD
- sbit CLK=P1^3; //LCD
- uchar code dis0[] = {"<<"}; //LCD
- uchar code dis1[] = {" 材料力學教具 "}; //LCD
- uchar code dis2[] = {" 歡迎使用 "}; //LCD
- uchar code dis3[] = {" 武夷學院制 "}; //LCD
- uchar code dis4[] = {" 點擊回車進入 "}; //LCD
- uchar code dis5[] = {"簡支梁例題選擇"}; //LCD
- uchar code dis6[] = {"外伸梁例題選擇"}; //LCD
- uchar code dis7[] = {"懸臂梁例題選擇"}; //LCD
- uchar code dis8[] = {"----------------"}; //LCD
- uchar code dis9[] = {" "}; //
- uchar code dis10[] = {"長方體的簡支梁總"}; //簡支梁
- uchar code dis11[] = {"長8m, 均布載荷q "}; //簡支梁
- uchar code dis12[] = {"的中心距A 點4m, "}; //簡支梁
- uchar code dis13[] = {"載荷作用長度8m, "}; //簡支梁
- uchar code dis100[] ={"截面為長12cm的正"}; //簡支梁
- uchar code dis111[] ={"方體, 許用正應力"}; //簡支梁
- uchar code dis122[] ={"=10MPa, 求q 最大"}; //簡支梁
- uchar code dis133[] ={"值, 答案:180MPa "}; //簡支梁
- ////////////////////////////////////////////////////////////
- uchar code dis14[] = {"板長150mm,截面長"}; //外伸梁
- uchar code dis15[] = {"20mm, 寬30mm, 截"}; //外伸梁
- uchar code dis16[] = {"面孔直徑14mm彎曲"}; //外伸梁
- uchar code dis17[] = {"許用應力140MPa, "}; //外伸梁
- uchar code dis144[] ={"求最大允許壓緊力"}; //外伸梁
- uchar code dis155[] ={"F. 答案F=3KN,扭"}; //外伸梁
- uchar code dis166[] ={"動旋鈕模擬學生答"}; //外伸梁
- uchar code dis177[] ={"案( 單位N ) "}; //外伸梁
- ////////////////////////////////////////////////////////////
- uchar code dis18[] = {"懸臂梁的長度為5m"}; //懸臂梁
- uchar code dis19[] = {"截面0.1m平方米, "}; //懸臂梁
- uchar code dis20[] = {"載荷F 在B 端, 大"}; //懸臂梁
- uchar code dis21[] = {"小未知, 許用切應"}; //懸臂梁
- uchar code dis188[] ={"力為100MPa, 求F "}; //懸臂梁
- uchar code dis199[] ={"允許的最大值. "}; //懸臂梁
- uchar code dis200[] ={"答案F= KN. "}; //懸臂梁
- uchar code dis211[] ={" "}; //懸臂梁
- uchar can1[4];
- uchar can2[4];
- uchar can3[4];
- uchar can4[4];
- #define GUAN P2 //數碼管
- sbit G1=P1^7; //數碼管
- sbit G2=P1^6; //數碼管
- sbit G3=P1^5; //數碼管
- sbit G4=P1^4; //數碼管
- unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, //數碼管
- 0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //數碼管
- void shu_ma_guan(int); //數碼管
- char KEY_SCAN(); //鍵盤
- char HANG=0;
- void write_data(unsigned char); //LCD
- void write_cmd(unsigned char); //LCD
- void write_han(uchar,uchar,uchar dis[]); //LCD
- void LCD_init(); //LCD
- void DELAY(int);
- void DIANJIZHUAN();
- void main()
- {
- /********初始化定時器,ADC和LCD*******/
- int adc=0,adcmin=2000; //此變量用于存儲ADC轉換數值
- adc_init();
- LCD_init();
- MOTOR1=1;
- MOTOR2=1;
- LED_HONG1=1;
- LED_HONG2=1;
- LED_LV1=0; //亮綠燈
- LED_LV2=0; //亮綠燈
- lcd_l=0;
- lcd_h=1; //LCD
- /*********初始化結束***********/
- while(1) //第一層while
- {
- adc=get_AD_result_10F(1);
- if(adc<adcmin)adcmin=adc;
- if(adc-adcmin>1){adcmin++;if(adc-adcmin>11)adcmin+=10;}
- shu_ma_guan(adcmin); //之前要加上adc處理防止數碼管閃
- write_han(0,0,dis1);
- write_han(1,0,dis2);
- write_han(2,0,dis3);
- write_han(3,0,dis4);
- KEEY=KEY_SCAN();
- if(KEEY==0)
- while(KEEY!=4) //第二界面
- {
- KEEY=25;
- LED_HONG1=1; //紅燈滅
- LED_HONG2=1; //紅燈滅
- LED_LV1=0; //亮綠燈
- LED_LV2=0; //亮綠燈
- adc=get_AD_result_10F(1);
- if(adc<adcmin)adcmin=adc;
- if(adc-adcmin>1){adcmin++;if(adc-adcmin>11)adcmin+=10;}
- shu_ma_guan(adcmin); //之前要加上adc處理防止數碼管閃
- write_han(0,0,dis5);
- if(HANG==0){write_han(0,7,dis0);write_han(1,7,dis9);write_han(2,7,dis9);write_han(3,7,dis9);}
- write_han(1,0,dis6);
- if(HANG==1){write_han(1,7,dis0);write_han(0,7,dis9);write_han(2,7,dis9);write_han(3,7,dis9);}
- write_han(2,0,dis7);
- if(HANG==2){write_han(2,7,dis0);write_han(0,7,dis9);write_han(1,7,dis9);write_han(3,7,dis9);}
- write_han(3,0,dis8);
- KEEY=KEY_SCAN();
- if(KEEY==2){HANG++;KEEY=25;}
- if(KEEY==3){HANG--;KEEY=25;}
- if(HANG>2)HANG=0;if(HANG<0)HANG=2;
- ////////////////////////////////////////////////////
- if(HANG==0&&KEEY==0)while(KEEY!=4)
- { //第三界面1簡支梁
- // KEEY=25;
- adc=get_AD_result_10F(1);
- if(adc<adcmin)adcmin=adc;
- if(adc-adcmin>1){adcmin++;if(adc-adcmin>11)adcmin+=10;}
- shu_ma_guan(adcmin/5);
- if(LED_LV1==0)if(adcmin==900){LED_HONG1=0;LED_LV1=1;MOTOR1=0;DIANJIZHUAN();MOTOR1=1;}//斷梁
- write_han(0,0,dis10);
- write_han(1,0,dis11);
- write_han(2,0,dis12);
- write_han(3,0,dis13);
- KEEY=KEY_SCAN();
- if(KEEY==2)while(KEEY!=4&&KEEY!=3)
- {
- adc=get_AD_result_10F(1);
- if(adc<adcmin)adcmin=adc;
- if(adc-adcmin>1){adcmin++;if(adc-adcmin>11)adcmin+=10;}
- shu_ma_guan(adcmin/5);
- if(LED_LV1==0)if(adcmin==900){LED_HONG1=0;LED_LV1=1;MOTOR1=0;DIANJIZHUAN();MOTOR1=1;}//斷梁
- write_han(0,0,dis100);
- write_han(1,0,dis111);
- write_han(2,0,dis122);
- write_han(3,0,dis133);
- KEEY=KEY_SCAN();
- }
- } //第三界面1結束
- /////////////////////////////////////////////////////
- if(HANG==1&&KEEY==0)while(KEEY!=4)
- { //第三界面2外伸梁
- adc=get_AD_result_10F(1);
- if(adc<adcmin)adcmin=adc;
- if(adc-adcmin>1){adcmin++;if(adc-adcmin>11)adcmin+=10;}
- shu_ma_guan(adcmin*3);
- if(LED_LV1==0)if(adcmin==1000){LED_HONG1=0;LED_LV1=1;MOTOR1=0;DIANJIZHUAN();MOTOR1=1;}//斷梁
- write_han(0,0,dis14);
- write_han(1,0,dis15);
- write_han(2,0,dis16);
- write_han(3,0,dis17);
- KEEY=KEY_SCAN();
- if(KEEY==2)while(KEEY!=4&&KEEY!=3)
- {
- adc=get_AD_result_10F(1);
- if(adc<adcmin)adcmin=adc;
- if(adc-adcmin>1){adcmin++;if(adc-adcmin>11)adcmin+=10;}
- shu_ma_guan(adcmin*3);
- if(LED_LV1==0)if(adcmin==1000){LED_HONG1=0;LED_LV1=1;MOTOR1=0;DIANJIZHUAN();MOTOR1=1;}//斷梁
- write_han(0,0,dis144);
- write_han(1,0,dis155);
- write_han(2,0,dis166);
- write_han(3,0,dis177);
- KEEY=KEY_SCAN();
- }
- } //第三界面2結束
- /////////////////////////////////////////////////////
- if(HANG==2&&KEEY==0)while(KEEY!=4)
- { //第三界面3懸臂梁
- // KEEY=25;
- adc=get_AD_result_10F(1);
- if(adc<adcmin)adcmin=adc;
- if(adc-adcmin>1){adcmin++;if(adc-adcmin>11)adcmin+=10;}
- if(LED_LV2==1)if(adcmin==1000){LED_HONG2=0;LED_LV2=1;MOTOR2=0;DIANJIZHUAN();MOTOR2=1;}//斷梁
- shu_ma_guan(adcmin);
- write_han(0,0,dis18);
- write_han(1,0,dis19);
- write_han(2,0,dis20);
- write_han(3,0,dis21);
- KEEY=KEY_SCAN();
- if(KEEY==2)while(KEEY!=4&&KEEY!=3)
- {
- adc=get_AD_result_10F(1);
- if(adc<adcmin)adcmin=adc;
- if(adc-adcmin>1){adcmin++;if(adc-adcmin>11)adcmin+=10;}
- shu_ma_guan(adcmin);
- write_han(0,0,dis188);
- write_han(1,0,dis199);
- write_han(2,0,dis200);
- write_han(3,0,dis211);
- KEEY=KEY_SCAN();
- }
- } //第三界面3結束
- KEEY=25;
- } //第二界面結束
- } //第一界面結束
- }
- /***********不可更改部分******/
- void shu_ma_guan(int a)
- {
- char g,s,b,q;
- int j=30; //根據情況變化
- g=a%10;
- s=(a/10)%10;
- b=(a/100)%10;
- q=(a/1000)%10;
- while(j--)
- {
- G1=0;
- G2=1;
- G3=1;
- G4=1;
- GUAN=table[q];
- DELAY(100);
- G1=1;
- G2=0;
- G3=1;
- G4=1;
- GUAN=table[b];
- DELAY(100);
- G1=1;
- G2=1;
- G3=0;
- G4=1;
- GUAN=table[s];
- DELAY(100);
- G1=1;
- G2=1;
- G3=1;
- G4=0;
- GUAN=table[g];
- DELAY(100);
- }
- }
- void DELAY(int i)
- {
- while(i--);
- }
- char KEY_SCAN()
- {
- KEY_P=0xfe; //************設KEY_P為1111 1110***********************
- temp=KEY_P; //讀引腳KEY_P與1111 0000 進行與運算,
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- DELAY(2);
- if(temp!=0xf0) //與運算完畢后發現0xfe中高四位改變則進入if語句
- {
- temp=KEY_P;
- switch(temp)
- {
- case 0xee: //KEY_P口為1110 1110則key0被按下
- key=0;
- break;
- case 0xde: //1101 1110則key1被按下
- key=1;
- break;
- case 0xbe: //1011 1110key2
- key=2;
- break;
- case 0x7e: //0111 1110key3
- key=3;
- break;
- }
- while(temp!=0xf0) //檢測到有按鍵按下,立即將KEY_P賦值給temp
- {
- temp=KEY_P;
- temp=temp&0xf0;
-
- }
-
- return key;
- //P1=0xfe;
- }
- }
- KEY_P=0xfd; //*****************設KEY_P為1111 1011***********************
- temp=KEY_P; //設KEY_P為0xf0只有第二列按下KEY_P口高四位做出相應變化
- temp=temp&0xf0; //p3與1111 0000與運算
- if(temp!=0xf0)
- { //KEY_P被賦予的0xfe(1110)檢測第一列,0xfd(1101)檢測第二列,0xfb(1011),0xf7(0111)
- DELAY(2);
- if(temp!=0xf0)
- {
- temp=KEY_P;
- switch(temp)
- {
- case 0xed:
- key=4;
- break;
- case 0xdd:
- key=5;
- break;
- case 0xbd:
- key=6;
- break;
- case 0x7d:
- key=7;
- break;
- }
- while(temp!=0xf0)
- {
- temp=KEY_P;
- temp=temp&0xf0;
-
- }
-
- return key;
- }
- }
- KEY_P=0xfb; //設KEY_P為0xfb只有第三列按下KEY_P口高四位做出相應變化
- temp=KEY_P;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- DELAY(2);
- if(temp!=0xf0)
- {
- temp=KEY_P;
- switch(temp)
- {
- case 0xeb:
- key=8;
- break;
- case 0xdb:
- key=9;
- break;
- case 0xbb:
- key=10;
- break;
- case 0x7b:
- key=11;
- break;
- }
- while(temp!=0xf0)
- {
- temp=KEY_P;
- temp=temp&0xf0;
-
- }
-
- return key;
- }
- }
- KEY_P=0xf7; //設KEY_P為0xf7只有第四列按下KEY_P口高四位做出相應變化
- temp=KEY_P;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- DELAY(2);
- if(temp!=0xf0)
- {
- temp=KEY_P;
- switch(temp)
- {
- case 0xe7:
- key=12;
- break;
- case 0xd7:
- key=13;
- break;
- case 0xb7:
- key=14;
- break;
- case 0x77:
- key=15;
- break;
- }
- while(temp!=0xf0)
- {
- temp=KEY_P;
- temp=temp&0xf0;
-
- }
-
- return key;
- }
- }
- return 22; //防止key始終為0
- }
- void LCD_init()
- {
- write_cmd(0x34); //擴充指令操作 0011 0100 (00 001DL X,RE,X,X)RE為擴充指令,DL必為1
-
- write_cmd(0x30); //基本指令操作 0011 0000 RE為0基礎指令
-
- write_cmd(0x0C); //顯示開,關光標 0000 1100 (0000 1DCB)D整體顯示C游標B游標位置
-
- write_cmd(0x01); //清除LCD的顯示內容 0000 0001
-
- }
- void write_data(unsigned char Data)
- {
- DATA=0;
- DATA=1;
- CLK=1;DELAY(2); //1
- CLK=0;
- DATA=1;
- CLK=1;DELAY(2); //2
- CLK=0;
- DATA=1;
- CLK=1;DELAY(2); //3
- CLK=0;
- DATA=1;
- CLK=1;DELAY(2); //4
- CLK=0;
- DATA=1;
- CLK=1;DELAY(2); //5
- CLK=0;
- DATA=0; //
- CLK=1;DELAY(2); //6
- CLK=0;
- DATA=1; //
- CLK=1;DELAY(2); //7
- CLK=0;
- DATA=0;
- CLK=1;DELAY(2); //8
- CLK=0;
- DATA=0x80&Data;
- CLK=1;DELAY(2); //9
- CLK=0;
- DATA=0x40&Data;
- CLK=1;DELAY(2); //10
- CLK=0;
- DATA=0x20&Data;
- CLK=1;DELAY(2); //11
- CLK=0;
- DATA=0x10&Data;
- CLK=1;DELAY(2); //12
- CLK=0;
- DATA=0;
- CLK=1;DELAY(2); //13
- CLK=0;
- DATA=0;
- CLK=1;DELAY(2); //14
- CLK=0;
- DATA=0;
- CLK=1;DELAY(2); //15
- CLK=0;
- DATA=0;
- CLK=1;DELAY(2); //16
- CLK=0;
- DATA=0x08&Data;
- CLK=1;DELAY(2); //17
- CLK=0;
- DATA=0x04&Data;
- CLK=1;DELAY(2); //18
- CLK=0;
- DATA=0x02&Data;
- CLK=1;DELAY(2); //19
- CLK=0;
- DATA=0x01&Data;
- CLK=1;DELAY(2); //20
- CLK=0;
- DATA=0;
- CLK=1;DELAY(2); //21
- CLK=0;
- DATA=0;
- CLK=1;DELAY(2); //22
- CLK=0;
-
- DATA=0;
- CLK=1;DELAY(2); //23
- CLK=0;
-
- DATA=0;
- CLK=1;DELAY(2); //24
- CLK=0;
- }
- void write_cmd(unsigned char Data)
- {
- DATA=0;
- DATA=1;
- CLK=1;DELAY(2); //1
- CLK=0;
- DATA=1;
- CLK=1;DELAY(2); //2
- CLK=0;
- DATA=1;
- CLK=1;DELAY(2); //3
- CLK=0;
-
- DATA=1;
- CLK=1;DELAY(2); //4
- CLK=0;
- DATA=1;
- CLK=1;DELAY(2); //5
- CLK=0;
- DATA=0; //
- CLK=1;DELAY(2); //6
- CLK=0;
- DATA=0; //
- CLK=1;DELAY(2); //7
- CLK=0;
- DATA=0;
- CLK=1;DELAY(2); //8
- CLK=0;
- DATA=0x80&Data;
- CLK=1;DELAY(2); //9
- CLK=0;
- DATA=0x40&Data;
- CLK=1;DELAY(2); //10
- CLK=0;
- DATA=0x20&Data;
- CLK=1;DELAY(2); //11
- CLK=0;
- DATA=0x10&Data;
- CLK=1;DELAY(2); //12
- CLK=0;
- DATA=0;
- CLK=1;DELAY(2); //13
- CLK=0;
- DATA=0;
- CLK=1;DELAY(2); //14
- CLK=0;
- DATA=0;
- CLK=1;DELAY(2); //15
- CLK=0;
- DATA=0;
- CLK=1;DELAY(2); //16
- CLK=0;
- DATA=0x08&Data;
- CLK=1;DELAY(2); //17
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
ZONGHE.zip
(12.4 KB, 下載次數: 11)
2018-5-20 02:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|