標(biāo)題:
單片機(jī)設(shè)計(jì)的防誤踩油門(mén)系統(tǒng) Proteus仿真程序
[打印本頁(yè)]
作者:
御龍啊
時(shí)間:
2020-4-4 21:01
標(biāo)題:
單片機(jī)設(shè)計(jì)的防誤踩油門(mén)系統(tǒng) Proteus仿真程序
防誤踩油門(mén)系統(tǒng)的設(shè)計(jì),基于51單片機(jī)的,有原理圖和程序
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png
(26.83 KB, 下載次數(shù): 58)
下載附件
2020-4-4 22:01 上傳
單片機(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ù)總線(xiàn)*/
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)擊文件名下載附件
下載積分: 黑幣 -5
Proteus原理圖.zip
(69.12 KB, 下載次數(shù): 17)
2020-4-4 21:00 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
51hei團(tuán)團(tuán)
時(shí)間:
2020-4-4 22:08
程序有問(wèn)題吧,無(wú)屏幕顯示
作者:
zbfdyw
時(shí)間:
2020-4-19 18:04
這個(gè)程序和仿真有以下幾個(gè)缺陷:1.仿真的時(shí)候,屏幕沒(méi)有顯示。2.缺少提示和說(shuō)明,不知道按鍵是做什么的!3.這個(gè)防誤踩油門(mén)系統(tǒng),怎么工作的?原理如何?一個(gè)都不知道!
作者:
zbfdyw
時(shí)間:
2020-4-19 22:06
不過(guò)還是很感謝你的努力和辛苦,你的程序的借鑒意義是恨到的!再次感謝
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1