单片机课程设计自动滚动广告牌设计Word格式文档下载.docx

上传人:b****6 文档编号:20042615 上传时间:2023-01-16 格式:DOCX 页数:21 大小:465.88KB
下载 相关 举报
单片机课程设计自动滚动广告牌设计Word格式文档下载.docx_第1页
第1页 / 共21页
单片机课程设计自动滚动广告牌设计Word格式文档下载.docx_第2页
第2页 / 共21页
单片机课程设计自动滚动广告牌设计Word格式文档下载.docx_第3页
第3页 / 共21页
单片机课程设计自动滚动广告牌设计Word格式文档下载.docx_第4页
第4页 / 共21页
单片机课程设计自动滚动广告牌设计Word格式文档下载.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

单片机课程设计自动滚动广告牌设计Word格式文档下载.docx

《单片机课程设计自动滚动广告牌设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计自动滚动广告牌设计Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。

单片机课程设计自动滚动广告牌设计Word格式文档下载.docx

(1)选用ATMEL公司的AT89C51单片机。

·

与MCS-51兼容

4K字节可编程FLASH存储器

寿命:

1000写/擦循环

数据保留时间:

10年

全静态工作:

0Hz-24MHz

三级程序存储器锁定

128×

8位内部RAM

32可编程I/O线

两个16位定时器/计数器

5个中断源

可编程串行通道

低功耗的闲置和掉电模式

片内振荡器和时钟电路

(2)通过I/O口直接控制广告彩页的切换,通过程序实现显示延时,通过debug确定准确延时时间长度。

(3)通过扫描按键实现监测自动与手动、正转与反转按键状态。

由于选用单片机没有足够的外部中断,且扫描按键的方法更加简洁,故此处违背了设计任务书,希望可以得到谅解。

(4)利用比较器设计光感电路(仿真中使用电位器模拟光敏电阻),提供光线信号。

通过I/O口输出信号,控制背景灯驱动器(仿真中使用74HC573驱动一拍黄色LED小灯模拟),进而控制背景灯开关。

(5)利用L298驱动器驱动直流电机,通过I/O口信号控制L298输出信号,进而控制电机正转,反转及停转的状态。

(6)通过I/O口信号直接控制“手动/自动”状态显示指示灯亮灭。

(7)使用四个行程开关(仿真中使用按键模拟)在自动状态下控制电机正转,反转及停转。

通过扫描按键的方式实现监测行程开关状态。

(8)设计外部晶振及复位电路。

(9)由于以上任务较简单,较早完成了任务,经过组内商议,为挑战一下自己,决定添加温度检测并显示的功能。

通过DS18b20芯片完成温度检测,A/D转换,使用串口通信单片机将检测的温度读取,经数据转换,并通过I/O口显示在四位共阴极数码管上。

任务分工

分四个工段:

独立模块功能单独设计电路、程序,仿真;

各模块整合,调试,仿真;

修整,优化,添加扩展及附加功能;

整理产品说明书、课程报告及其他材料。

分三个小组:

任务分工表:

按键模块

电机驱动模块

行程开关监测

自动展示程序

光感模块

背景灯模块

电路原理图

仿真电路图

程序整合

程序调试

提前整理产品说明书

添加扩展及附加功能

修整,优化

整理产品说明书,确定初稿

修正产品说明书,整理课程报告及其他材料。

电路原理图及各器件原理介绍

(1)整体电路图展示

(2)各模块原理介绍

1.光感比较电路

光线越强RV1越小,U3越小,当小到一定值(设定5KΩ)U3<

U2。

通过比较器比较U2、U3,U3<

U2时输出0,控制背景灯关,U3>

U2时输出1,控制背景灯开。

2.DS18b20温度传感器

DSl820数字温度计提供9位(二进制)温度读数,指示器件的温度。

信息经过单线接口送入DSl820或从DSl820送出,因此从主机CPU到DSl820仅需一条线(和地线),DSl820的电源可以由数据线本身提供而不需要外部电源。

DSl820的测量范围从-55到+125增量值为0.5可在ls(典型值)内把温度变换成数字。

每一个DSl820包括一个唯一的64位长的序号,该序号值存放在DSl820内部的ROM(只读存贮器)中,开始8位是产品类型编码(DSl820编码均为10H)接着的48位是每个器件唯一的序号,最后8位是前面56位的CRC(循环冗余校验)码DSl820中还有用于贮存测得的温度值的两个8位存贮器RAM,编号为0号和1号,1号存贮器存放温度值的符号如果温度为负,则1号存贮器8位全为1,否则全为0,0号存贮器用于存放温度值的补码LSB(最低位)的1表示0.5摄氏度,将存贮器中的二进制数求补再转换成十进制数,并除以2就得到被测温度值(-55~125摄氏度)。

3.L298芯片驱动电机

L298N为SGS-THOMSONMicroelectronics所出产的双全桥步进电机专用驱动芯片(DualFull-BridgeDriver),内部包含4信道逻辑驱动电路,可同时驱动2个减速直流电机,内含二个H-Bridge的高电压、大电流双全桥式驱动器,接收标准TTL逻辑准位信号,可驱动46V、2A以下的步进电机,且可以直接透过电源来调节输出电压;

此芯片可直接由单片机的IO端口来提供模拟时序信号,控制转速。

OUTl、OUT2和OUT3、OUT4之间分别接2个电机;

input1~input4输入控制电位来控制电机的正反转;

Enable则控制电机停转。

4.四位共阴极数码管的驱动

74HC573芯片驱动数码管显示接口,通过单片机I/O接口直接控制数码管位选。

共阴极数码管真值表

十六

进制

0x3f

0x06

0x5b

0x4f

0x66

0x6d

0x7d

0x07

0x7f

0x6f

0x00

0x40

显示符号

1

2

3

4

5

6

7

8

9

-

74HC573为八进制3态非反转透明锁存器,输入是和标准CMOS输出兼容的;

加上拉电阻,他们能和LS/ALSTTL输出兼容。

当锁存使能端LE为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。

当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。

5.独立按键模块

按键一端接地,另一端与单片机I/O口相连并外接上拉电阻。

按键按下时I/O口由高电位转为低点位,经单片机读取引脚信号,将按键状态输入。

6.外部晶振电路

51单片机

单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTAL1为输入端,XTAL2为输出端。

两个引脚间跨接晶体振荡器与微调电容组成并联谐振电路,构成一个自激振荡器为内部时钟提供振荡时钟。

振荡期的频率主要取决于晶体的振荡频率,一般晶体可在1.2MHz~12MHz之间任选。

电容C1,C2通常取30pF左右。

7.复位电路

51系列单片机系统通常有上电复位和按键复位两种方式。

最简单的一种上电复位及按键复位电路图如上图所示。

上电后,由于电容充电,使RST持续一段时间的高电平,完成复位操作;

当单片机处于运行中或者死锁时,按下“复位”按钮,也可以使单片机进入复位状态。

程序模块

1.数码管动态扫描函数

voidrefresh_led()

{

P2=Disp_Tab[a[0]];

P1=dispbit[0];

P1=0xff;

//每个数码管按负值、打开、关闭的顺序

P2=Disp_Tab[a[1]];

P1=dispbit[1];

P2=Disp_Tab[a[2]]|0x80;

P1=dispbit[2];

P2=Disp_Tab[a[3]];

P1=dispbit[3];

}

每个数码管依次按负值、打开、关闭的顺序受控,从而实现动态扫描。

2.温度转换模块程序

voidstart_temp_sensor(void)

DS18b20_reset();

write_byte(0xCC);

//发SkipROM命令

write_byte(0x44);

//发转换命令

}

/**读存温度*/

voidread_temp()

uint8temp_data[2];

//读出温度暂放

uint16temp=0,c;

doublewd;

start_temp_sensor();

delay_ms(100);

//复位

//发SkipROM命令

write_byte(0xBE);

//发读命令

temp_data[0]=read_byte();

//温度低8位

temp_data[1]=read_byte();

//温度高8位

temp=temp_data[1];

//一下三步将温度高八位低八位整合

temp<

<

=8;

temp|=temp_data[0];

if(temp_data[1]&

0xf0)//判断温度是否为负

{

temp=(~temp)+1;

//为负时,取反加一

wd=temp*0.0625;

//转为摄氏温度,0.0625为温感芯片储存精度

a[0]=11;

//为负时,第一个数码管显示负号

}

else

a[0]=10;

//为正时,第一个数码管不显示

c=wd;

//将摄氏温度转为整型

a[2]=c%10;

//第三个数码管显示个位

a[1]=c/10%10;

//第二个数码管显示十位

c=wd*10;

a[3]=c%10;

//第四个数码管显示小数位

3.背景灯控制模块程序

voidbeijingdeng()

if(ggxh)led_bjd=1;

elseled_bjd=0;

光感信号为高电平时,背景灯控制引脚输出高电平,控制背景灯关;

光感信号为低电平时,背景灯控制引脚输出低电平,控制背景灯亮。

4.自动控制模块程序

voidzidong()

led_zs=0;

//点亮自动/手动指示灯

while

(1)

if(i)//判断电机正反转状态,并控制电机正反转

{

dj_zz=1;

dj_fz=0;

}

else

dj_zz=0;

dj_fz=1;

if(kg1==0)//监测行程开关1状态

//关闭电机并延时

delay_ms(100);

i++;

//控制电机下次启动换向

read_temp();

//读存温度信息

}

if(kg2==0)//监测行程开关2状态

if(kg3==0)//监测行程开关3状态

if(kg4==0)//监测行程开关4状态

i--;

beijingdeng();

//调入背景灯控制函数,监测感光信号

refresh_led();

//显示温度信息

if(aj_qh==0)//监测自动/手动切换_按键状态

//监测到切换到手动状态时,电机停转

break;

//跳出自动控制循环,进入主函数

自动控制状态下,手动/自动指示灯控制引脚输出为低电平,指示灯亮;

判断电机正反转状态,并控制电机正反转;

监测行程开关1状态,若为低电平,则关闭电机,延时并控制电机下次启动换向;

若为高电平,则不变。

然后读存温度信息并依次监测行程开关2、3状态,若为低电平,则关闭电机,延时并读存温度信息。

然后监测行程开关4状态,若为低电平,则关闭电机,延时并控制电机下次启动换向。

最后监测自动/手动切换_按键状态,若为低电平,则电机停转,跳出自动控制循环,进入主函数。

5.手动控制模块程序

voidshoudong()//手动控制子函数

led_zs=1;

//关闭自动/手动指示灯

while

(1)

if(aj_zz==0)//按下正转按键时,电机正转

{

if(aj_fz==0)//按下反转按键时,电机反转

if(aj_fz==1&

&

aj_zz==1)//无按键按下,电机停转

if(aj_qh==1)//监测自动/手动切换_按键状态

//监测到切换到自动状态时,跳出手动控制循环,

}//进入主函数

手动控制状态下,手动/自动指示灯控制引脚输出为高电平,指示灯灭;

若按下正转按键,则L298芯片OUT1输出+12V,OUT2输出0V,电机正转;

若按下反转按键,则L298芯片OUT1输出0V,OUT2输出+12V,电机反转;

若无按键按下,则L298芯片OUT1输出0V,OUT2输出0V,电机停转。

6.主程序模块程序

main()

if(aj_qh==0)//监测自动/手动切换_按键状态,

{//并控制进入相应子函数

shoudong();

zidong();

}

若自动/手动切换_按键按下时,控制引脚输出为低电平,电机状态为手动控制;

若自动/手动切换_按键无按下时,控制引脚输出为高电平,电机状态为自动控制。

#include<

reg52.h>

externvoid_nop_(void);

typedefunsignedcharuint8;

typedefunsignedintuint16;

typedefunsignedlonguint32;

typedefcharint8;

typedefintint16;

codeuint8Disp_Tab[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x00,0x40};

codeuint8dispbit[4]={0xfe,0xfd,0xfb,0xf7};

//数码管位选控制变量

uint8a[4];

//数码管显示控制变量

uint8i=0;

//电机正反转控制变量

#definenops();

{_nop_();

_nop_();

}//定义空指令,调整控制温感驱动时序

sbitdj_zz=P3^0;

//定义电机正反转控制引脚

sbitdj_fz=P3^1;

sbitled_bjd=P3^2;

//定义背景灯控制引脚

sbitled_zs=P3^3;

//定义指示灯控制引脚

sbitDQ=P3^6;

//温度输入口

sbitggxh=P3^7;

//定义感光信号引脚

sbitkg1=P0^0;

//定义行程开关1信号引脚

sbitkg2=P0^1;

//定义行程开关2信号引脚

sbitkg3=P0^2;

//定义行程开关3信号引脚

sbitkg4=P0^3;

//定义行程开关4信号引脚

sbitaj_fz=P0^4;

//定义电机正反转_按键信号引脚

sbitaj_zz=P0^5;

sbitaj_qh=P0^6;

//定义自动/手动切换_按键信号引脚

/*数码管动态扫描函数*/

voidrefresh_led()

P2=Disp_Tab[a[2]]|0x80;

/*两个延时函数*/

voiddelay(uint16n)

while(n--);

voiddelay_ms(uint16n)

uint8m=120;

while(n--)

while(m--)

//刷新显示温度信息

/*18B20复位函数*/

voidDS18b20_reset(void)

bitflag=1;

while(flag)

while(flag)

DQ=1;

delay

(1);

DQ=0;

delay(50);

//延时550us

delay(6);

//延时66us

flag=DQ;

delay(45);

//延时500us

flag=~DQ;

DQ=1;

/**18B20写1个字节函数*/

voidwrite_byte(uint8val)

uint8i;

for(i=0;

i<

8;

i++)

DQ=1;

_nop_();

DQ=0;

nops();

//4us

DQ=val&

0x01;

//最低位移出

delay(6);

//延时66us

val>

>

=1;

//右移一位

DQ=1;

delay

(1);

/**18B20读1个字节函数*/

uint8read_byte(void)

uint8i,value=0;

DQ=1;

value>

//延时4us

//延时4us

if(DQ)

value|=0x80;

return(value);

/**启动温度转换*/

voidstart_temp_sensor(void)

voidread_temp()

doublewd;

temp<

//为负时,第一个数码管显示负号

//为正时,第一个数码管不显示

//第三个数码管显示个位

//第二个数码管显示十位

//第四个数码管显示小数位

/*背景灯控制子函数*/

voidbeijingdeng()

/*自动控制子函数*/

voidzidong()

//点亮自动/手动指示灯

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

当前位置:首页 > 考试认证 > 交规考试

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

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