51单片机控制灯泡亮度的仿真
- 格式:doc
- 大小:876.00 KB
- 文档页数:7
成绩实验名称:单片机系统简单扩展实验
一、实验目的
1、了解单片机系统的扩展方法
2、熟悉8255A在单片机系统扩中的使用方法。
3、熟悉仿真软件Proteus以及编程软件Keil的使用。
二、实验仪器
三、实验内容
四、实验原理
实验报告
五、实验步骤
步骤:
1、根据给定的实验要求,分析实验的目的以及实验要求。
2、通过计算机仿真软件Proteus,根据实验目的设计电路,并且绘制电路原理图。
3、根据自己设计的电路,编写控制程序。
4、调试所编写的控制程序,直至程序没有语法及语意错误,可以通过编译。
5、将所编写的无错误的程序下载至仿真软件,并进行调试,根据仿真结果修改程序。
6、重复上一步骤,知道仿真效果达到实验要求,即可完成。
六、实验程序
#include <reg51.h>
#include<absacc.h>。
中文摘要中文摘要本作品是具有自动化程度高、运行可靠、使用维护方便的照明控制系统,为城市路灯现代化提供了一些参考方案。
系统采用STC单片机为核心的最小系统板,设计了模拟路灯控制系统。
控制系统采用定时器设定时钟功能,设定、显示开关灯时间;用了基于555为核心的红外传感器检测物体的定位。
路灯单元控制系统采用恒流源供电,具有输出功率调整功能,并能定时调整功率。
阐述了基于单片机模拟路灯控制系统实现的设计思想、方法及过程。
该模拟控制系统,能有效的节约能源,减少照灯具的损耗。
城市亮化随之被政府所重视,既而大量的资金投入进行建设和改造中去,使得我们的城市夜晚变得灯火辉煌,绚丽多彩,但同时,诸多问题也随之而来:能耗的逐年攀升,产生的某些问题亦逐渐显露出来,如城市路灯的维护量增大,带来人员不足的问题,使得路灯故障时不能得到及时的修复以致造成人民生活的不便;维护费用也随之增加,社会成本过高,电费支出过多,财政承担相对困难,给政府带来了相对大的压力;光污染现象严重……这些问题的产生无疑给当地的路灯管理部门的各方面工作带来很大的压力,因此他们迫切的想解决此问题,故针对这种情况我们设计并制作了这一节能智能型的模拟路灯控制系统,其主要价值在于能更好的节能与监测,在很多方面给人们带来了方便,给维护人员降低了难度。
在白天模式的时候,还能根据环境明暗的变化控制路灯的开启和关闭路灯,在夜晚模式的情况下,根据交通路面情况自动开关灯。
当灯出现故障不亮时,能够检测并且通过声光系统报警,显示器上显示故障灯的编号。
自制的单元控制器中的LED灯恒流驱动电源,在多数情况下,具有系统稳定,功耗低等特点。
以STC89C51RC为核心,利用时钟控制LED灯的开关时间段,通过红外感应模块将物体运动的信号通过555的TTL高低电平输入单片机,并通过三红外线输入的情况判断物体运行方向,再控制LED灯的开关情况。
并完成四方面的功能:时间设定功能,环境明暗判断,独立控制功能,交通条件控制功能。
keilproteus仿真AT89C51单片机点亮一个灯泡并让灯泡不停闪烁用单片机点亮一个灯泡并让灯泡不停闪烁,这几乎是单片机的入门课程了。
网上有很多图文并茂的资料把这个步骤写得很详细,我就不再画蛇添足了,有兴趣的同学请在网上搜索,很easy.最近在看计算机组成原理,对电路略有兴趣,捡起多年前玩过的东东,呵呵,宝刀不老, 我还能记清楚自己当时点亮一个灯泡并让灯泡不停闪烁的那种激动的心情。
虽然现在工作完全用不到了,但兴趣犹在。
先让单片机点亮一个灯泡,不需要程序,只用proteus即可:下面来用keil c写程序,并把生成的hex文件导入到proteus的单片机中, keil c 界面如下:程序如下:1.#include<reg51.h>2.3.sbit P1_3 = P1^3;4.5.void delay(int n)6.{7.int i = 0;8.int j = 0;9.for(i = n; i > 0; i--)10.{11.for(j = 110; j > 0; j--)12.{13.;14.}15.}16.}17.18.void main()19.{20.int i = 0;21.while(1)22.{23.P1_3 = (i++ % 2)? 0 : 1 ;24.delay(200);25.}26.}生成hex文件,导入到单片机中,运行,灯泡不停闪烁,很简单,但挺有意思的:有点意思。
对了,要说明的是,图中的电源是没有画出的,实际上肯定有电源。
《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例第 01 篇基础程序设计01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}03 8只LED左右来回点亮/* 名称:8只LED左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){{P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include<reg51.h>#define uchar unsignedchar#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff, 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00, 0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;while(1){ //从数组中读取数据送至P0和P2口显示for(i=0;i<136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}05 LED模拟交通灯/* 名称:LED模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。
51单片机从零开始基于protues和keil uv4的开关控制首先是keil uv4的程序由于是入门篇第一讲,我将如何建立工程给大家稍微说一下点击project-new uvision project建立新的工程在此我们可以选择工程的存放目录选择好目录后在文件名处写上工程名,工程名支持中文和英文。
(后缀无需写,程序会自动补充)我们会遇到这样的界面,由于本教程是针对51系列单片机的,所有我们下拉选择atmel的at89c51作为最初的选择,后续的如at89c52.at89c516等都是一样的他们是51的同类或者说更高的版本选择at89c51后系统会提示你是否需要历程(额英语真心不好,大致是这意思)我们选择否后自己进行编程新建文件保存文件名(注意,用c语音编程需要在文件名后加.c 如led.c)下面我们双击左边的source group会见到这样的选项,意思是选择将文件添加至工程我们双击led.c即可添加至工程文件里。
(注:多次点击会出现如上提示,意味已添加的不能再次添加,我们关闭即可)关于keil的准备工作完成下面开始编程以下是第一个例程,关于单片机通过开关控制led亮灭#include<reg51.h>sbit a=P0^0;//定义led灯的接口为P0^0 等号前为自由定义的自变量(注意不能用关键字定义)sbit key=P0^1;//定义开关的接口为P0^1void main(){while(1)//无限循环,采用扫描模式,不断扫描P0^1口,即开关是否闭合{if(key==0)//当开关闭合时()a=0;//led点亮注:led低电平点亮=0意味低电平elsea=1;//led熄灭}}。
ADC0831模拟量转换为对应8位数字量时延时大小的调节电路及程序
CS BIT P2.2 CLK BIT P2.1 DO BIT P2.0 ADCD EQU 35H PWM BIT P3.0 TB BIT P3.2
ORG 0000H AJMP MAIN ORG 0003H AJMP ZD
ORG 0100H MAIN:
MOV SP,#30H SETB IT0
;CLR IT0
SETB EA
SETB EX0 LCALL ADC
;MOV ADCD,#51
WAIT:
CLR PWM MOV A,ADCD LCALL DELAY SETB PWM MOV A,#0FFH SUBB A,ADCD LCALL DELAY
SJMP W AIT
ADC:
SETB PWM
SETB CS
CLR CLK
NOP
NOP
CLR CS
NOP
NOP
SETB CLK
NOP
NOP
CLR CLK
NOP
NOP
SETB CLK
NOP
NOP
CLR CLK
NOP
NOP
SETB CLK
NOP
MOV R0,#08H
ADCKS:
CLR CLK
MOV C,DO
RLC A
SETB CLK
NOP
NOP
DJNZ R0,ADCKS
SETB CS
MOV ADCD,A
RET
DELAY:
MOV R5,A
D1:
MOV R6,#18
DJNZ R6,$
DJNZ R5,D1
RET
ORG 0200H
ZD:
PUSH ACC
MOV A,#255
SUBB A,ADCD
LCALL DELAY
CLR PWM
POP ACC
RETI
END
ADC0832的应用
A_0832_CS EQU P2.0 A_0832_CLK EQU P2.1 A_0832_DO EQU P2.2 A_0832_T EQU 30H
A_0832_DA EQU 31H PWM BIT P3.0
TB BIT P3.2
ORG 0000H
LJMP MAIN
ORG 0003H
AJMP ZD
ORG 0100H
MAIN:
MOV SP,#30H
SETB IT0
SETB EA
SETB EX0
WAIT:
LCALL ADC_RD SJMP W AIT
ADC_RD:
MOV A_0832_T,#8 CLR A_0832_CLK CLR A_0832_CS SETB A_0832_DO
;START
SETB A_0832_CLK
;第一个上升沿
NOP
NOP
CLR A_0832_CLK NOP
NOP
SETB A_0832_DO
;选择CH0 NOP
SETB A_0832_CLK
;第二个上升沿
NOP
NOP
NOP
CLR A_0832_CLK
NOP
NOP
SETB A_0832_DO
;选择CH0
NOP
SETB A_0832_CLK
;第三个上升沿
NOP
NOP
NOP
CLR A_0832_CLK
;首个下降沿
NOP
NOP
NOP
SETB A_0832_CLK
NOP
NOP
A_0832_RD:
;读取前,8位
CLR A_0832_CLK
NOP
NOP
NOP
SETB A_0832_CLK
MOV C,A_0832_DO
RLC A
DJNZ
A_0832_T,A_0832_RD
MOV A_0832_DA,A
RR A
MOV A_0832_T,#7
A_0832_RD1:
;读后7位,+前1位
CLR A_0832_CLK
NOP
NOP
NOP
SETB A_0832_CLK
MOV C,A_0832_DO
RRC A
DJNZ
A_0832_T,A_0832_RD1
CJNE
A,A_0832_DA,ADC_RD
SETB A_0832_CS
RET
DELAY:
MOV R5,A
D1:
MOV R6,#14
DJNZ R6,$
DJNZ R5,D1
RET
ORG 0200H
ZD:
PUSH ACC
CLR PWM
MOV A,A_0832_DA
LCALL DELAY
SETB PWM
NOP
NOP
NOP
CLR PWM
POP ACC
RETI
END
PWM控制
双向晶闸管
过零检测
R8=10K
R8=100K
过零检测二。