单片机课程设计Word格式.docx
《单片机课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《单片机课程设计Word格式.docx(28页珍藏版)》请在冰点文库上搜索。
//将P15位定义为P1.5引脚
sbitP16=P1^6;
//将P16位定义为P1.6引脚
sbitP17=P1^7;
//将P17位定义为P1.7引脚
sbitP05=P0^5;
sbitP06=P0^6;
sbitP07=P0^7;
sbitP36=P3^6;
sbitP37=P3^7;
sbitP35=P3^5;
unsignedcharcodeledcode[10]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,
};
//数字0~9的段码
unsignedcharcodesaom[4]={0xfe,0xfd,0xfb,0xf7};
unsignedcharkeyval;
//定义变量储存按键值
voiddelay1ms(unsignedintms)//延时子程序
{
unsignedchari;
while(ms--)
{
for(i=0;
i<
120;
i++);
}
}
voidled_delay(void)
unsignedcharj;
for(j=0;
j<
200;
j++)
;
}
voidshui(unsignedcharxx)
{
switch(xx){
case1:
P2=0x7f;
P3=0xff;
delay1ms(500);
P2=0xbf;
P2=0xdf;
P2=0xef;
P2=0xf7;
P2=0xfb;
P2=0xfd;
P2=0xfe;
P2=0xff;
P3=0xdf;
P3=0xef;
P3=0xf7;
P3=0xfb;
break;
case2:
P2=0xff;
P2=0xfb;
P2=0xf7;
break;
defult:
}}
voiddisplay(unsignedchark)
{unsignedcharm;
P1=ledcode[k%10];
//显示十位
P0=saom[0];
//点亮数码管DS6
led_delay();
//动态扫描延时
//动态扫描延时
P0=0x00;
//显示个位
P0=saom[1];
//点亮数码管DS7
P0=saom[2];
P0=saom[3];
//点亮数码管DS7
voiddelay20ms(void)
unsignedchari,j;
for(i=0;
i<
100;
i++)
60;
voidmain(void)
{P2=0x00;
P3=0xc0;
delay1ms(2000);
P2=0x00;
P0=0x0f;
EA=1;
//开总中断
ET0=1;
//定时器T0中断允许
TMOD=0x01;
//使用定时器T0的模式1
TH0=0xee;
//定时器T0的高8位赋初值
TL0=0x00;
TR0=1;
//启动定时器T0
keyval=0x00;
//按键值初始化为0
while
(1)//无限循环
{
shui(keyval);
}
voidtime0_interserve(void)interrupt1using1//定时器T0的中断编号为1,使用第一组寄存器
{unsignedcharsao=0;
TR0=0;
//关闭定时器T0
P3=0x3f;
//所有行线置为低电平“0”,所有列线置为高电平“1”
P0=0xe0;
if(P0|0x0f!
=0xef)//列线中有一位为低电平“0”,说明有键按下
delay20ms();
//延时一段时间、软件消抖
=0xef)//确实有键按下
{P0=0xff;
P36=0;
//第一行置为低电平“0”(P1.0输出低电平“0”)
if(P05==0)//如果检测到接P1.4引脚的列线为低电平“0”
keyval=1;
//可判断是S1键被按下
if(P06==0)//如果检测到接P1.5引脚的列线为低电平“0”
keyval=2;
//可判断是S2键被按下
if(P07==0)//如果检测到接P1.6引脚的列线为低电平“0”
keyval=3;
//可判断是S3键被按下
P37=0;
//第二行置为低电平“0”(P1.1输出低电平“0”)
//可判断是S5键被按下
//可判断是S6键被按下
//可判断是S7键被按下
sao=sao+1;
if(sao==4){sao=0;
P0=saom[sao];
switch(keyval)
case1:
switch(sao){case0:
P1=ledcode[0];
case2:
case3:
P1=ledcode[1];
switch(sao){case0:
P1=ledcode[2];
case3:
P1=ledcode[3];
}
//开启定时器T0
//定时器T0的高8位赋初值
二、定时器或实时时钟实验
1、实验目的
1)数码管动态显示技术
2)定时器的应用
3)按键功能定义
1)通过按键可以设定定时时间,启动定时器,定时时间到,让12个发光二极管闪烁,完成定时器功能。
2)实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)。
上述二个功能至少完成一种功能。
1设计功能:
利用89C52RC单片机设计定时器,将按键定义为设置键、上翻键、下翻键、开始/取消键。
数码管显当前设置时间与正在计时时间。
可通过按键在1-99秒之间设置,按开始键启动计时,计时完成后驱动蜂鸣器发声提示。
1LED是发光二极管的英文缩写,LED显示器是由发光二极管构成的,它在单片机中的应用非常普遍。
通常所说的LED显示器由7个发光二极管组成,其排列形状如图所示。
此外,显示器中还有一个圆点型发光二极管以dp表示,用于小数点表示。
通过七个发光二极管亮暗的不同组合,可以显示多种数字、字母以及其它符号。
LED显示中的发光二极管共有两种连接方法:
2共阳极接法:
把发光二极管的阳极连在一起构成公共阳极。
使用时公共阳极接+5V。
这样阴极端输入低电平的段发光二极管就导通点亮,而输入高电平的则不亮。
3共阴极接法:
把发光二极管的阴极连在一起构成公共阴极。
使用时公共阴极接地。
这样阳极端输入高电平的段发光二极管就导通点亮,而输入低电平的则不亮。
4控制数码管驱动级的控制电路有静态式和动态式两类:
5静态驱动:
它是指每个数码管都要用一个译码器译码驱动。
6动态驱动:
它是所的数码管使用一个专门的译码驱动器,使各位数码管逐个轮流显示,它的扫描速度极快,因此显示效果与静态驱动相同。
7采用动态数码管显示,可以大幅度地降低硬件成本和电源的功耗,因为某一时刻只有一个数码管工作,就是所谓的分时显示,显示所需要的硬件电路可分时复用。
共阴极共阳极符号与引脚
如表1为共阳极与共阴极的代码表
2设计目的
1)注重培养综合运用所学知识、独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训练;
2)了解89C52RC各个引脚功能,工作方式,计数/定时,I/O口,中断等的相关原理,并巩固学习嵌入式的相关内容知识;
3)通过软硬件设计实现定时器功能。
1.3设计任务
1)查阅相关文献资料,熟悉89C52RC芯片;
2)总体设计方案规划;
3)系统硬件设计,芯片设计及其各模块间的连线;
4)系统软件设计,用汇编语言编写程序,实现其定时器功能;
5)设计心得体会及总结。
2原理介绍
流程图
程序:
时钟c语言程序:
#include<
unsignedchartm=0,tf=60,o=0,u;
voiddisplay()
P1=ledcode[tf/10];
P1=ledcode[tf%10];
P1=ledcode[tm/10];
P1=ledcode[tm%10];
TH0=0x4c;
{
display();
//调用按键值的数码管显示子程序
if(tf==0&
tm==0)
for(u=0;
u<
49;
u=u+1)
P2=~P2;
P3=~P2;
delay20ms;
delay20ms;
voidtime0_interserve(void)interrupt1using1//定时器T0的中断编号为1,使用第一组寄存器
o=o+1;
if(o==20){
o=0;
tm=tm-1;
if(tm==-1)
{tm=59;
tf=tf-1;
if(tf==-1)
{tf=59;
}}}
P0=0xef;
=0xef){//列线中有一位为低电平“0”,说明有键按下
if(P05==0){//如果检测到接P1.4引脚的列线为低电平“0”
if(tf>
9){tf=tf-10;
while(P05==0);
}}//可判断是S5键被按下
if(P06==0){//如果检测到接P1.5引脚的列线为低电平“0”
0){tf=tf-1;
while(P06==0);
}}//可判断是S6键被按下
if(P07==0){//如果检测到接P1.6引脚的列线为低电平“0”
tf=60;
tm=0;
while(P07==0);
}//可判断是S7键被按下
}}
三、双机通信实验
UART串行通信接口技术应用
用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。
单片机串口原理图
串行口控制寄存器SCON(98H):
SCON:
SM0,SM1:
串行口4种工作方式的选择位。
00方式0:
8位移位寄存器,波特率固定为fosc/12
01方式1:
10位异步收发(1+8+1位),
波特率可变,按公式计算
10方式2:
11位异步收发(1+8+1+1位),
波特率固定=foscx1/32或1/64
11方式3:
波特率可变,按公式计算
RI,TI:
串行口收/发数据申请中断标志位
=1申请中断;
=0不申请中断
在方式0中,第8位发送结束时,由硬件置位。
在其他方式的发送停止位之前,由硬件置位。
TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询方法获得数据已发送完毕的信息,或者也可由中断的方式来发送下一个数据。
TI必须由软件清0
RI和TI道理相同也需要由软件清0
RB8:
在方式2、3中,是收到的第9位数据。
在多机通信中,用作区别地址帧/数据帧的
标志。
(奇偶校验)
TB8:
方式2、3中,是要发送的第9位数据。
多机通信中,TB8=0表示发送的是数据;
TB8=1表示发送的是地址。
REN:
串行口接收允许控制位
=1表示允许接收;
=0禁止接收。
程序设计(单片机与上位机通信):
unsignedchartmp;
voidmain(void){
P1=0xff;
TMOD=0x20;
//定时器1工作于8位自动重载模式,用于产生波特率
TH1=0xFD;
//波特率9600
TL1=0xFD;
SCON=0x50;
//设定串行口工作方式
PCON&
=0xef;
//波特率不倍增
TR1=1;
//启动定时器1
IE=0x0;
while
(1)
四:
交通灯实验
1)按键、数码管、发光二极管综合应用编程技术
2)数据存储于EEPROM的技术(也可以不使用)
3)定时中断技术
4)按键中断技术
1)对每个路口(主干道、次干道)的绿灯时间,及黄灯时间的设定。
2)设定参数掉电后不丢失(如果不使用EEPROM,此功能可以不实现)。
3)紧急按键功能,当按下该键时,所有路口变成红灯,相当于交警指挥特殊车辆通过。
再按该键,恢复正常显示。
一、设计目的
1、通过单片机课程设计,熟练掌握汇编语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力。
2、通过交通信号灯控制系统的设计,掌握定时/计数器及中断的使用方法,和简单程序的编写,最终提高我们的逻辑抽象能力。
二、设计任务和要求
任务:
设计一个能够控制十二盏交通信号灯的模拟系统
要求:
利用单片机的定时器定时,令十字路口的红绿灯交替点亮和熄灭,并用LED灯显示倒计时间。
1、东西绿灯亮,南北红灯亮2、黄灯亮3、东西红灯亮,南北绿灯亮
三、设计原理分析
1、首先了解实际交通灯的变化情况和规律。
假设一个十字路口如上图所以,为东南西北走向。
初始状态0:
为东西绿灯亮,南北红灯亮;
然后转状态1:
东西绿灯亮黄灯亮,南北红灯亮黄灯亮;
过后转状态2:
东西红灯亮,南北绿灯亮;
再转状态3:
东西红灯亮黄灯亮,南北绿灯亮黄灯亮。
一段时间后,又循环至状态0。
中间可通过中断按钮产生中断,跳入中断程序执行中断。
列出交通信号灯的状态表如下:
(其中,1代表灯亮,0代表灯灭)
状态
北
西
南
东
绿黄红
001
100