|
防誤踩油門(mén)系統(tǒng)的設(shè)計(jì),基于51單片機(jī)的,有原理圖和程序
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源程序如下:
- #include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
- #include <intrins.h> //因?yàn)橐玫阶笥乙坪瘮?shù),所以加入這個(gè)頭文件
- #define uchar unsigned char
- #define uint unsigned int
- #define LCDLCDDisp_Off 0x3e
- #define LCDLCDDisp_On 0x3f
- #define Page_Add 0xb8//ye
- #define LCDCol_Add 0x40//lie
- #define Start_Line 0xC0//hang
- #define data_ora P0 /*液晶數(shù)據(jù)總線*/
- sbit k1=P1^4;
- sbit k2=P1^5;
- sbit k3=P1^6;
- sbit k4=P1^7;
- sbit beep=P1^1;
- sbit moto=P1^0;
- sbit LCDMcs=P2^1 ; /*片選1*/
- sbit LCDScs=P2^2 ; /*片選2*/
- sbit RESET=P2^3 ; /*復(fù)位信號(hào)*/
- sbit LCDDi=P2^4 ; /*數(shù)據(jù)/指令 選擇*/
- sbit LCDRW=P2^5 ; /*讀/寫(xiě) 選擇*/
- sbit LCDEnable=P2^6 ; /*讀/寫(xiě) 使能*/
- uchar *tab;
- uint k=0;
- uint q=0;
- uchar code hz1[]=
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*-- 文字: 安 --*/
- /*-- 楷體_GB231212; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
- 0xFF,0xFF,0xFF,0x8F,0xEF,0xEF,0x2D,0xF5,0xF3,0x77,0x57,0x67,0x7F,0x7F,0x7F,0xFF,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- };
- void LCDdelay(uchar x)
- {
- int d;
- uchar y;
- for(y=0;y<x;y++)
- for(d=0;d<10;d++);
- }
- void CheckState()
- {
- uchar dat,DATA;//狀態(tài)信息(判斷是否忙)
- LCDDi=0; // 數(shù)據(jù)\指令選擇,D/I(RS)="L" ,表示 DB7∽DB0 為顯示指令數(shù)據(jù)
- LCDRW=1; //R/W="H" ,E="H"數(shù)據(jù)被讀到DB7∽DB0
- do
- {
- DATA=0x00;
- LCDEnable=1; //EN下降源
- LCDdelay(1); //延時(shí)
- dat=DATA;
- LCDEnable=0;
- dat=0x80 & dat; //僅當(dāng)?shù)?位為0時(shí)才可操作(判別busy信號(hào))
- }
- while(!(dat==0x00));
- }
- void write_com(uchar cmdcode)
- {
- CheckState();//檢測(cè)LCD是否忙
- LCDDi=0;
- LCDRW=0;
- P0=cmdcode;
- LCDdelay(1);
- LCDEnable=1;
- LCDdelay(1);
- LCDEnable=0;
- }
- void write_data(uchar LCDDispdata)
- {
- CheckState();//檢測(cè)LCD是否忙
- LCDDi=1;
- LCDRW=0;
- P0=LCDDispdata;
- LCDdelay(1);
- LCDEnable=1;
- LCDdelay(1);
- LCDEnable=0;
- }
- void init_lcd()
- {
- LCDdelay(1);
- LCDMcs=1;//剛開(kāi)始關(guān)閉兩屏
- LCDScs=1;
- LCDdelay(1);
- write_com(LCDLCDDisp_Off);//寫(xiě)初始化命令
- write_com(Page_Add+0);
- write_com(Start_Line+0);
- write_com(LCDCol_Add+0);
- write_com(LCDLCDDisp_On);
- }
- void Clr_Scr()
- {
- uchar j,k;
- LCDMcs=0; //左、右屏均開(kāi)顯示
- LCDScs=0;
- write_com(Page_Add+0);
- write_com(LCDCol_Add+0);
- for(k=0;k<8;k++)//控制頁(yè)數(shù)0-7,共8頁(yè)
- {
- write_com(Page_Add+k); //每頁(yè)每頁(yè)進(jìn)行寫(xiě)
- for(j=0;j<64;j++) //每頁(yè)最多可寫(xiě)32個(gè)中文文字或64個(gè)ASCII字符
- {
- write_com(LCDCol_Add+j);
- write_data(0x00);//控制列數(shù)0-63,共64列,寫(xiě)點(diǎn)內(nèi)容,列地址自動(dòng)加1
- }
- }
- }
- Disp(uchar page,uchar column, uchar code *word)
- {
- uchar i;
- LCDMcs=0;
- LCDScs=1;
- write_com(0xb8|page);
- write_com(0x40|column);
- for(i=0;i<16;i++)
- write_data(word[i]);
- for(i=32;i<48;i++)
- write_data(word[i]);
- for(i=64;i<80;i++)
- write_data(word[i]);
- for(i=96;i<112;i++)
- write_data(word[i]);
- LCDMcs=1;
- LCDScs=0;
- write_com(0xb8|page);
- write_com(0x40);
- for(i=128;i<144;i++)
- write_data(word[i]);
- for(i=160;i<176;i++)
- write_data(word[i]);
- for(i=192;i<208;i++)
- write_data(word[i]);
- for(i=224;i<240;i++)
- write_data(word[i]);
- LCDMcs=0;
- LCDScs=1;
- write_com(0xb8|page+1);
- write_com(0x40|column);
- for(i=16;i<32;i++)
- write_data(word[i]);
- for(i=48;i<64;i++)
- write_data(word[i]);
- for(i=80;i<96;i++)
- write_data(word[i]);
- for(i=112;i<128;i++)
- write_data(word[i]);
- LCDMcs=1;
- LCDScs=0;
- write_com(0xb8|page+1);
- write_com(0x40);
- for(i=144;i<160;i++)
- write_data(word[i]);
- for(i=176;i<192;i++)
- write_data(word[i]);
- for(i=208;i<224;i++)
- write_data(word[i]);
- for(i=240;i<250;i++)
- write_data(word[i]);
- }
- void lcd()
- {
- init_lcd();
- Clr_Scr();
- k=0;
- for(q=0;q<1;q++)
- {
- for(k=0xc0;k<0xff;k++)
- {
- Disp(0,0,hz1);
- Disp(2,0,hz2);
- Disp(4,0,hz3);
- Disp(6,0,hz4);
- LCDMcs=0;
- LCDScs=0;
- write_com(k);
- LCDdelay(2);
- }
- }
- }
- unsigned char start=0;
- unsigned char n=0; //n為節(jié)拍常數(shù)變量
- unsigned char code music_tab[] ={
- 0x18, 0x30, 0x1C , 0x10, //格式為: 頻率常數(shù), 節(jié)拍常數(shù), 頻率常數(shù), 節(jié)拍常數(shù),
- 0x20, 0x40, 0x1C , 0x10,
- 0x18, 0x10, 0x20 , 0x10,
- 0x1C, 0x10, 0x18 , 0x40,
- 0x1C, 0x20, 0x20 , 0x20,
- 0x1C, 0x20, 0x18 , 0x20,
- 0x20, 0x80, 0xFF , 0x20,
- 0x30, 0x1C, 0x10 , 0x18,
- 0x20, 0x15, 0x20 , 0x1C,
- 0x20, 0x20, 0x20 , 0x26,
- 0x40, 0x20, 0x20 , 0x2B,
- 0x20, 0x26, 0x20 , 0x20,
- 0x20, 0x30, 0x80 , 0xFF,
- 0x20, 0x20, 0x1C , 0x10,
- 0x18, 0x10, 0x20 , 0x20,
- 0x26, 0x20, 0x2B , 0x20,
- 0x30, 0x20, 0x2B , 0x40,
- 0x20, 0x20, 0x1C , 0x10,
- 0x18, 0x10, 0x20 , 0x20,
- 0x26, 0x20, 0x2B , 0x20,
- 0x30, 0x20, 0x2B , 0x40,
- 0x20, 0x30, 0x1C , 0x10,
- 0x18, 0x20, 0x15 , 0x20,
- 0x1C, 0x20, 0x20 , 0x20,
- 0x26, 0x40, 0x20 , 0x20,
- 0x2B, 0x20, 0x26 , 0x20,
- 0x20, 0x20, 0x30 , 0x80,
- 0x20, 0x30, 0x1C , 0x10,
- 0x20, 0x10, 0x1C , 0x10,
- 0x20, 0x20, 0x26 , 0x20,
- 0x2B, 0x20, 0x30 , 0x20,
- 0x2B, 0x40, 0x20 , 0x15,
- 0x1F, 0x05, 0x20 , 0x10,
- 0x1C, 0x10, 0x20 , 0x20,
- 0x26, 0x20, 0x2B , 0x20,
- 0x30, 0x20, 0x2B , 0x40,
- 0x20, 0x30, 0x1C , 0x10,
- 0x18, 0x20, 0x15 , 0x20,
- 0x1C, 0x20, 0x20 , 0x20,
- 0x26, 0x40, 0x20 , 0x20,
- 0x2B, 0x20, 0x26 , 0x20,
- 0x20, 0x20, 0x30 , 0x30,
- 0x20, 0x30, 0x1C , 0x10,
- 0x18, 0x40, 0x1C , 0x20,
- 0x20, 0x20, 0x26 , 0x40,
- 0x13, 0x60, 0x18 , 0x20,
- 0x15, 0x40, 0x13 , 0x40,
- 0x18, 0x80, 0x00
- };
-
- void int0() interrupt 1 //采用中斷0 控制節(jié)拍
- { TH0=0xd8;
- TL0=0xef;
- n--;
- }
-
- void delaya(unsigned int a)
- {
- while(a--);
- }
- void delayb (unsigned char m) //控制頻率延時(shí)
- {
- unsigned b=3*m;
- while(--b);
- }
-
- void delayc(unsigned char c) //豪秒延時(shí)子程序
- {
- while(--c);
- }
- void sound()
- {
- unsigned char p,m; //m為頻率常數(shù)變量
- unsigned char i=0;
- TMOD&=0x0f;
- TMOD|=0x01;
- TH0=0xd8;TL0=0xef;
- IE=0x82;
- play:
- while(1)
- {
- a: p=music_tab[i];
- if(p==0x00) { i=0, delayc(1000); goto play;} //如果碰到結(jié)束符,延時(shí)1秒,回到開(kāi)始再來(lái)一遍
- else if(p==0xff) { i=i+1;delayc(100),TR0=0; goto a;} //若碰到休止符,延時(shí)100ms,繼續(xù)取下一音符
- else {m=music_tab[i++], n=music_tab[i++];} //取頻率常數(shù) 和 節(jié)拍常數(shù)
- TR0=1; //開(kāi)定時(shí)器1
- while(n!=0) beep=~beep,delayb(m); //等待節(jié)拍完成, 通過(guò)P1口輸出音頻
- TR0=0; //關(guān)定時(shí)器1
- }
- }
- void dcmotor()
- {
- unsigned char j;
- moto=0; //關(guān)閉電機(jī)
- for(j=0;j<100;j++) //循環(huán)100次,也就是大約5S
- {
- moto=1; //開(kāi)啟電機(jī)
- delaya(5000); //大約延時(shí)50ms
- }
- moto=0; //關(guān)閉電機(jī)
-
- }
-
- void keypros()
- {
- if((k1|k2|k3|k4)==0) //開(kāi)始
- {
- delaya(1000);
- if((k1|k2|k3|k4)==0)
- {
- start=1;
- }
- }
- }
- void main()
- {
- while(1)
- {
- keypros();
- if(start==1)
- {
- lcd();
- dcmotor();
- sound();
- }
- else
- {
- beep=1;
- moto=0;
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
proteus仿真代碼.zip
(40.9 KB, 下載次數(shù): 20)
2020-4-4 21:00 上傳
點(diǎn)擊文件名下載附件
Proteus原理圖.zip
(69.12 KB, 下載次數(shù): 17)
2020-4-4 21:00 上傳
點(diǎn)擊文件名下載附件
|
|