汽车单片机原理程序复习教学资料.docx
- 文档编号:4583152
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:44
- 大小:277.99KB
汽车单片机原理程序复习教学资料.docx
《汽车单片机原理程序复习教学资料.docx》由会员分享,可在线阅读,更多相关《汽车单片机原理程序复习教学资料.docx(44页珍藏版)》请在冰豆网上搜索。
汽车单片机原理程序复习教学资料
汽车单片机原理程序复习
第01篇基础程序设计
01闪烁的LED
/*名称:
闪烁的LED
说明:
LED按设定的时间间隔闪烁
*/
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLED=P1^0;
//延时
voidDelayMS(uintx)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
voidmain()
{
while
(1)
{
LED=~LED;
DelayMS(150);
}
}
02从左到右的流水灯
/*名称:
从左到右的流水灯
说明:
接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果
*/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//延时
voidDelayMS(uintx)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
voidmain()
{
P0=0xfe;
while
(1)
{
P0=_crol_(P0,1);//P0的值向左循环移动
DelayMS(150);
}
}
038只LED左右来回点亮
/*名称:
8只LED左右来回点亮
说明:
程序利用循环移位函数_crol_和_cror_形成来回滚动的效果
*/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//延时
voidDelayMS(uintx)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
voidmain()
{
uchari;
P2=0x01;
while
(1)
{
for(i=0;i<7;i++)
{
P2=_crol_(P2,1);//P2的值向左循环移动
DelayMS(150);
}
for(i=0;i<7;i++)
{
P2=_cror_(P2,1);//P2的值向右循环移动
DelayMS(150);
}
}
}
04单只数码管循环显示0~9
/*名称:
单只数码管循环显示0~9
说明:
主程序中的循环语句反复将0~9的段码送至P0口,使数字0~9循环显示
*/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//延时
voidDelayMS(uintx)
{
uchart;
while(x--)for(t=0;t<120;t++);
}
//主程序
voidmain()
{
uchari=0;
P0=0x00;
while
(1)
{/*for(;i<11;i++){P0=~DSY_CODE[i];DelayMS(300);}//注:
另一方案*/
P0=~DSY_CODE[i];
i=(i+1)%10;
DelayMS(300);
}
}
058只数码管滚动显示单个数字
/*名称:
8只数码管滚动显示单个数字
说明:
数码管从左到右依次滚动显示0~7,程序通过每次仅循环选通一只数码管
*/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//延时
voidDelayMS(uintx)
{
uchart;
while(x--)for(t=0;t<120;t++);
}
//主程序
voidmain()
{
uchari,wei=0x80;
while
(1)
{
for(i=0;i<8;i++)
{
P2=0xff;//关闭显示
wei=_crol_(wei,1);
P0=DSY_CODE[i];//发送数字段码
P2=wei;//发送位码
DelayMS(300);
}
}
}
068只数码管动态显示多个不同字符
电路如上图
/*名称:
8只数码管动态显示多个不同字符
说明:
数码管动态扫描显示0~7。
*/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//延时
voidDelayMS(uintx)
{
uchart;
while(x--)for(t=0;t<120;t++);
}
//主程序
voidmain()
{
uchari,wei=0x80;
while
(1)
{
for(i=0;i<8;i++)
{
P2=0xff;
P0=DSY_CODE[i];//发送段码
wei=_crol_(wei,1);
P2=wei;//发送位码
DelayMS
(2);
}
}
}
7K1-K4按键状态显示
/*名称:
K1-K4按键状态显示
说明:
K1、K2按下时LED点亮,松开时熄灭,
K3、K4按下并释放时LED点亮,再次按下并释放时熄灭;
*/
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLED1=P0^0;
sbitLED2=P0^1;
sbitLED3=P0^2;
sbitLED4=P0^3;
sbitK1=P1^0;
sbitK2=P1^1;
sbitK3=P1^2;
sbitK4=P1^3;
//延时
voidDelayMS(uintx)
{
uchari;
while(x--)for(i=0;i<120;i++);
}
//主程序
voidmain()
{
P0=0xff;
P1=0xff;
while
(1)
{
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。
*/
#include
sbitS1=P1^0;
sbitS2=P1^1;
sbitLED1=P0^0;
sbitLED2=P0^1;
//主程序
voidmain()
{
while
(1)
{
LED1=S1;
LED2=S2;
}
}
9按键发音
/*名称:
按键发音
说明:
按下不同的按键会是SOUNDER发出不同频率的声音。
本例使用延时函数实现不同频率的声音输出,以后也可使用定时器
*/
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitBEEP=P3^7;
sbitK1=P1^4;
sbitK2=P1^5;
sbitK3=P1^6;
sbitK4=P1^7;
//延时
voidDelayMS(uintx)
{
uchart;
while(x--)for(t=0;t<120;t++);
}
//按周期t发音
voidPlay(uchart)
{
uchari;
for(i=0;i<100;i++)
{
BEEP=~BEEP;
DelayMS(t);
}
BEEP=0;
}
voidmain()
{
P1=0xff;
BEEP=0;
while
(1)
{
if(K1==0)Play
(1);
if(K2==0)Play
(2);
if(K3==0)Play(3);
if(K4==0)Play(4);
}
}
10INT0中断计数
/*名称:
INT0中断计数
说明:
每次按下计数键时触发INT0中断,中断程序累加计数,计数值显示在3只数码管上,按下清零键时数码管清零
*/
#include
#defineucharunsignedchar
#defineuintunsignedint
//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]];
}
//主程序
voidmain()
{
P0=0x00;
P1=0x00;
P2=0x00;
IE=0x81;//允许INT0中断
IT0=1;//下降沿触发
while
(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状态由按键控制的效果
*/
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLED=P0^0;
//主程序
voidmain()
{
LED=1;
EA=1;
EX0=1;
IT0=1;
while
(1);
}
//INT0中断函数
voidEX_INT0()interrupt0
{
LED=~LED;//控制LED亮灭
}
12定时器控制单只LED
/*名称:
定时器控制单只LED
说明:
LED在定时器的中断例程控制下不断闪烁。
*/
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLED=P0^0;
ucharT_Count=0;
//主程序
voidmain()
{
TMOD=0x00;//定时器0工作方式0
TH0=(8192-5000)/32;//5ms定时
TL0=(8192-5000)%32;
IE=0x82;//允许T0中断
TR0=1;
while
(1);
}
//T0中断函数
voidLED_Flash()interrupt1
{
TH0=(8192-5000)/32;//恢复初值
TL0=(8192-5000)%32;
if(++T_Count==100)//0.5s开关一次LED
{
LED=~LED;
T_Count=0;
}
}
13定时器控制4个LED滚动闪烁
/*名称:
定时器控制4个LED滚动闪烁
说明:
4只LED在定时器控制下滚动闪烁。
*/
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitB1=P0^0;
sbitG1=P0^1;
sbitR1=P0^2;
sbitY1=P0^3;
uinti,j,k;
//主程序
voidmain()
{
i=j=k=0;
P0=0xff;
TMOD=0x02;//定时器0工作方式2
TH0=256-200;//200us定时
TL0=256-200;
IE=0x82;
TR0=1;//启动定时器
while
(1);
}
//T0中断函数
voidLED_Flash_and_Scroll()interrupt1
{
if(++k<35)return;//定时中断若干次后执行闪烁
k=0;
switch(i)
{
case0:
B1=~B1;break;
case1:
G1=~G1;break;
case2:
R1=~R1;break;
case3:
Y1=~Y1;break;
default:
i=0;
}
if(++j<300)return;//每次闪烁持续一段时间
j=0;
P0=0xff;//关闭显示
i++;//切换到下一个LED
}
1410s的秒表
/*名称:
10s的秒表
说明:
首次按键计时开始,再次按键暂停,第三次按键清零。
*/
#include
#defineucharunsignedchar
#defineuintunsignedint
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)
{
uchart;
while(ms--)for(t=0;t<120;t++);
}
//处理按键事件
voidKey_Event_Handle()
{
if(Key_State==0)
{
Key_Flag_Idx=(Key_Flag_Idx+1)%3;
switch(Key_Flag_Idx)
{
case1:
EA=1;ET0=1;TR0=1;break;
case2:
EA=0;ET0=0;TR0=0;break;
case0:
P0=0x3f;P2=0x3f;i=0;Second_Counts=0;
}
}
}
//主程序
voidmain()
{
P0=0x3f;//显示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;
while
(1)
{
if(Key_State!
=K1)
{
DelayMS(10);
Key_State=K1;
Key_Event_Handle();
}
}
}
//T0中断函数
voidDSY_Refresh()interrupt1
{
TH0=(65536-50000)/256;//恢复定时器0初值
TL0=(65536-50000)%256;
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控制。
*/
#include
#defineucharunsignedchar
#defineuintunsignedint
//段码
ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
ucharCount=0;
//主程序
voidmain()
{
P0=0x00;
P2=0x00;
TMOD=0x06;//计数器T0方式2
TH0=TL0=256-1;//计数值为1
ET0=1;//允许T0中断
EX0=1;//允许INT0中断
EA=1;//允许CPU中断
IP=0x02;//设置优先级,T0高于INT0
IT0=1;//INT0中断触发方式为下降沿触发
TR0=1;//启动T0
while
(1)
{
P0=DSY_CODE[Count/10];
P2=DSY_CODE[Count%10];
}
}
//T0计数器中断函数
voidKey_Counter()interrupt1
{
Count=(Count+1)%100;//因为只有两位数码管,计数控制在100以内(00~99)
}
//INT0中断函数
voidClear_Counter()interrupt0
{
Count=0;
}
16定时器控制交通指示灯
/*名称:
定时器控制交通指示灯
说明:
东西向绿灯亮5s后,黄灯闪烁,闪烁5次亮红灯,
红灯亮后,南北向由红灯变成绿灯,5s后南北向黄灯闪烁,
闪烁5次后亮红灯,东西向绿灯亮,如此往复。
*/
#include
#defineucharunsignedchar
#defineuintunsignedint
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)
{
case1:
//东西向绿灯与南北向红灯亮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;
case2:
//东西向黄灯开始闪烁,绿灯关闭
if(++Time_Count!
=8)return;
Time_Count=0;
YELLOW_A=~YELLOW_A;GREEN_A=0;
if(++Flash_Count!
=10)return;//闪烁
Flash_Count=0;
Operation_Type=3;
break;
case3:
//东西向红灯与南北向绿灯亮5s
RED_A=1;YELLOW_A=0;GREEN_A=0;
RED_B=0;YELLOW_B=0;GREEN_B=1;
if(++Time_Count!
=100)return;//5s(100*50ms)切换
Time_Count=0;
Operation_Type=4;
break;
case4:
//南北向黄灯开始闪烁,绿灯关闭
if(++Time_Count!
=8)return;
Time_Count=0;
YELLOW_B=~YELLOW_B;GREEN_A=0;
if(++Flash_Count!
=10)return;//闪烁
Fl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汽车 单片机 原理 程序 复习 教学 资料