建材秒知道
登录
建材号 > 设计 > 正文

跪求单片机课程设计 要完全呦

英俊的自行车
高兴的砖头
2022-12-21 07:32:01

跪求单片机课程设计 要完全呦

最佳答案
专注的外套
搞怪的航空
2025-12-03 11:51:28

题 目:单片机课程设计报告

目 录

一、设计目的

二、程设计具体要求

三、单片机发展简史

四、8051单片机系统简介

五、8051单片机内部定时器/计数器简介

六、程序电路

七、程序流程

八、程序代码

九 实验总结-要求写出完整的论文以及心得体会

十 参考资料及小结

原 文 : 一.目的

1. 进一步熟悉和掌握8051单片机的结构及工作原理。

2. 掌握单片机的接口技术及相关外围芯片的外特性,控制方法。

3. 通过课程设计,掌握以单片机核心的电路设计的基本方法和技术,了解表关电路参数的计算方法。

4. 通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。

5. 通过完成一个包括电路设计和程序开发的完整过程,使学生了解开发一单片机应用系统的全过程,为今后从事相应打下基础。

二.课程设计的体要求

a) 原理图设计。

1. 原理图设计要符合项目的工作原理,连线要正确,端了要不得有标号。

2. 图中所使用的元器件要合理选用,电阻,电容等器件的参数要正确标明。

3. 原理图要完整,CPU,外围器件,扩器接口,输入/输出装置要一应俱全。

b) 程序调计

1. 根据要求,将总体项能分解成若干个子功能模块,每个功能模块完成一个特定的功能。

2. 根据总体要求及分解的功能模块,确定各功能模块之间的关系,设直出完整的程序流程图。

c) 程序调试将设计完的程序输入,汇编,排除语法错误,生成*OBJ文件。

1. 按所设计的原理图,在实验平台上连线,检查无误。

2. 将汇编后生成的*OBJ文件传送到实验装置的,执行该程序,检查该程序、是否达到设计要求,若未达到,修改程序,直到达到要求为止,

d) 说明书

1. 原理图设计说明

简要说明设计目的,原理图中所使用的元器件功能及在图中的作用,各器件的工作过程及顺序。

2. 程序设计说明

对程序设计总体功能及结构进行说明,对各子模块的功能以及各子模块之间的关系作较详细的描述。

3. 画出工作原理图,程序流程图并给出程序清单。

目前,单片机已广泛应用到图民经济建设和日常生活的许多领域,成为测控技术现代化必不可少的重要工具。下面介绍一本单片机课程设计的好书,介绍了很多实例有兴趣者可以去买哦,价格不贵【图书目录】 - 8051单片机课程设计实训教材

第1章 绪论

1.1 课程设计所需硬件工具

1.2 专题制作所需软件使用工具

1.3 8051程序开发测试平台

1.4 使用免费汇编编译器

1.5 89CXX烧录模拟器操作实例

1.6 自制8051微电脑单板IO51

1.7 IO51操作实例

1.8 以Windows98 工作模式结合DOS模式来执行

第2章 8051单片机课程设计中的基本软硬件设计

2.1 8051各种基本的硬件设计

2.2 工作指示灯LED

2.3 8051延迟时间计算

2.4 基本按键设计

2.5 建立8051通信接口

2.6 简易8051调试界面

2.7 压电喇叭测试

2.8 键盘扫描

2.9 扫描控制七段显示器

2.10 LCD接口控制

2.11 8051定时器模式的工作

2.12 定时器模式0测试

2.13 定时器模式1测试

2.14 定时器模式2测试

2.15 以定时器产生各种频率的声音

2.16 以定时器演奏—段旋律

第3章 带单片机的LCD时钟

第4章 定时闹铃

第5章 定时闹铃LCD

第6章 音乐倒数定时器

第7章 密码锁控制

第8章 可存储式电子琴

第9章 8051八音盒

第10章 红外线遥控器研究

10.1 红外线遥控器动作原理

10.2 如何观察红外线遥控器信号

10.3 红外线遥控器译码功能说明

第11章 红外线家电遥控

第12章 8051伺服机控制

12.1 伺服机工作原理及改装

第1.3章 8051伺服车控制

13.1 功能说明

13.2 伺服车组装及实验

第14章 红外线遥控伺服车

14.1 功能说明

14.2 遥控伺服车组装及实验

14.3 控制电路

14.4 控制程序

第15章 无线电家电遥控

15.1 功能说明

15.2 遥控编码解码控制

第16章 8051声控设计

16.1 声控基本知识介绍

16.2 系统组成

16.3 声控模块介绍

16.4 基本控制电路

16.5 基本控制程序

16.6 声控课题设计

附录H 如何使用KEIL 8051开发系统汇编和编译程序及调试

附录I EPM89 890XX烧录模拟器特性

附录J 1051 8051 10控制板特性

附录K VCMM声控模块特性

附录L IO51控制板完整电路图

附录M 需要从网站下载的相关资料的使用说明

附录N 硬件接口板版权声明及如何订购

附录A 简易稳压电源制作

附录B 本书实验所需软硬件工具及零件

附录C 8051内部控制寄存器介绍

附录D 8051指令集

附录E 如何自制8051单板

附录F 课程设计报告参考内容

附录G IO51控制板窗口版驱动程序使用说明

最新回答
炙热的啤酒
谦让的斑马
2025-12-03 11:51:28

1.单片机控制的60s倒计时

这个太简单了,不用什么提示吧?硬件上只要单片机最小系统加上数码管两个,程序上只要设置好定时器就行.

2.

基于单片机的电子钟设计

这个要复杂一点.大概要单片机+数码管+实时时钟芯片如DS系列(ds1302加要电池)+存储芯片如24C02,当然驱动数码管的如译码器或锁存器也要有.

实在说你第一个设计网上能找到现成的,第二个设计网上也能找到现成的,不过要你自己使用keil、proteus软件综合调试仿真,这两个内容都有,自己动手百度一下吧,不要太依赖别人.毕竟这样才能提高一下你自己.

狂野的小蜜蜂
拉长的小丸子
2025-12-03 11:51:28

哈哈 有个1602显示的 不过程序太长 贴不上 给你个数码管的吧 不行再联系

1302.c

#include<DS1302.h>

#include<key.h>

uchar bit_ser[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}

uchar seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}

void timer0_init(void)  //T0初始化函数,用于时间的动态显示

{

TMOD = 0x21

TL0 = (65536-5000) % 256

TH0 = (65536-5000) / 256

EA = 1

ET0 = 1

TR0 = 1

}

void timer0_isr(void) interrupt 1  //T0中断处理函数

{

char flag   //flag用于表示调整时闪烁的亮或灭

TR0 = 0

TL0 = (65536-5000) % 256

TH0 = (65536-5000) / 256

TR0 = 1

flag = x / 100 * 0xff //设置闪烁标志,如果x大于100则flag为0xff,小于100则为0x00

x++

if(x > 200)

x = 0

switch(i)

{

case 0:

P2 = bit_ser[0]

if(setflag == 3)  //根据setflag的值判断当前位是否需要闪烁

P0 = flag | seven_seg[dis_buffer[0]]

else

P0 = seven_seg[dis_buffer[0]]

break

case 1:

P2 = bit_ser[1]

if(setflag == 3)

P0 =flag | seven_seg[dis_buffer[1]]

else

P0 =seven_seg[dis_buffer[1]]

break

case 2:

P2 = bit_ser[2]

if(setflag == 2)

P0 =flag | seven_seg[dis_buffer[2]]

else

P0 =seven_seg[dis_buffer[2]]

break

case 3:

P2 = bit_ser[3]

if(setflag == 2)

P0 =flag | seven_seg[dis_buffer[3]]

else

P0 =seven_seg[dis_buffer[3]]

break

case 4:

P2 = bit_ser[4]

if(setflag == 1)

P0 =flag | seven_seg[dis_buffer[4]]

else

P0 =seven_seg[dis_buffer[4]]

break

case 5:

P2 = bit_ser[5]

if(setflag == 1)

P0 =flag | seven_seg[dis_buffer[5]]

else

P0 =seven_seg[dis_buffer[5]]

break

}

i++

if(i >= 6)

{

i = 0

if(j == 10)

{

j = 0

if(setflag == 0)

DS1302_GetTime(&Time) //如果setflag是0,就从1302中读出时间,因为setflag不是0时,说明处于调整状态,不需要读时间

dis_buffer[5] = Time.Second % 10 //把当前时间放入显示缓冲区

dis_buffer[4] = Time.Second / 10

dis_buffer[3] = Time.Minute % 10

dis_buffer[2] = Time.Minute / 10

dis_buffer[1] = Time.Hour % 10

dis_buffer[0] = Time.Hour / 10

}

j++

}

}

void main()

{

Initial_DS1302(Time)

timer0_init()

while(1)

{

set_down()

timer_down()

up_down()

down_down()

beepflag_down()

if(setflag == 0 && Time.Hour == romhour && Time.Minute == romminute && Beepflag == 1) //判断蜂鸣器是否要响

Beep = !Beep

}

}

//key.c

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

uchar i = 0,j = 0,x = 0,setflag,flag_set,flag_timer   //setflag用来表示调整的位置,flag_set和flag_timer分别表示当前处于调整状态还是定时状态

SYSTEMTIME Time={0,20,15,3,30,6,10}    //系统时间的初始值2010年6月30日星期三,15时20分0秒

char dis_buffer[6]    //存放显示数据的缓冲区

sbit Beep_flag = P3^2    //蜂鸣器的接口

sbit key_timer = P3^4    //定时按钮

sbit key_set = P3^5    //调整按钮

sbit key_up = P3^6    //增加按钮

sbit key_down = P3^7    //减小按钮

char romhour,romminute,romsec    //分别存放定时的时,分,秒

bit Beepflag    //标记闹钟是否开启

//延时函数

void delays(uchar x)

{

while(x) x--

}

//设置键的处理函数

void set()

{

setflag ++

flag_set = 1

if(setflag >= 4)

{

setflag = 0

flag_set = 0

Initial_DS1302(Time)

}

}

//定时间的处理函数

void timer()

{

setflag ++

flag_timer = 1

if(setflag == 1)

{

Time.Hour = romhour

Time.Minute = romminute

Time.Second = romsec

}

else if(setflag >= 4)

{

setflag = 0

flag_timer = 0

romhour = Time.Hour

romminute = Time.Minute

romsec = Time.Second

}

}

//增加键的处理函数

void up()

{

switch(setflag)

{

case 0:

break

case 1:

Time.Second ++

if(Time.Second >= 60)

Time.Second = 0

break

case 2:

Time.Minute ++

if(Time.Minute >= 60)

Time.Minute = 0

break

case 3:

Time.Hour ++

if(Time.Hour >= 24)

Time.Hour = 0

break

}

}

//减小键的处理函数

void down()

{

switch(setflag)

{

case 0:

break

case 1:

Time.Second --

if(Time.Second < 0)

Time.Second = 59

break

case 2:

Time.Minute --

if(Time.Minute < 0)

Time.Minute = 59

break

case 3:

Time.Hour --

if(Time.Hour < 0)

Time.Hour = 23

break

}

}

//设置键的扫描函数

void set_down()

{

if(key_set == 0 && flag_timer == 0)

{

delays(100)

if(key_set == 0)

{

set()

}

while(!key_set)

}

}

//定时键的扫描函数

void timer_down()

{

if(key_timer == 0 && flag_set == 0)

{

delays(100)

if(key_timer == 0)

{

timer()

}

while(!key_timer)

}

}

//增加键的扫描函数

void up_down()

{

if(key_up == 0 && setflag != 0)

{

delays(100)

if(key_up == 0)

{

up()

while(!key_up)

}

}

}

//减少键的处理函数

void down_down()

{

if(key_down == 0 && setflag != 0)

{

delays(100)

if(key_down == 0)

{

down()

while(!key_down)

}

}

}

//定时开关的扫描处理函数

void beepflag_down()

{

if(Beep_flag == 0)

{

delays(100)

{

Beepflag = !Beepflag

while(!Beep_flag)

}

}

}

//ds1302.h

#ifndef _REAL_TIMER_DS1302

#define _REAL_TIMER_DS1302

#include <REG51.h>

sbit  DS1302_CLK = P1^1              //实时时钟时钟线引脚

sbit  DS1302_IO  = P1^2              //实时时钟数据线引脚

sbit  DS1302_RST = P1^3              //实时时钟复位线引脚

sbit  ACC0 = ACC^0

sbit  ACC7 = ACC^7

sbit  Beep = P2^7

typedef struct __SYSTEMTIME__

{   char Second

char Minute

char Hour

char Week

char Day

char Month

char Year

}SYSTEMTIME //定义的时间类型

#define AM(X) X

#define PM(X) (X+12)               // 转成24小时制

#define DS1302_SECOND 0x80          //秒寄存器

#define DS1302_MINUTE 0x82          //分寄存器

#define DS1302_HOUR 0x84

#define DS1302_WEEK 0x8A

#define DS1302_DAY 0x86

#define DS1302_MONTH 0x88

#define DS1302_YEAR 0x8C

#define DS1302_RAM(X) (0xC0+(X)*2)    //用于计算 DS1302_RAM 地址的宏

void DS1302InputByte(unsigned char d)  //实时时钟写入一字节(内部函数)

{   unsigned char i

ACC = d

for(i=8 i>0 i--)

{ DS1302_IO  = ACC0            //相当于汇编中的 RRC

DS1302_CLK = 1

DS1302_CLK = 0                 //发一个高跳变到低的脉冲

ACC = ACC >> 1

}

}

unsigned char DS1302OutputByte(void)  //实时时钟读取一字节(内部函数)

{  unsigned char i

for(i=8 i>0 i--)

{ ACC = ACC >>1          //相当于汇编中的 RRC

ACC7 = DS1302_IO

DS1302_CLK = 1

DS1302_CLK = 0                 //发一个高跳变到低的脉冲

}

return(ACC)

}

void Write1302(unsigned char ucAddr, unsigned char ucDa)//ucAddr: DS1302地址, ucData: 要写的数据

{ DS1302_RST = 0

DS1302_CLK = 0

DS1302_RST = 1

DS1302InputByte(ucAddr)        // 地址,命令

DS1302InputByte(ucDa)        // 写1Byte数据

DS1302_CLK = 1

DS1302_RST = 0                  //RST 0->1->0,CLK 0->1

}

unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据

{ unsigned char ucData

DS1302_RST = 0

DS1302_CLK = 0

DS1302_RST = 1                      //enable

DS1302InputByte(ucAddr|0x01)        // 地址,命令

ucData = DS1302OutputByte()         // 读1Byte数据

DS1302_CLK = 1                      //RST 0->1->0,CLK 0->1

DS1302_RST = 0

return(ucData)

}

void DS1302_SetProtect(bit flag)        //是否写保护

{ if(flag)

Write1302(0x8E,0x80) //WP=1,不能写入

else

Write1302(0x8E,0x00)//WP=0,可以写入

}

void DS1302_SetTime(unsigned char Address, unsigned char Value)        // 设置时间函数

{ DS1302_SetProtect(0)

Write1302(Address, ((Value/10)<<4 | (Value%10))) //高4位为十位,低4位为个位

DS1302_SetProtect(1)

}

//获取时间函数,从DS1302内读取时间然后存入Time内

void DS1302_GetTime(SYSTEMTIME *Time)

{ unsigned char ReadValue

ReadValue = Read1302(DS1302_SECOND)

Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F)//转换成10进制的秒

ReadValue = Read1302(DS1302_MINUTE)

Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F)

ReadValue = Read1302(DS1302_HOUR)

Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F)

ReadValue = Read1302(DS1302_DAY)

Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F)

ReadValue = Read1302(DS1302_WEEK)

Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F)

ReadValue = Read1302(DS1302_MONTH)

Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F)

ReadValue = Read1302(DS1302_YEAR)

Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F)

}

//利用STime初始化DS1302

void Initial_DS1302(SYSTEMTIME STime)

{ unsigned char Second=Read1302(DS1302_SECOND)

if(Second&0x80)   DS1302_SetTime(DS1302_SECOND,0)  //如果第七为1(表明没有启动), 则启动时钟

DS1302_SetTime(DS1302_SECOND,STime.Second)  //设定起始时间

DS1302_SetTime(DS1302_MINUTE,STime.Minute)

DS1302_SetTime(DS1302_HOUR,STime.Hour)

DS1302_SetTime(DS1302_DAY,STime.Day)

DS1302_SetTime(DS1302_MONTH,STime.Month)

DS1302_SetTime(DS1302_YEAR,STime.Year)

DS1302_SetTime(DS1302_WEEK,STime.Week)

}

#endif

精明的大树
光亮的唇膏
2025-12-03 11:51:28

proteus  我没用过

不习惯用仿真!! 呵呵

hz=500HZ 就是你要的频率你可以自己设

晶振我是按12M算的

我用硬件测试通过了~~

#include<reg52.h>

#define uchar unsigned char

uchar temp=0,hz

sbit bell=P1^0

void avf()

{

if(temp==2)

temp=0

bell=0

}

main()

{

hz=(1/500)/2

TMOD=0x01

ET0=1

EA=1

TL0=(65536-hz)/256

TH0=(65536-hz)%256

TR0=1

while(1)

{

avf()

if(temp==1)

bell=1  }

}

void TO() interrupt 1

{

temp++

TL0=(65536-hz)/256

TH0=(65536-hz)%256

}

如果需要汇编~~  告诉我

我在写给你

最小系统的原理图 我也画给你了

芯片你自己选吧 可以换的

其他问题 就是概述了~ 你自己写吧

不过那些都不重要 呵呵

其实你只要把 程序+硬件 设计原理

拿给他就可以了~~

至于proteus你自己画个吧~~

自己调吧~~