2024年1月23日发(作者:树藻)
单片机原理及接口技术
课程设计报告
设计题目:专
班
姓
学
4位数码管字母左右移动显示
PWM控制LED灯渐亮渐暗及闪烁
蜂鸣器模拟三种声音
业:
级:
名:
号:
目录
一、概述 ............................................................... 2
二、课程设计目的及任务 ................................................. 3
1、课程设计目的 ..................................................... 3
2、课程设计任务 ..................................................... 3
三、课程设计电路 ....................................................... 4
1、元器件清单 ....................................................... 4
<1>、MCS-51单片机 ............................................... 5
<2>、89C51芯片引脚 .............................................. 5
<3>、控制线:共4根 ............................................. 5
<4>、I/O线 ...................................................... 5
<5>、数码管、LED发光二极管和蜂鸣器的控制 ........................ 6
2、电路原理图 ....................................................... 7
3、电路PCB图 ....................................................... 8
四、课程设计功能及其相应程序 ........................................... 9
1、功能 ............................................................. 9
2、程序框图 ........................................................ 10
3、程序清单 ........................................................ 11
五、课程设计总结 ...................................................... 14
1、遇到的问题 ...................................................... 14
2、心得与体会 ...................................................... 14
附录1、PWM控制LED灯渐亮渐暗及闪烁程序 ............................... 15
附录2:蜂鸣器模拟三种声音程序 ......................................... 18
1、蜂鸣器模拟枪声程序清单 .......................................... 18
2、蜂鸣器模拟救护车声程序清单 ...................................... 20
3、蜂鸣器模拟消防车声程序清单 ...................................... 21
1
一、概述
单片微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller
Unit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。单片机的成本低、体积小,运行的可靠性强、控制功能强,其非凡的嵌入式应用形态对于满足嵌入式应用需求具有独特的优势。单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。下面是单片机的主要发展趋势。单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。基于单片机的优良特点,其应用范围也很广范,单片机在智能仪器仪表中、工业测控中、计算机网络和通讯技术中、日常生活及家电中、办公自动化方面和军事等方面均有应用。
用单片在数码管上实现移位和报警是单片机的一个典型应用。通过本设计,可以充分了解单片机的工作原理,学会如何用单片机实现数据的处理,设备的控制等。制作一个移位报警器虽然简单,但你它涉及到的内容却很广泛。
2
二、课程设计目的及任务
1、课程设计目的
<1>、通过本次课程设计加深对单片机课程的全面认识和掌握,对单片机的应用做进一步了解。
<2>、通过本次课程设计将单片机软硬件结合起来,加强理论联系实际的能力。
<3>、通过本次课程设计提高学生的综合能力、动手能力、文献资料查阅能力,为毕业设计和以后工作打下一个良好的基础。
2、课程设计任务
<1>、硬件焊接:严格按照所给的PCB图或原理图焊接元件,对于有极性的元件谨慎安插,检查无误后再进行焊接。
<2>、确立课题:——4位数码管字母左右移动显示;
——PWM控制LED灯渐亮渐暗及闪烁;
——蜂鸣器模拟三种声音;
<3>、独自进行程序思考、设计并调试。
3
三、课程设计电路
1、元器件清单
电子器件
排阻
USB母头
USB数据线单排针
短路块
数码管
芯片
LED发光管电阻
瓷片电容
电解电容
晶振
按键
串口插头
插座
排线
蜂鸣器
规格 数量
9P4.7K 3
9P1K 1
3. 0 1
双公头 1
2针 1
3针 1
4针 1
双孔 1
四合一、共阴 1
STC89C51 1
ULN2003A 1
MAX232 1
ψ3、高亮红 2
1K 2
4.7K
1
0.1µ 7
220µ/25V 1
10µ/25V 1
30p 2
11.0592M 1
6mm*6mm 四脚 3
母头 1
40脚 1
16脚 2
4线 1
3线 1
无源 1
表1、元器件清单
焊件位置
1ZP、2ZP、3ZP
0ZP
JUSB
J+5
J232W
J232N
SMG
1U
3U
2U
D1、D2
5R、4R
R6
C1、C2、C3、C4、2C、3C、4C1C
C5
C12、C13
JZ
AN1、AN2、AN3
1U
2U、3U
SBK
4
<1>、MCS-51单片机
单片机是在一块硅片上集成了各种部件的微型计算机。这些部件包括中央处理器CPU、数据存储器RAM、程序存储器ROM、定时器/计数器和多种I/O接口电路。
80C51单片机分为基本型和增强型。其基本型结构特点有以下几点:8位CPU;片内振荡器及时钟电路; 32根I/O线;4K字节的ROM,可外扩为64K,128字节的RAM可再外扩64K;两个16位的定时器/计数器; 5个中断源,2个中断优先级;全双工串行口。相对于基本型,增强型片内ROM从4K字节增加到8K字节,片内RAM从128字节增加到256字节;定时/计数器从两个增加到3个;中断源由5个增加到6个。
<2>、89C51芯片引脚
单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。
(1)电源:
[1]VCC—芯片电源,接+5V。
[2]VSS—接地端。
(2)时钟:
XTAL1、XTAL2—晶体震荡电路反相输入端和输出端。
<3>、控制线:共4根
(1)ALE/PROG:地址锁存允许/片内EPROM编程脉冲。
[1]ALE功能:用来锁存P0口送出的低8位地址。
[2]PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
(2)PSEN:外ROM读选通信号。
(3)RST/VPD:复位/备用电源。
[1]RST(RESET)功能:复位信号输入端。
[2]VPD功能:在VCC掉电情况下,接备用电源。
(4)EA/VPP: 内外ROM选择/片内EPROM编程电源。
[1]EA功能:内外ROM选择端。
[2] VPP功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源VPP。
<4>、I/O线
80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。
P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。
P0口输入时需要接上拉电阻才能置1。
5
C2U14n719XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD3938373635343332227281617X1CRYSTALC14n718XTAL2R11R9RSTC333u293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.780C51
图1、80C51芯片引脚
<5>、数码管、LED发光二极管和蜂鸣器的控制
本设计采用51单片机系列STC89C51.对移位报警器进行控制。
(1)开机时,数码管处于黑屏状态,两个LED发光管全处于亮的状态,蜂鸣器属于非报警状态。
(2)第一个按键(P3.5)控制左移。
(3)第二个按键(P3.6)控制右移。
(4)第三个按键(P3.7)控制移动字符的切换。
一个基本的移位报警器主要有单片机、数码管显示器、LED发光管,蜂鸣器组成,4个数码管的段选接到单片机的P0口,位选、LED发光管,蜂鸣器接到单片机的P2口,该移位报警器在按下第一个键时自动实现右移,在按下第二个键时自动左移。
6
2、电路原理图
图1、电路原理图
<5>、把“单片机系统“区域中的P3.5—P3.7接到三个按键
<3>、把“单片机系统”区域中的P2.2通过ULN2003A用导线连接到蜂鸣器上
<4>、把“单片机系统“区域中的P2.0—P2.1通过ULN2003A用导线连接到LED二极管
<1>、把“单片机系统”区域中的P0.0—P0.7端口用排线连接到连接到“动态数码显示”区域的11、7、4、2、1、10、5、3端口上。
<2>、把“单片机系统”区域中的P2.3—P2.6端口通过ULN2003A用导线连接到“动态数码显示”区域中的8、9、12、15端口上
7
3、电路PCB图
图2、电路PCB图
8
四、课程设计功能及其相应程序
1、功能
4位数码管字母左右移动显示
程序的开始首先确定头文件,然后利用端口以及代码对变量进行定义。程序的执行是从主程序开始的,却定该移位报警器的初始状态,如果第一个键按下后,主程序将对左移子程序进行调用,进行左移显示,其中一个LED发光管置位的,会处于亮的状态,左移显示完毕后,蜂鸣器会被置位而报警。如果按下第二个键,那么将进行右移显示,其中另一个LED发光管置位的,会处于亮的状态,切换情况和同上,当然,左移和右移的顺序是可以任意的。
9
2、程序框图
开始
P0、P2置位
N
K1=0K2=0?
N
Y
Y
左移,LED灯亮 右移,LED灯K1=0? K2=0?
N
N
黑屏
蜂鸣器工作
结束
10
3、程序清单
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit K1=P3^5;
sbit K2=P3^6;
sbit BEEP=P2^2;
int q=0;
uchar display1[4]={0x44,0x9d,0xd5,0xc6};
uchar display[1][13]=
{0x0,0x0,0x80,0x80,0x80,0x9b,0x5e,0x5f,0x1a,0x80,0x80,0x0,0x0};
uchar on[4]={0xc3,0x93,0xa3,0x8b};
uchar j=0;
char code reserve [3] _at_ 0x3b;
//保留0x3b开始的3个字节
/*ms延时子函数*/
void delayms(uint ms)
{
uchar t;
while(ms--)
{
for(t = 0; t < 114; t++);
}
}
/*左移显示子函数*/
void ledplay_L(void)
{
uchar i,e;
for(i=5; i>0;i--)
{
e=i-1;
P0=display[q][i+j];
P2=on[e];
delayms(1);
}
P2=0xfb ;
}
/*右移显示子函数*/
void ledplay_R(void)
{
11
uchar i;
for(i=0; i<4; i++)
{
P0=display[q][i+j];
P2=on[i];
delayms(1);
}
P2=0xfb ;
}
/*主函数*/
void main(void)
{
uchar k,fm;
P0=0x0;
P2=0xFB;
while(1)
{
if(K1==0)
{
delayms(50);
for(j=7;j>0;j--) //左移显示
{
if(j == 5)
{
for(k=0; k<250; k++) //显示“LOVE”
ledplay_L();
}
else
{
for(k=0; k<125; k++) //一种状态显示1秒
ledplay_L();
}
}
for(fm=5;fm>0;fm--)
{
for (j = 490; j > 0; j--)
//响300ms
{
BEEP = ~BEEP; //输出频率800Hz
delayms(1); //延时310us
delayms(1); //延时310us
}}}
for (j = 490; j > 0; j--)
12
//关300ms
{
BEEP = 1; //关闭蜂鸣器
delayms(1); //延时310us
delayms(1); //延时310us
if(K2==0)
{
delayms(50);
for(j=0; j<9; j++) //右移显示
{
if(j == 4)
{
for(k=0; k<250; k++) //显示“LOVE”时,显示2秒
ledplay_R();
}
else
{
for(k=0; k<125; k++) //一种状态显示1秒
ledplay_R();
}
} for(fm=5;fm>0;fm--)
{
for (j = 490; j > 0; j--)
//响300ms
{
BEEP = ~BEEP; //输出频率800Hz
delayms(1); //延时310us
delayms(1); //延时310us
}
for (j = 490; j > 0; j--)
//关300ms
{
BEEP = 1; //关闭蜂鸣器
delayms(1); //延时310us
delayms(1); //延时310us
}}}}}}
13
五、课程设计总结
1、遇到的问题:
将初始编写的程序写入单片机,其效果基本和预想效果相同,但有一定差距,其中问题之一就是按下见后,延迟时间太长,问题之二就是移位显示之后,出现了乱码,经过多次对延迟时间以及对定义代码个数的修改后,程序如上所示,再次写入单片机,其效果和预想相同。
2、心得与体会:
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。
回顾起此次单片机课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,在接近两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会前所遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好„„
通过本设计使我学会独立分析和解决问题,养了我们运用所学知识解决实际问题的能力。使我们懂得独立思考,查资料解决设计遇到的问题。这个设计十分有意义 不但使我我获得了设计单片机程序的经验,也让我知道了理论和实际想结合的重要性,从中得知了很多书本上无法得知的知识,也积累了一定的宝贵的经验。在未来的学习生活中要不断实践,不断创新。
14
附录1、PWM控制LED灯渐亮渐暗及闪烁程序
程序清单:
#include
sbit green1=P1^6;
sbit green2=P1^7;
sbit yellow1=P1^3;
sbit yellow2=P1^4;
sbit red1=P1^0;
sbit red2=P1^2;
sbit shan=P2^0;
sbit shan2=P2^1;
void delay(int i)
{
while(--i)
{
;
}
}
void bianse1(void)//这个函数程序是控制灯渐亮渐暗
{
int i;
for(i=1;i<2000;i=i+100)
{
if(i%200==0)shan=~shan; /*经过200个PWM周期灯的亮灭交替,改变这个参数可
以改变灯的闪烁频率*/
green1=0;
green2=0;
yellow1=0;
yellow2=0;
red1=0;
red1=0;
delay(i);
green1=1;
green2=1;
yellow1=1;
yellow2=1;
red1=1;
red2=1;
delay(2000-i);//红,绿,黄一起上升
}
for(i=2000;i>0;i=i-100)
{
15
if(i%200==0)shan=~shan;
yellow1=1;
yellow2=1;
green1=1;
green2=1;
red1=1;
red2=1;
delay(2001-i);
red1=0;
red1=0;
green1=0;
green2=0;
yellow1=0;
yellow2=0;
delay(i);//红,绿,黄下降
}}
void bianse2(void)//这个函数程序是控制灯渐亮渐暗
{
int i;
for(i=1;i<2000;i=i+100)
{
if(i%200==0)shan2=~shan2;
green1=0;
green2=0;
yellow1=0;
yellow2=0;
red1=0;
red1=0;
delay(i);
green1=1;
green2=1;
yellow1=1;
yellow2=1;
red1=1;
red2=1;
delay(2000-i);//红,绿,黄一起上升
}
for(i=2000;i>0;i=i-100)
{
if(i%200==0)shan2=~shan2;
yellow1=1;
yellow2=1;
green1=1;
green2=1;
16
red1=1;
red2=1;
delay(2001-i);
red1=1;
red2=1;
green1=1;
green2=1;
yellow1=1;
yellow2=1;
delay(i);//红,绿,黄下降
}}
void shanshuo(void)//这个函数程序是控制灯闪烁
{
int i,k;
for(k=0;k<10;k++)
{
shan=0;
delay(5000);
shan=1;
delay(4000);
}
for(i=0;i<10;i++)
{
shan2=0;
delay(5000);
shan2=1;
delay(4000);
}}
void main(void)
{
shan=1;
shan2=1;
while(1)
{
bianse1();
bianse2(); /*****两个灯的交替闪烁*****/
green1=1;
green2=1;
yellow1=1;
yellow2=1;
red1=1;
red2=1;
shanshuo();
}}
17
附录2:蜂鸣器模拟三种声音程序
1、蜂鸣器模拟枪声程序清单:
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit BEEP = P2^2;
sbit K1 = P3^7;
uchar H_count,L_count;
char code reserve [3] _at_ 0x3b; //保留0x3b开始的3个字节
/*********************************************************
主程序
**********************************************************/
void main()
{
BEEP = 1;
TMOD = 0x01;
TH0 = 0xff;
TL0 = 0xa0;
H_count = 0xff;
L_count = 0xa0;
EA = 1;
ET0 = 1;
while(1)
{
while(K1);
TR0 = 1;
}
}
18
/*********************************************************
Time0中断函数
**********************************************************/
void Time0(void) interrupt 1
{
BEEP = ~BEEP;
if( L_count!=0x00 )
{
L_count--;
TH0 = H_count;
TL0 = L_count;
return;
}else H_count--;
if( H_count!=0xfc )
{
L_count--;
TH0 = H_count;
TL0 = L_count;
return;
}
else
{
H_count = 0xff;
L_count = 0xa0;
TH0 = H_count;
TL0 = L_count;
BEEP = 1;
TR0 = 0;
}
}
/**********************************************************/
19
2、蜂鸣器模拟救护车声程序清单:
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit BEEP = P2^2; //蜂鸣器输出脚
char code reserve [3] _at_ 0x3b; //保留0x3b开始的3个字节
/**********************************************************
主程序
**********************************************************/
void main(void)
{
uint m;
uchar n;
P0 = 0xff;
P2 = 0xff;
while(1)
{
P0 = 0xfe; //点亮D00
for(m=0; m<4000; m++) //输出一种频率的声音
{
for(n=0; n<75; n++); //延时245us
BEEP = ~BEEP; //取反产生频率为2KHz脉冲
}
P0 = 0x7f; //点亮D07
for(m=0; m<3000; m++) //输出另一种频率的声音
{
for(n=0; n<100; n++); //延时325us
BEEP = ~BEEP; //取反产生频率为1.5KHz脉冲
}
}
}
/**********************************************************/
20
3、蜂鸣器模拟消防车声程序清单:
#include
typedef unsigned char uchar;
typedef unsigned int uint;
uchar Count;
sbit BEEP = P2^2 ; //蜂鸣器驱动口
char code reserve [3] _at_ 0x3b; //保留0x3b开始的3个字节
/**********************************************************
延时函数
**********************************************************/
void delayms(uint ms)
{
uchar t;
while(ms--)
{
for(t=0; t<113; t++);
}
}
/********************************************************
主函数
*********************************************************/
main()
{
P0 = 0xff; //端口初始化
P1 = 0xff;
P2 = 0xff;
BEEP = 1;
Count = 0x00; //计数单元清零
TMOD = 0x01; //Timer0 方式1
TH0 = 0xfe; //定时常数
TL0 = 0x00;
EA = 1;
21
ET0 = 1;
TR0 = 1;
while(1)
{
do
{
Count++; //计数值加1
delayms(10); //延时10ms
}while(Count != 0xff); //检测由低到高是否结束
do
{
Count--; //计数值减1
delayms(10); //延时10ms
}while(Count != 0x00); //检测由高到低是否结束
}
}
/*********************************************************
Timer0中断函数
**********************************************************/
void Time0(void) interrupt 1
{
TH0 = 0xfe;
TL0 = Count;
BEEP = ~BEEP;
}
/**********************************************************/
22
2024年1月23日发(作者:树藻)
单片机原理及接口技术
课程设计报告
设计题目:专
班
姓
学
4位数码管字母左右移动显示
PWM控制LED灯渐亮渐暗及闪烁
蜂鸣器模拟三种声音
业:
级:
名:
号:
目录
一、概述 ............................................................... 2
二、课程设计目的及任务 ................................................. 3
1、课程设计目的 ..................................................... 3
2、课程设计任务 ..................................................... 3
三、课程设计电路 ....................................................... 4
1、元器件清单 ....................................................... 4
<1>、MCS-51单片机 ............................................... 5
<2>、89C51芯片引脚 .............................................. 5
<3>、控制线:共4根 ............................................. 5
<4>、I/O线 ...................................................... 5
<5>、数码管、LED发光二极管和蜂鸣器的控制 ........................ 6
2、电路原理图 ....................................................... 7
3、电路PCB图 ....................................................... 8
四、课程设计功能及其相应程序 ........................................... 9
1、功能 ............................................................. 9
2、程序框图 ........................................................ 10
3、程序清单 ........................................................ 11
五、课程设计总结 ...................................................... 14
1、遇到的问题 ...................................................... 14
2、心得与体会 ...................................................... 14
附录1、PWM控制LED灯渐亮渐暗及闪烁程序 ............................... 15
附录2:蜂鸣器模拟三种声音程序 ......................................... 18
1、蜂鸣器模拟枪声程序清单 .......................................... 18
2、蜂鸣器模拟救护车声程序清单 ...................................... 20
3、蜂鸣器模拟消防车声程序清单 ...................................... 21
1
一、概述
单片微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller
Unit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。单片机的成本低、体积小,运行的可靠性强、控制功能强,其非凡的嵌入式应用形态对于满足嵌入式应用需求具有独特的优势。单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。下面是单片机的主要发展趋势。单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。基于单片机的优良特点,其应用范围也很广范,单片机在智能仪器仪表中、工业测控中、计算机网络和通讯技术中、日常生活及家电中、办公自动化方面和军事等方面均有应用。
用单片在数码管上实现移位和报警是单片机的一个典型应用。通过本设计,可以充分了解单片机的工作原理,学会如何用单片机实现数据的处理,设备的控制等。制作一个移位报警器虽然简单,但你它涉及到的内容却很广泛。
2
二、课程设计目的及任务
1、课程设计目的
<1>、通过本次课程设计加深对单片机课程的全面认识和掌握,对单片机的应用做进一步了解。
<2>、通过本次课程设计将单片机软硬件结合起来,加强理论联系实际的能力。
<3>、通过本次课程设计提高学生的综合能力、动手能力、文献资料查阅能力,为毕业设计和以后工作打下一个良好的基础。
2、课程设计任务
<1>、硬件焊接:严格按照所给的PCB图或原理图焊接元件,对于有极性的元件谨慎安插,检查无误后再进行焊接。
<2>、确立课题:——4位数码管字母左右移动显示;
——PWM控制LED灯渐亮渐暗及闪烁;
——蜂鸣器模拟三种声音;
<3>、独自进行程序思考、设计并调试。
3
三、课程设计电路
1、元器件清单
电子器件
排阻
USB母头
USB数据线单排针
短路块
数码管
芯片
LED发光管电阻
瓷片电容
电解电容
晶振
按键
串口插头
插座
排线
蜂鸣器
规格 数量
9P4.7K 3
9P1K 1
3. 0 1
双公头 1
2针 1
3针 1
4针 1
双孔 1
四合一、共阴 1
STC89C51 1
ULN2003A 1
MAX232 1
ψ3、高亮红 2
1K 2
4.7K
1
0.1µ 7
220µ/25V 1
10µ/25V 1
30p 2
11.0592M 1
6mm*6mm 四脚 3
母头 1
40脚 1
16脚 2
4线 1
3线 1
无源 1
表1、元器件清单
焊件位置
1ZP、2ZP、3ZP
0ZP
JUSB
J+5
J232W
J232N
SMG
1U
3U
2U
D1、D2
5R、4R
R6
C1、C2、C3、C4、2C、3C、4C1C
C5
C12、C13
JZ
AN1、AN2、AN3
1U
2U、3U
SBK
4
<1>、MCS-51单片机
单片机是在一块硅片上集成了各种部件的微型计算机。这些部件包括中央处理器CPU、数据存储器RAM、程序存储器ROM、定时器/计数器和多种I/O接口电路。
80C51单片机分为基本型和增强型。其基本型结构特点有以下几点:8位CPU;片内振荡器及时钟电路; 32根I/O线;4K字节的ROM,可外扩为64K,128字节的RAM可再外扩64K;两个16位的定时器/计数器; 5个中断源,2个中断优先级;全双工串行口。相对于基本型,增强型片内ROM从4K字节增加到8K字节,片内RAM从128字节增加到256字节;定时/计数器从两个增加到3个;中断源由5个增加到6个。
<2>、89C51芯片引脚
单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。
(1)电源:
[1]VCC—芯片电源,接+5V。
[2]VSS—接地端。
(2)时钟:
XTAL1、XTAL2—晶体震荡电路反相输入端和输出端。
<3>、控制线:共4根
(1)ALE/PROG:地址锁存允许/片内EPROM编程脉冲。
[1]ALE功能:用来锁存P0口送出的低8位地址。
[2]PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
(2)PSEN:外ROM读选通信号。
(3)RST/VPD:复位/备用电源。
[1]RST(RESET)功能:复位信号输入端。
[2]VPD功能:在VCC掉电情况下,接备用电源。
(4)EA/VPP: 内外ROM选择/片内EPROM编程电源。
[1]EA功能:内外ROM选择端。
[2] VPP功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源VPP。
<4>、I/O线
80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。
P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。
P0口输入时需要接上拉电阻才能置1。
5
C2U14n719XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD3938373635343332227281617X1CRYSTALC14n718XTAL2R11R9RSTC333u293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.780C51
图1、80C51芯片引脚
<5>、数码管、LED发光二极管和蜂鸣器的控制
本设计采用51单片机系列STC89C51.对移位报警器进行控制。
(1)开机时,数码管处于黑屏状态,两个LED发光管全处于亮的状态,蜂鸣器属于非报警状态。
(2)第一个按键(P3.5)控制左移。
(3)第二个按键(P3.6)控制右移。
(4)第三个按键(P3.7)控制移动字符的切换。
一个基本的移位报警器主要有单片机、数码管显示器、LED发光管,蜂鸣器组成,4个数码管的段选接到单片机的P0口,位选、LED发光管,蜂鸣器接到单片机的P2口,该移位报警器在按下第一个键时自动实现右移,在按下第二个键时自动左移。
6
2、电路原理图
图1、电路原理图
<5>、把“单片机系统“区域中的P3.5—P3.7接到三个按键
<3>、把“单片机系统”区域中的P2.2通过ULN2003A用导线连接到蜂鸣器上
<4>、把“单片机系统“区域中的P2.0—P2.1通过ULN2003A用导线连接到LED二极管
<1>、把“单片机系统”区域中的P0.0—P0.7端口用排线连接到连接到“动态数码显示”区域的11、7、4、2、1、10、5、3端口上。
<2>、把“单片机系统”区域中的P2.3—P2.6端口通过ULN2003A用导线连接到“动态数码显示”区域中的8、9、12、15端口上
7
3、电路PCB图
图2、电路PCB图
8
四、课程设计功能及其相应程序
1、功能
4位数码管字母左右移动显示
程序的开始首先确定头文件,然后利用端口以及代码对变量进行定义。程序的执行是从主程序开始的,却定该移位报警器的初始状态,如果第一个键按下后,主程序将对左移子程序进行调用,进行左移显示,其中一个LED发光管置位的,会处于亮的状态,左移显示完毕后,蜂鸣器会被置位而报警。如果按下第二个键,那么将进行右移显示,其中另一个LED发光管置位的,会处于亮的状态,切换情况和同上,当然,左移和右移的顺序是可以任意的。
9
2、程序框图
开始
P0、P2置位
N
K1=0K2=0?
N
Y
Y
左移,LED灯亮 右移,LED灯K1=0? K2=0?
N
N
黑屏
蜂鸣器工作
结束
10
3、程序清单
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit K1=P3^5;
sbit K2=P3^6;
sbit BEEP=P2^2;
int q=0;
uchar display1[4]={0x44,0x9d,0xd5,0xc6};
uchar display[1][13]=
{0x0,0x0,0x80,0x80,0x80,0x9b,0x5e,0x5f,0x1a,0x80,0x80,0x0,0x0};
uchar on[4]={0xc3,0x93,0xa3,0x8b};
uchar j=0;
char code reserve [3] _at_ 0x3b;
//保留0x3b开始的3个字节
/*ms延时子函数*/
void delayms(uint ms)
{
uchar t;
while(ms--)
{
for(t = 0; t < 114; t++);
}
}
/*左移显示子函数*/
void ledplay_L(void)
{
uchar i,e;
for(i=5; i>0;i--)
{
e=i-1;
P0=display[q][i+j];
P2=on[e];
delayms(1);
}
P2=0xfb ;
}
/*右移显示子函数*/
void ledplay_R(void)
{
11
uchar i;
for(i=0; i<4; i++)
{
P0=display[q][i+j];
P2=on[i];
delayms(1);
}
P2=0xfb ;
}
/*主函数*/
void main(void)
{
uchar k,fm;
P0=0x0;
P2=0xFB;
while(1)
{
if(K1==0)
{
delayms(50);
for(j=7;j>0;j--) //左移显示
{
if(j == 5)
{
for(k=0; k<250; k++) //显示“LOVE”
ledplay_L();
}
else
{
for(k=0; k<125; k++) //一种状态显示1秒
ledplay_L();
}
}
for(fm=5;fm>0;fm--)
{
for (j = 490; j > 0; j--)
//响300ms
{
BEEP = ~BEEP; //输出频率800Hz
delayms(1); //延时310us
delayms(1); //延时310us
}}}
for (j = 490; j > 0; j--)
12
//关300ms
{
BEEP = 1; //关闭蜂鸣器
delayms(1); //延时310us
delayms(1); //延时310us
if(K2==0)
{
delayms(50);
for(j=0; j<9; j++) //右移显示
{
if(j == 4)
{
for(k=0; k<250; k++) //显示“LOVE”时,显示2秒
ledplay_R();
}
else
{
for(k=0; k<125; k++) //一种状态显示1秒
ledplay_R();
}
} for(fm=5;fm>0;fm--)
{
for (j = 490; j > 0; j--)
//响300ms
{
BEEP = ~BEEP; //输出频率800Hz
delayms(1); //延时310us
delayms(1); //延时310us
}
for (j = 490; j > 0; j--)
//关300ms
{
BEEP = 1; //关闭蜂鸣器
delayms(1); //延时310us
delayms(1); //延时310us
}}}}}}
13
五、课程设计总结
1、遇到的问题:
将初始编写的程序写入单片机,其效果基本和预想效果相同,但有一定差距,其中问题之一就是按下见后,延迟时间太长,问题之二就是移位显示之后,出现了乱码,经过多次对延迟时间以及对定义代码个数的修改后,程序如上所示,再次写入单片机,其效果和预想相同。
2、心得与体会:
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。
回顾起此次单片机课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,在接近两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会前所遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好„„
通过本设计使我学会独立分析和解决问题,养了我们运用所学知识解决实际问题的能力。使我们懂得独立思考,查资料解决设计遇到的问题。这个设计十分有意义 不但使我我获得了设计单片机程序的经验,也让我知道了理论和实际想结合的重要性,从中得知了很多书本上无法得知的知识,也积累了一定的宝贵的经验。在未来的学习生活中要不断实践,不断创新。
14
附录1、PWM控制LED灯渐亮渐暗及闪烁程序
程序清单:
#include
sbit green1=P1^6;
sbit green2=P1^7;
sbit yellow1=P1^3;
sbit yellow2=P1^4;
sbit red1=P1^0;
sbit red2=P1^2;
sbit shan=P2^0;
sbit shan2=P2^1;
void delay(int i)
{
while(--i)
{
;
}
}
void bianse1(void)//这个函数程序是控制灯渐亮渐暗
{
int i;
for(i=1;i<2000;i=i+100)
{
if(i%200==0)shan=~shan; /*经过200个PWM周期灯的亮灭交替,改变这个参数可
以改变灯的闪烁频率*/
green1=0;
green2=0;
yellow1=0;
yellow2=0;
red1=0;
red1=0;
delay(i);
green1=1;
green2=1;
yellow1=1;
yellow2=1;
red1=1;
red2=1;
delay(2000-i);//红,绿,黄一起上升
}
for(i=2000;i>0;i=i-100)
{
15
if(i%200==0)shan=~shan;
yellow1=1;
yellow2=1;
green1=1;
green2=1;
red1=1;
red2=1;
delay(2001-i);
red1=0;
red1=0;
green1=0;
green2=0;
yellow1=0;
yellow2=0;
delay(i);//红,绿,黄下降
}}
void bianse2(void)//这个函数程序是控制灯渐亮渐暗
{
int i;
for(i=1;i<2000;i=i+100)
{
if(i%200==0)shan2=~shan2;
green1=0;
green2=0;
yellow1=0;
yellow2=0;
red1=0;
red1=0;
delay(i);
green1=1;
green2=1;
yellow1=1;
yellow2=1;
red1=1;
red2=1;
delay(2000-i);//红,绿,黄一起上升
}
for(i=2000;i>0;i=i-100)
{
if(i%200==0)shan2=~shan2;
yellow1=1;
yellow2=1;
green1=1;
green2=1;
16
red1=1;
red2=1;
delay(2001-i);
red1=1;
red2=1;
green1=1;
green2=1;
yellow1=1;
yellow2=1;
delay(i);//红,绿,黄下降
}}
void shanshuo(void)//这个函数程序是控制灯闪烁
{
int i,k;
for(k=0;k<10;k++)
{
shan=0;
delay(5000);
shan=1;
delay(4000);
}
for(i=0;i<10;i++)
{
shan2=0;
delay(5000);
shan2=1;
delay(4000);
}}
void main(void)
{
shan=1;
shan2=1;
while(1)
{
bianse1();
bianse2(); /*****两个灯的交替闪烁*****/
green1=1;
green2=1;
yellow1=1;
yellow2=1;
red1=1;
red2=1;
shanshuo();
}}
17
附录2:蜂鸣器模拟三种声音程序
1、蜂鸣器模拟枪声程序清单:
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit BEEP = P2^2;
sbit K1 = P3^7;
uchar H_count,L_count;
char code reserve [3] _at_ 0x3b; //保留0x3b开始的3个字节
/*********************************************************
主程序
**********************************************************/
void main()
{
BEEP = 1;
TMOD = 0x01;
TH0 = 0xff;
TL0 = 0xa0;
H_count = 0xff;
L_count = 0xa0;
EA = 1;
ET0 = 1;
while(1)
{
while(K1);
TR0 = 1;
}
}
18
/*********************************************************
Time0中断函数
**********************************************************/
void Time0(void) interrupt 1
{
BEEP = ~BEEP;
if( L_count!=0x00 )
{
L_count--;
TH0 = H_count;
TL0 = L_count;
return;
}else H_count--;
if( H_count!=0xfc )
{
L_count--;
TH0 = H_count;
TL0 = L_count;
return;
}
else
{
H_count = 0xff;
L_count = 0xa0;
TH0 = H_count;
TL0 = L_count;
BEEP = 1;
TR0 = 0;
}
}
/**********************************************************/
19
2、蜂鸣器模拟救护车声程序清单:
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit BEEP = P2^2; //蜂鸣器输出脚
char code reserve [3] _at_ 0x3b; //保留0x3b开始的3个字节
/**********************************************************
主程序
**********************************************************/
void main(void)
{
uint m;
uchar n;
P0 = 0xff;
P2 = 0xff;
while(1)
{
P0 = 0xfe; //点亮D00
for(m=0; m<4000; m++) //输出一种频率的声音
{
for(n=0; n<75; n++); //延时245us
BEEP = ~BEEP; //取反产生频率为2KHz脉冲
}
P0 = 0x7f; //点亮D07
for(m=0; m<3000; m++) //输出另一种频率的声音
{
for(n=0; n<100; n++); //延时325us
BEEP = ~BEEP; //取反产生频率为1.5KHz脉冲
}
}
}
/**********************************************************/
20
3、蜂鸣器模拟消防车声程序清单:
#include
typedef unsigned char uchar;
typedef unsigned int uint;
uchar Count;
sbit BEEP = P2^2 ; //蜂鸣器驱动口
char code reserve [3] _at_ 0x3b; //保留0x3b开始的3个字节
/**********************************************************
延时函数
**********************************************************/
void delayms(uint ms)
{
uchar t;
while(ms--)
{
for(t=0; t<113; t++);
}
}
/********************************************************
主函数
*********************************************************/
main()
{
P0 = 0xff; //端口初始化
P1 = 0xff;
P2 = 0xff;
BEEP = 1;
Count = 0x00; //计数单元清零
TMOD = 0x01; //Timer0 方式1
TH0 = 0xfe; //定时常数
TL0 = 0x00;
EA = 1;
21
ET0 = 1;
TR0 = 1;
while(1)
{
do
{
Count++; //计数值加1
delayms(10); //延时10ms
}while(Count != 0xff); //检测由低到高是否结束
do
{
Count--; //计数值减1
delayms(10); //延时10ms
}while(Count != 0x00); //检测由高到低是否结束
}
}
/*********************************************************
Timer0中断函数
**********************************************************/
void Time0(void) interrupt 1
{
TH0 = 0xfe;
TL0 = Count;
BEEP = ~BEEP;
}
/**********************************************************/
22