汽车单片机原理程序复习教学资料Word格式文档下载.docx

上传人:b****6 文档编号:17518092 上传时间:2022-12-07 格式:DOCX 页数:44 大小:277.99KB
下载 相关 举报
汽车单片机原理程序复习教学资料Word格式文档下载.docx_第1页
第1页 / 共44页
汽车单片机原理程序复习教学资料Word格式文档下载.docx_第2页
第2页 / 共44页
汽车单片机原理程序复习教学资料Word格式文档下载.docx_第3页
第3页 / 共44页
汽车单片机原理程序复习教学资料Word格式文档下载.docx_第4页
第4页 / 共44页
汽车单片机原理程序复习教学资料Word格式文档下载.docx_第5页
第5页 / 共44页
点击查看更多>>
下载资源
资源描述

汽车单片机原理程序复习教学资料Word格式文档下载.docx

《汽车单片机原理程序复习教学资料Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《汽车单片机原理程序复习教学资料Word格式文档下载.docx(44页珍藏版)》请在冰豆网上搜索。

汽车单片机原理程序复习教学资料Word格式文档下载.docx

P0=_crol_(P0,1);

//P0的值向左循环移动

038只LED左右来回点亮

8只LED左右来回点亮

程序利用循环移位函数_crol_和_cror_形成来回滚动的效果

P2=0x01;

7;

i++)

{

P2=_crol_(P2,1);

//P2的值向左循环移动

DelayMS(150);

}

P2=_cror_(P2,1);

//P2的值向右循环移动

04单只数码管循环显示0~9

/*名称:

单只数码管循环显示0~9

主程序中的循环语句反复将0~9的段码送至P0口,使数字0~9循环显示

ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};

uchart;

while(x--)for(t=0;

t<

t++);

uchari=0;

P0=0x00;

{/*for(;

11;

i++){P0=~DSY_CODE[i];

DelayMS(300);

}//注:

另一方案*/

P0=~DSY_CODE[i];

i=(i+1)%10;

DelayMS(300);

058只数码管滚动显示单个数字

8只数码管滚动显示单个数字

数码管从左到右依次滚动显示0~7,程序通过每次仅循环选通一只数码管

ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uchari,wei=0x80;

8;

P2=0xff;

//关闭显示

wei=_crol_(wei,1);

P0=DSY_CODE[i];

//发送数字段码

P2=wei;

//发送位码

DelayMS(300);

068只数码管动态显示多个不同字符

电路如上图

8只数码管动态显示多个不同字符

数码管动态扫描显示0~7。

{

//发送段码

DelayMS

(2);

7K1-K4按键状态显示

K1-K4按键状态显示

K1、K2按下时LED点亮,松开时熄灭,

K3、K4按下并释放时LED点亮,再次按下并释放时熄灭;

sbitLED1=P0^0;

sbitLED2=P0^1;

sbitLED3=P0^2;

sbitLED4=P0^3;

sbitK1=P1^0;

sbitK2=P1^1;

sbitK3=P1^2;

sbitK4=P1^3;

while(x--)for(i=0;

}

P0=0xff;

P1=0xff;

LED1=K1;

LED2=K2;

if(K3==0)

while(K3==0);

LED3=~LED3;

if(K4==0)

while(K4==0);

LED4=~LED4;

DelayMS(10);

8开关控制LED

开关控制LED

开关S1和S2分别控制LED1和LED2。

sbitS1=P1^0;

sbitS2=P1^1;

LED1=S1;

LED2=S2;

9按键发音

按键发音

按下不同的按键会是SOUNDER发出不同频率的声音。

本例使用延时函数实现不同频率的声音输出,以后也可使用定时器

sbitBEEP=P3^7;

sbitK1=P1^4;

sbitK2=P1^5;

sbitK3=P1^6;

sbitK4=P1^7;

//按周期t发音

voidPlay(uchart)

for(i=0;

100;

BEEP=~BEEP;

DelayMS(t);

BEEP=0;

if(K1==0)Play

(1);

if(K2==0)Play

(2);

if(K3==0)Play(3);

if(K4==0)Play(4);

10INT0中断计数

INT0中断计数

每次按下计数键时触发INT0中断,中断程序累加计数,计数值显示在3只数码管上,按下清零键时数码管清零

//0~9的段码

ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};

//计数值分解后各个待显示的数位

ucharDSY_Buffer[]={0,0,0};

ucharCount=0;

sbitClear_Key=P3^6;

//数码管上显示计数值

voidShow_Count_ON_DSY()

DSY_Buffer[2]=Count/100;

//获取3个数

DSY_Buffer[1]=Count%100/10;

DSY_Buffer[0]=Count%10;

if(DSY_Buffer[2]==0)//高位为0时不显示

DSY_Buffer[2]=0x0a;

if(DSY_Buffer[1]==0)//高位为0,若第二位为0同样不显示

DSY_Buffer[1]=0x0a;

P0=DSY_CODE[DSY_Buffer[0]];

P1=DSY_CODE[DSY_Buffer[1]];

P2=DSY_CODE[DSY_Buffer[2]];

P1=0x00;

P2=0x00;

IE=0x81;

//允许INT0中断

IT0=1;

//下降沿触发

if(Clear_Key==0)Count=0;

//清0

Show_Count_ON_DSY();

//INT0中断函数

voidEX_INT0()interrupt0

Count++;

//计数值递增

11外部INT0中断控制LED

外部INT0中断控制LED说明:

每次按键都会触发INT0中断,中断发生时将LED状态取反,产生LED状态由按键控制的效果

sbitLED=P0^0;

LED=1;

EA=1;

EX0=1;

while

(1);

LED=~LED;

//控制LED亮灭

12定时器控制单只LED

定时器控制单只LED

LED在定时器的中断例程控制下不断闪烁。

ucharT_Count=0;

TMOD=0x00;

//定时器0工作方式0

TH0=(8192-5000)/32;

//5ms定时

TL0=(8192-5000)%32;

IE=0x82;

//允许T0中断

TR0=1;

//T0中断函数

voidLED_Flash()interrupt1

//恢复初值

if(++T_Count==100)//0.5s开关一次LED

T_Count=0;

13定时器控制4个LED滚动闪烁

定时器控制4个LED滚动闪烁

4只LED在定时器控制下滚动闪烁。

sbitB1=P0^0;

sbitG1=P0^1;

sbitR1=P0^2;

sbitY1=P0^3;

uinti,j,k;

i=j=k=0;

TMOD=0x02;

//定时器0工作方式2

TH0=256-200;

//200us定时

TL0=256-200;

//启动定时器

voidLED_Flash_and_Scroll()interrupt1

if(++k<

35)return;

//定时中断若干次后执行闪烁

k=0;

switch(i)

case0:

B1=~B1;

break;

case1:

G1=~G1;

case2:

R1=~R1;

case3:

Y1=~Y1;

default:

i=0;

if(++j<

300)return;

//每次闪烁持续一段时间

j=0;

i++;

//切换到下一个LED

1410s的秒表

10s的秒表

首次按键计时开始,再次按键暂停,第三次按键清零。

sbitK1=P3^7;

uchari,Second_Counts,Key_Flag_Idx;

bitKey_State;

ucharDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

voidDelayMS(uintms)

while(ms--)for(t=0;

//处理按键事件

voidKey_Event_Handle()

if(Key_State==0)

Key_Flag_Idx=(Key_Flag_Idx+1)%3;

switch(Key_Flag_Idx)

case1:

ET0=1;

TR0=1;

case2:

EA=0;

ET0=0;

TR0=0;

case0:

P0=0x3f;

P2=0x3f;

Second_Counts=0;

//显示00

P2=0x3f;

i=0;

Second_Counts=0;

Key_Flag_Idx=0;

//按键次数(取值0,1,2,3)

Key_State=1;

//按键状态

TMOD=0x01;

//定时器0方式1

TH0=(65536-50000)/256;

//定时器0:

15ms

TL0=(65536-50000)%256;

if(Key_State!

=K1)

DelayMS(10);

Key_State=K1;

Key_Event_Handle();

voidDSY_Refresh()interrupt1

//恢复定时器0初值

if(++i==2)//50ms*2=0.1s转换状态

i=0;

Second_Counts++;

P0=DSY_CODE[Second_Counts/10];

P2=DSY_CODE[Second_Counts%10];

if(Second_Counts==100)Second_Counts=0;

//满100(10s)后显示00

15用计数器中断实现100以内的按键计数

用计数器中断实现100以内的按键计数

本例用T0计数器中断实现按键技术,由于计数寄存器初值为1,因此

P3.4引脚的每次负跳变都会触发T0中断,实现计数值累加。

计数器的清零用外部中断0控制。

//段码

TMOD=0x06;

//计数器T0方式2

TH0=TL0=256-1;

//计数值为1

ET0=1;

//允许T0中断

//允许INT0中断

//允许CPU中断

IP=0x02;

//设置优先级,T0高于INT0

//INT0中断触发方式为下降沿触发

//启动T0

P0=DSY_CODE[Count/10];

P2=DSY_CODE[Count%10];

//T0计数器中断函数

voidKey_Counter()interrupt1

Count=(Count+1)%100;

//因为只有两位数码管,计数控制在100以内(00~99)

voidClear_Counter()interrupt0

Count=0;

16定时器控制交通指示灯

定时器控制交通指示灯

东西向绿灯亮5s后,黄灯闪烁,闪烁5次亮红灯,

红灯亮后,南北向由红灯变成绿灯,5s后南北向黄灯闪烁,

闪烁5次后亮红灯,东西向绿灯亮,如此往复。

sbitRED_A=P0^0;

//东西向指示灯

sbitYELLOW_A=P0^1;

sbitGREEN_A=P0^2;

sbitRED_B=P0^3;

//南北向指示灯

sbitYELLOW_B=P0^4;

sbitGREEN_B=P0^5;

//延时倍数,闪烁次数,操作类型变量

ucharTime_Count=0,Flash_Count=0,Operation_Type=1;

//定时器0中断函数

voidT0_INT()interrupt1

TL0=-50000/256;

TH0=-50000%256;

switch(Operation_Type)

//东西向绿灯与南北向红灯亮5s

RED_A=0;

YELLOW_A=0;

GREEN_A=1;

RED_B=1;

YELLOW_B=0;

GREEN_B=0;

if(++Time_Count!

=100)return;

//5s(100*50ms)切换

Time_Count=0;

Operation_Type=2;

break;

//东西向黄灯开始闪烁,绿灯关闭

=8)return;

YELLOW_A=~YELLOW_A;

GREEN_A=0;

if(++Flash_Count!

=10)return;

//闪烁

Flash_Count=0;

Operation_Type=3;

//东西向红灯与南北向绿灯亮5s

RED_A=1;

RED_B=0;

GREEN_B=1;

Operation_Type=4;

case4:

//南北向黄灯开始闪烁,绿灯关闭

YELLOW_B=~YELLOW_B;

Fl

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1