高分悬赏 单片机课程设计一份

作者&投稿:乌文 (若有异议请与网页底部的电邮联系)
单片机课程设计!不要复制百度!高分悬赏!!~

1.单片机控制的60s倒计时
这个太简单了,不用什么提示吧?硬件上只要单片机最小系统加上数码管两个,程序上只要设置好定时器就行.
2. 基于单片机的电子钟设计
这个要复杂一点.大概要单片机+数码管+实时时钟芯片如DS系列(ds1302加要电池)+存储芯片如24C02,当然驱动数码管的如译码器或锁存器也要有.
实在说你第一个设计网上能找到现成的,第二个设计网上也能找到现成的,不过要你自己使用keil、proteus软件综合调试仿真,这两个内容都有,自己动手百度一下吧,不要太依赖别人.毕竟这样才能提高一下你自己.

我个人认为,你可以做一个城市道路交通灯控制,我所说的控制即不简单也不复杂,现在城市建设越来越快,尤其是现在的交通畅通化建设,随着车辆的增多,研究怎样建设一个畅通的城市,在车辆控制上怎样达到车辆行驶最优化,这个课题绝对是有意义的。
我之所以跟你说这个,是因为我曾经在业余时间花了一个多月,自己设计了一个道路交通灯控制系统,系统设计到东南西北四个方向,有红、黄、绿灯显示,而且还外加数码管倒计时显示,如果遇到紧急情况,还有紧急警和急停措施。当然这只是个模型,你不是说过,你还有合作伙伴吗,你们还可以在此基础上外加其它功能,比如方向指示。
这个系统刚开始在做的时候,遇到过不少困难,主要是程序调试。用到的器件不多,但功能很适用。
你先看一下我设计的要求:
红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换。四个方向各有一个红、黄、绿显示和两个数码管。
东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。
其仿真效果图在附件里,你先看一下,如对你有帮助,我可以把整个设计系统发给你

单片机课程设计实例

摘要

数字钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
单片计算机即单片微型计算机,是 集CPU ,RAM ,ROM , 定时,计数和多种接口于一体的微控制器。他体积小,成本低,功能强,广泛应用于智能产品和工业自动化上。而51 单片机是各单片机中最为典型和最有代表性的一种。这次设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
关键词:数字钟、液晶显示、温度检测、串口通信
一、简介
系统由AT89C51、LED 数码管、按键、发光二极管等部分构成,能实现时间的调整、定时时间的设定,输出等功能。系统的功能选择由SB0、SB1、SB2、SB3、SB4 完成。其中SB0 为时间校对,定时器调整功能键,按SB 0 进入调整状态。SB1 为功能切换键。第一轮按动SB1 依次进入一路、二路、三路定时时间设置提示程序,按SB3 进入各路定时调整状态。定时时间到,二极管发亮。到了关断时间后灭掉。如果不进入继续按SB1 键,依次进入时间. 年. 位校对、. 月. 位校对、 . 日. 位校对、. 时. 位校对、. 分. 位校对、. 秒. 位校对状态。不管是进入那种状态,按动SB2 皆可以使被调整位进行不进位增量加1 变化。各预置量设置完成后,系统将所有的设置存入RAM 中,按SB1 退出调整状态。上电后,系统自动进入计时状态,起始于. 00. 时. 00. 分。SB4 为年月日显示转换键,可使原来显示时分秒转换显示年月日。
二、电路原理分析
1. 显示原理
电原理图见附图1。由6 个共阴极的数码管组成时、分、秒的显示。P0 口的8 条数据线P0.0 至P0.7 分别与两个CD4511 译码的ABCD 口相接,P2 口的 P2.0 至P2.2 分别通过电阻R10 至R13 与VT1 至VT3 的基极相连接。这样通过P0 口送出一个存储单元的高位、低位BCD 显示代码,通过P2 口送出扫描选通代码轮流点亮LED1 至LED6,就会将要显示的数据在数码管中显示出来。从P0 口输出的代码是BCD 码,从P2 口输出的就是位选码。这是扫描显示原理。
2. 数码管结构及代码显示

共阴LED 数码管由8 只发光二极管VD1 至VD8 共阴连接并按. 8. 字形结构排列而成。这样,我们将这些二极管的正极接高低不同的电位,把所有的负极接地,当正极为高电位时相应的二极管就会导通而发光,从而使数码管呈现不同的字符。而只有P2 相应呈现高电位, VT 个管导通,LED1 的GND 与地相接,LED 位被选中才具备发光的使能条件;可见,在利用P2 口送出位选码,使各位轮流得到发光使能条件的同时,通过P0 口分别送出不同的段选码, 就会在LED1 至LED4 中显示出不同的数字来。
3 键盘及读数原理
键盘是人与微机打交道的主要设备,按键的读取容易引起误动作。可采用软件去抖动的方法处理,软件的触点在闭合和断开的时候会产生抖动,这时触点的逻辑电平是不稳定的,如不采取妥善处理的话,将引起按键命令错误或重复执行,在这里采用软件延时的方法来避开抖动,延时时间20ms.
4 连击功能的实现
按下某键时,对应的功能键解释程序得到执行,如操作者没有释放按键,则对应的功能会反复执行,好象连续执行,在这里我们采用软件延时250ms,当按键没释放则执行下一条对应程序。利用连击功能,能实现快速调时操作。
5

6

7

三、程序设计
系统的主程序主要完成时间显示和定时输出判断功能。而年月日显示和各时间单元进位,时间设定时,调定时间设定时等功能全部在中断服务程序中完成。
1.数据与代码转换。
由前述可知,从P2 口输出位选码,从P0 口输出段选码,LED 就会显示出数字来。但P0 口的输出的数据是要BCD 码,各存储单元存储的是二进制数,也就是和要显示出的字符表达的含义是不一致的。可见,将要显示的存储单元的数据直接送到P0 口去驱动LED 数码管显示是不能正确表达的,必须在系统内部将要显示的数据经过BCD 码行转换后,将各个单元数据的段选代码送入P0 口,给CD4511 译码后去驱动数码管显示。
具体转换过程如下:
我们先将要显示的数据装入累加器A 中,再将A 中的数据转换成高低两位的BCD 码, 再放回A 中,然后将A 中的值输出。如:有一个单元存储了45 这样一位数,则需转换成四位的BCD 码:(0100)(0101)然后放入A 中。 A 中BCD 码,高位四位代表.4.低四位代表.5.同时送给两个译码器中,译码后. 45. 字就在两个LED 中显示出来。
2.计时功能的实现与中断服务程序
时间的运行依靠定时中断子程序对时钟单元数值进位调整来实现的。计数器T0 打开后, 进入计时,满100 毫秒后,重装定时。中断一次,满一秒后秒进位,满60 秒后即为1 分钟, 分钟单元进位,60 分到了后,时单元进位,24 小时满后,天单元进位。这样然后根据进率, 得到年、月、日、时、分、秒存储单元的值,并经译码后,通过扫描程序送LED 中显示出来, 实现时钟计时功能。累加是用指令INC 来实现的。 进入中断服务程序以后,执行PUSH PSW 和PUSH A 将程序状态寄存器PSW 的内容和累加器A 中的数据保存起来,这便是所谓的. 保护现场. . 以保护现场和恢复现场时存取关键数据的存储区叫做堆栈。在软件的控制之下,堆栈可在片内RAM 中的任一区间设定,而堆栈的数据存取与一般的RAM 存取又有区别,对它的操作,要遵循. 后进先出. 的原则。
3 时钟误差分析
开启定时器/计数器0,使之开始计时,中断后进入中断程序。自停止计数到、计数又
开始,中间执行了7 条指令,也就是延迟了13 个单周期共用时间26us,这样,每个中断的总时间应为为100.026sm,而原来定时是100ms,,所以,也就是说每次中断定时多了26um.
这样,可改变计数重装值,使每次中断定时时间为99.974sm,加上原来的7 条指令所用的
时间,正好100sm.计数10 次得1s.这样就可得到较精确的计时秒数,然后根据进率,得到
时、分的值。
4 时间控制功能与比较指令
系统的另一功能就是实现对执行设备的定时开关控制,其主要控制思想是这样的:先
将执行设备开启的时间和关闭时间置入RAM 某一单元,在计时主程序当中执行几条比较指
令,如果当前计时时间与执行设备的设定开启时间相等,就执行一条 CLR 指令,将对应的
那路P3 置为高电位,开启;如果当前计时时间与执行设备设定的关闭时间相等,就执行SETB 对应的P3 置低电位,二极管截止,。实现此控制功能用到的比较指令为CJNE A,#direct, rel,其转移条件是累加器A 中的值与立即数不等则转移。
参考文献
1、《单片机典型系统设计实例精讲》电子工业出版社
2、李刚 、林凌 、姜苇《51系列单片机系统设计与应用技巧》北京航空航天大学出版社
3、《单片机C程序设计及应用实例》人民邮电出版社
程序
#include<reg52.h>
#include<absacc.h>
#define unit unsigned int
#define uchar unsigned char
#define DIGPORT XBYTE [0x8000]
#define WORDPORT XBYTE[0x4000]
sbit K0=P1^0;
sbit K1=P1^1;
sbit K2=P1^2;
sbit BEEP="P1"^3;
sbit L0=P1^4;
sbit L1=P1^5;
sbit L2=P1^6;
sbit L3=P1^7;
uchar data BUFFER[2]={0,0}; /*显示缓冲区(依次为低位,高位)*/
uchar data CLOCK[4]={0,0,0,0}/*存放时钟时间(依次为百分秒、秒、分和时位)*/
uchar data SECOND[2]={0,0}; /*存放秒表时间(依次为百分秒,秒)*/
uchar data REVERSE[4]={0,0,0,0};//存放倒计时时间(依次为百分秒、秒、分和时位)
uchar data STATE="0"; /*定义运行状态*/
bit bdata SND="0"; /*秒表START*/
bit bdata RST="0"; /*秒表RESET*/
bit bdata STP="0"; /*倒计时STOP*/
uchar code TABLE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x40};/*数码管显示编码“0”-“9”,“A”,"-"*/
void display(void);
void main(void)
{
uchar stabak; /*上一次程序运行的状态*/
P1=0x0f;
EA=1;IT1=1;ET0=1;
TMOD=0x61; /*T1方式2计数,T0方式1计时*/
TH0=-5000/256;TL0=-5000%256;
TH1=0xff;TL1=0xff;
T2CON=0;TH2=-5000/256;TL2=-5000%256;
K0=1;K1=1;K2=1;
STATE=P1&0x07;
stabak=STATE;
for(;;)
{
switch(STATE)
{
case 0: /*START=0,秒表*/
{
EX1=0;ET1=1;ET2=1;TR1=1;SND=1;
L1=1;L0=0;L2=0;
SECOND[0]=0;
SECOND[1]=0;
}break;
case 1: /*START=1,倒计时分调整*/
{
EX1=0;ET1=1;ET2=1;TR1=1;TR2=0;
L2=1;L0=0;L1=0;
REVERSE[0]=0;
REVERSE[1]=0;
}break;
case 2: /*START=2,倒计时小时调整*/
{
EX1=0;ET1=1;ET2=1;TR1=1;TR2=0;
L2=1;L0=0;L1=0;
REVERSE[0]=0;
REVERSE[1]=0;
}break;
case 3: /*START=3,倒计时运行*/
{
EX1=0;ET1=1;ET2=1;TR1=1;
if((REVERSE[2]==0)&&(REVERSE[3]==0))L2=1;
else TR2=1;
L0=0;L1=0;
}break;
case 5: /*START=5,时钟分调整*/
{
IE1=0;EX1=1;ET1=0;ET2=1;TR0=0;
L0=1;L1=0;L2=0;
}break;
case 6: /*START=6,时钟时调整*/
{
IE1=0;EX1=1;ET1=0;ET2=1;TR0=0;
L0=1;L1=0;L2=0;
}break;
default: /*START=4or7,时钟运行*/
{
EX1=0;ET1=0;ET2=1;TR0=1;
L1=0;L2=0;
}
}
while(STATE==stabak)
{
switch(STATE)
{
case 0: /*START=0,秒表*/
{
BUFFER[0]=SECOND[0];
BUFFER[1]=SECOND[1];
}break;
case 1: /*START=1,倒计时分调整*/
{
BUFFER[0]=REVERSE[2];
BUFFER[1]=101;
}break;
case 2: /*START=2,倒计时小时调整*/
{
BUFFER[0]=110;
BUFFER[1]=REVERSE[3];
}break;
case 3: /*START=3,倒计时运行*/
{
BUFFER[0]=REVERSE[2];
BUFFER[1]=REVERSE[3];
}break;
case 5: /*START=5,时钟分调整*/
{
BUFFER[0]=CLOCK[2];
BUFFER[1]=101;
}break;
case 6: /*START=6,时钟时调整*/
{
BUFFER[0]=110;
BUFFER[1]=CLOCK[3];
}break;
default: /*START=4or7,时钟运行*/
{
BUFFER[0]=CLOCK[2];
BUFFER[1]=CLOCK[3];
}
}
display();/*显示函数*/
K0=1;K1=1;K2=1;
STATE=P1&0x07;
}
stabak=STATE;
}
}

void timer0(void) interrupt 1 using 1
{
TH0=-5000/256; /*重置定时初值*/
TL0=-5000%256;
CLOCK[0]=CLOCK[0]+1; /*时钟处理*/
if((CLOCK[0]==50)&&(STATE>=4))
{
L0=!L0;
}
if(CLOCK[0]==100)
{
if(STATE>=4) L0=!L0;
CLOCK[0]=0;
CLOCK[1]=CLOCK[1]+1;
if(CLOCK[1]==60)
{
CLOCK[1]=0;
CLOCK[2]=CLOCK[2]+1;
if(CLOCK[2]==60)
{
CLOCK[2]=0;
CLOCK[3]=CLOCK[3]+1;
if(CLOCK[3]==24)
{
CLOCK[3]=0;
}
}
}
}
}

void timer2(void) interrupt 5 using 3
{
TF2=0;
TH2=-5000/256;
TL2=-5000%256;
if(STATE==0) /*秒表处理*/
{
SECOND[0]=SECOND[0]+1;
if(SECOND[0]==50)
{
L1=!L1;
}
if(SECOND[0]==100)
{
L1=!L1;
SECOND[0]=0;
SECOND[1]=SECOND[1]+1;
if(SECOND[1]==100)
{
SECOND[1]=0;
}
}
}
if(STATE==3) /*倒计时处理*/
{
REVERSE[0]=REVERSE[0]+1;
if(REVERSE[0]==50)
{
L2=!L2;
}
if(REVERSE[0]==100)
{
L2=!L2;
REVERSE[0]=0;
REVERSE[1]=REVERSE[1]+1;
if(REVERSE[1]==60)
{
REVERSE[1]=00;
REVERSE[2]=REVERSE[2]-1;
if((REVERSE[2]==0)&&(REVERSE[3]==0))
{
TR2=0;
STP="1";
BEEP="0";
}
else if(REVERSE[2]==0xff)
{
REVERSE[2]=59;
REVERSE[3]=REVERSE[3]-1;
}
}
}
}
}

void intsvr1(void) interrupt 2 using 2
{
if(STATE==5)
{
CLOCK[2]=CLOCK[2]+1;
if(CLOCK[2]==60) CLOCK[2]=0;
}
if(STATE==6)
{
CLOCK[3]=CLOCK[3]+1;
if(CLOCK[3]==24) CLOCK[3]=0;
}
}

void timer1(void) interrupt 3 using 3
{
if(STATE==0)
{
if(RST)
{
SECOND[0]=0;
SECOND[1]=0;
L1=1;
RST="0";
}
else
{
if(SND) TR2=1;
else
{
L1=1;
TR2=0;
RST="1";
}
SND=!SND;
}
}
else if(STATE==1)
{
REVERSE[2]=REVERSE[2]+1;
if(REVERSE[2]==60) REVERSE[2]=0;
}
else if(STATE==2)
{
REVERSE[3]=REVERSE[3]+1;
if(REVERSE[3]==24) REVERSE[3]=0;
}
else
{
if(STP)
{
BEEP="1";
L2=1;
STP="0";
}
else TR2=0;
}
}

void display(void)
{
uchar i; /*显示缓冲区首址*/
uchar delay; /*显示延时*/
uchar disp; /*显示内容*/
uchar digit; /*定义数码管显示位*/
digit=0x08;
for(i=0;i<2;i++) /*秒表,显示百分秒和秒*/
{
if(BUFFER>100) disp="BUFFER"%10+10;
else disp="BUFFER"%10;
DIGPORT="digit";
WORDPORT="TABLE"[disp];
for(delay=0;delay<=200;delay++);
digit="digit">>1;
disp="BUFFER/10";
DIGPORT="digit";
WORDPORT="TABLE"[disp];
for(delay=0;delay<=200;delay++);
digit="digit">>1;
}
}


政和县17613132650: 单片机课程设计!不要复制百度!高分悬赏!! -
第黎磷酸: 1.单片机控制的60s倒计时 这个太简单了,不用什么提示吧?硬件上只要单片机最小系统加上数码管两个,程序上只要设置好定时器就行.2. 基于单片机的电子钟设计 这个要复杂一点.大概要单片机+数码管+实时时钟芯片如DS系列(ds1302加要电池)+存储芯片如24C02,当然驱动数码管的如译码器或锁存器也要有. 实在说你第一个设计网上能找到现成的,第二个设计网上也能找到现成的,不过要你自己使用keil、proteus软件综合调试仿真,这两个内容都有,自己动手百度一下吧,不要太依赖别人.毕竟这样才能提高一下你自己.

政和县17613132650: 单片机课程设计,请大家帮忙~~~
第黎磷酸: 首先先判断按键...用一个寄存器来放按键的值 举个例子吧. 比如R3放按键数 当按下第一次时,CJNE R3,#1,AA AA程序就是你要执行了第一个L1闪的程序... 这个应该懂了吧

政和县17613132650: 急求单片机课程设计《直流风扇电机的转速测量与PWM控制》 -
第黎磷酸: 这是俺写的单片机产生PWM #include<reg52.h>sbit PWM1=P1^1; sbit PWM2=P1^2; sbit PWM3=P1^3; int t=0;void Init_Timer1(void) {TMOD = 0x10;TH1=0xD8;//@12M 10ms 16bit 自动重载; Init valueTL1=0xF0;EA=1; /* interupt enable */...

政和县17613132650: 单片机课程设计
第黎磷酸: #include<reg51.h> #include<intrins.h> #define unint unsigned int unint nt=0; void time()interrupt 1 using 1 { TH0=0x3c; TL0=0xb0; nt++; } void main() { unint led=0xfe; TMOD=0x01; TH0=0x3c; TL0=0xb0; EA=1; ET0=1; TR0=1; while(1) { if(nt%4==0) {...

政和县17613132650: 单片机课程设计
第黎磷酸: 这个是16位led 双向流水灯演示程序. if(LEDDirection) LEDShow(0x000f<<LEDIndex); else LEDShow(0x000f>>LEDIndex); 上面两句表示判断流水方向,再调用LED亮灯程序 if(LEDIndex= =15) LEDDirection= !LEDDirection; 上面一句表示在一个循环之后,方向反转. LEDIndex = (LEDIndex+1)%16; 上面一句表示把步数加一,“%16”表示不会超过16(0-15).

政和县17613132650: 100高分求【单片机】高手赐教,给个思路.课程设计题目是:多功能电子万年历
第黎磷酸: 用DS1302来计时,不过他只能计阳历,然后网上有很多的阳历转阴历的算法程序,直接找个就可以了具体调整时间,定时什么的,都是很简单的东西掉电存储没用过1302的,一般要是实验板的话应该会有个AT24C01或02之类的芯片,他应该是让你往那里面存,然后每次开机读出来,需要修改的话就在吧新的数据写进去.

政和县17613132650: 单片机课程设计
第黎磷酸:#include <reg51.h> #define uchar unsigned char #define uint unsigned int #define SEG P0//数码管接P0 uint count_T0,count;//计数,定时. uchar flag10,flag11,flag60,seconds,minutes,jishuqi; uchar code TAB[]={ 0xc0,0xf9,0xb0,0x99,//共阳0-4 ...

政和县17613132650: 单片机课程设计 -
第黎磷酸: 你写的要求太宽泛,我就随便给你两个,你参考下,根据你的题目修改下,这你应该可以的吧总结随便找点,我也不知道你的具体要求,就不发了给你个流水灯的,循环点亮程序ORG 0000HJMP MAINORG 0030H MAIN: MOV A,#0FFH...

政和县17613132650: 基于单片机的直流电机调速系统设计,大家看完要求给个思路就是,高分悬赏!请大家积极配合!鄙人感激涕零
第黎磷酸: 用PWM来控制电机的速度.让PWM的占空比与负载的变化产生一定的关联即可. 可以用AVR等单片机,定时器本身就带有PWM功能的,做起来会省事很多. 不过,前提是,你得能够灵敏并且准确地检测负载的变化.因为你没有说明是怎样的负载、如何变化的,因此无法提供这方面的思路.

政和县17613132650: 求一些单片机课程设计实例,要用c语言编程的 -
第黎磷酸: 一些?简单的只会用89C51,也许我们LED灯连接I/O口不一样,你要看看你单片机.①精确定时0.5S亮#include void main() { TMOD=0x20; TH1=0x06; TL1=...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网