单片机计时器课程设计
Ⅰ 智能电子钟,单片机课程设计,急!!!!!!
问题1:需要用单片机定时器中断,内建一个实时时钟(考察的是学生对单片机定时器中断的认识),并根据提前设置的时刻作为闹铃的触发事件,当实时时钟的时,分,秒与闹铃时刻设置的时,分,秒数值相同时,单片机输出一个有效电平,触发闹铃.
问题2:问题1中闹铃功能的扩展,需要做几个"闹铃"时刻,并分别控制不同的IO口输出有效电平,如果允许有线控制的话(相信你们老师最后会在你的百般纠缠下妥协成允许用有线的^^)IO口接几个继电器即可,或直接用LED做虚拟演示就行.
要是非要用无线控制的话,有2种解决方案:
1种是只对具有红外遥控功能的家电起作用,此时需要对遥控器的一些按键进行解码,然后由单片机存储后,在"闹铃"时驱动红外线发射管编码输出.
另1种是用无线模块,市场上有卖的,编码解码芯片是2262,2272的有地址编码的那种,然后你就买一套发射的N套接收的,这种模块收发端一般有都有4路单向IO,工作时接收端的4个端口状态同步于发射端4个端口的状态.发射端模块的4路输入口直接接单片机的输出,至于接收端,如果只有4个以下的设备,就只买4个接收模块,每个接收模块只用到1个模块的输出口,举例说明:每个模块有4个输出口,分别编号1234,然后每个家电设备分配一个模块的一个输出口,如电视机分配1号输出口,电风扇分配2号输出口.....,当然,4个接收模块都必须用同一个接收地址,接收模块的输出直接接1个发光二极管演示即可.如果超过4个就比较麻烦了,需要加入逻辑电路处理,在这里就不讨论了.
问题3:前面有高手提示用液晶,但以我看来,此要求是为了考察学生对数码管动态扫描技术的了解,所以还是用数码管吧,用2个4位一体的数码管即可显示完时-分-秒 ,00-00-00正好8位.
最后给这位MM忠告:对自己不善长且以后也不想擅长的东西来说不要太较真了,直接去找你们学校科协,变相贿赂一下某某部长或主席,他会帮你解决问题的~呵呵.
Ⅱ 课程设计:单片机设计一个完整的时钟
S_SET BIT P3.2 ;数字钟秒控制位
M_SET BIT P3.3 ;分钟控制位
H_SET BIT P3.4 ;小时控制位
SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
TCNT EQU 34H
ORG 00H
SJMP START
ORG 0BH
LJMP INT_T0
START: MOV DPTR,#TABLE
MOV HOUR,#0 ;初始化
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
MOV TMOD,#01H
MOV TH0,#(65536-50000)/256 ;定时50毫秒
MOV TL0,#(65536-50000)MOD 256
MOV IE,#82H
SETB TR0
;****************************************************
;判断是否有控制键按下,是哪一个键按下
A1: LCALL DISPLAY
JNB S_SET,S1
JNB M_SET,S2
JNB H_SET,S3
LJMP A1
S1: LCALL DELAY ;去抖动
JB S_SET,A1
INC SECOND ;秒值加1
MOV A,SECOND
CJNE A,#60,J0 ;判断是否加到60秒
MOV SECOND,#0
LJMP K1
S2: LCALL DELAY
JB M_SET,A1
K1: INC MINUTE ;分钟值加1
MOV A,MINUTE
CJNE A,#60,J1 ;判断是否加到60分
MOV MINUTE,#0
LJMP K2
S3: LCALL DELAY
JB H_SET,A1
K2: INC HOUR ;小时值加1
MOV A,HOUR
CJNE A,#24,J2 ;判断是否加到24小时
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
LJMP A1
;****************************************************
;等待按键抬起
J0: JB S_SET,A1
LCALL DISPLAY
SJMP J0
J1: JB M_SET,A1
LCALL DISPLAY
SJMP J1
J2: JB H_SET,A1
LCALL DISPLAY
SJMP J2
;***********************************************
;定时器中断服务程序,对秒,分钟和小时的计数
INT_T0: MOV TH0,#(65536-50000)/256
MOV TL0,#(65536-50000)MOD 256
INC TCNT
MOV A,TCNT
CJNE A,#40,RETUNE ;计时1秒
INC SECOND
MOV TCNT,#0
MOV A,SECOND
CJNE A,#60,RETUNE
INC MINUTE
MOV SECOND,#0
MOV A,MINUTE
CJNE A,#60,RETUNE
INC HOUR
MOV MINUTE,#0
MOV A,HOUR
CJNE A,#25,RETUNE
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
RETUNE: RETI
;******************************************
;显示控制子程序
DISPLAY: MOV A,SECOND ;显示秒
MOV B,#10
DIV AB
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.6
MOV A,B
CLR P2.7
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.7
CLR P2.5
MOV P0,#40H
LCALL DELAY
SETB P2.5
MOV A,MINUTE ;显示分钟
MOV B,#10
DIV AB
CLR P2.3
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.3
MOV A,B
CLR P2.4
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.4
CLR P2.2
MOV P0,#40H
LCALL DELAY
SETB P2.2
MOV A,HOUR ;显示小时
MOV B,#10
DIV AB
CLR P2.0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.0
MOV A,B
CLR P2.1
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DELAY: MOV R6,#10
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
END
运行过~~!!!
Ⅲ 单片机课程设计 电子时钟 怎么做
你需要怎么做~~ 用定时中断~ 还是用时钟芯片,显示用数码管还是LCD
Ⅳ 单片机数字时钟课程设计
这个 我正在学单片机,也刚刚做过了这个实验没多久,不过我的是8098单片机,确实是汇编语言。不过我做的仅仅是个电子钟,你可以随时改变你输入的时间然后它就会按时分秒跳动,我做的是24小时制的。不过我没有弄闹钟额……不过也简单,可以弄一个中断申请就ok。话说你的闹钟要求是什么?我记得8098是不能响的,只有一个发光二极管可以亮一亮……
话说能请你把问题补充一下么?我的程序写在纸上,然后我们还要求是要把程序翻译出机器码然后在单片机上实验出结果的。所以我连机器码都翻译了的……实在不知道你们的要求。
原理可以先和你说一下:主程序先是一系列的初始化(中断悬挂的清零和寄存器的设置,堆栈的设置等),然后开启中断,写显示程序(显示程序前要弄好你显示的寄存器以及扫描子程序的地址,还要对十六进制数进行转换变成十进制数,只要做一个除法就行,用十六进制数除以A就能够得出相应的十进制数。)
然后就是你的中断程序了,比如你的中断申请是每10ms申请一次,那你就计数,如果到了100次中断了,那就秒加一,再查看秒是否到60,是则清零让分加一,否则跳到中断程序末端;然后再依次查分和时。最后中断程序的末端还要用一次计时器软件中断申请。再跳回主程序反复运行。可能比较麻烦,我记得我打的草稿就好多张纸呢,后来在16进制向10进制转换的时候还出了个寄存器的问题。
不知道和你程序的要求是否相同= =。
期待你能够补充一下你的问题。
Ⅳ 单片机89c51的电子时钟课程设计
#include <reg52.h>
#include<stddef.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_FLAG
#define LCD1602_PORT P0
sbit lcd1602_rs=P2^0;
sbit lcd1602_e=P2^2;
sbit lcd1602_rw=P2^1;
sbit lcd1602_busy=P0^7;
sbit key_ch=P3^5;
sbit key_add=P3^6;
sbit key_minus=P3^7;
uchar i,sec,min,h,date,month,flag;
uint year;
uchar *chgstr[7]={" ","sec","min","hour","date","min","year"};
uchar j,k,m,n,o,p;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar timestr[10],datestr[10];
void init();
void delay(uint);
void time_display();
void date_display();
void control();
void time();
/*
************************************
* 函数名称:lcd1602_CheckBusy()
* 函数功能:状态查询
************************************
*/
void lcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}
/*
***************************************
* 函数名称: lcd1602_WriteCmd()
* 函数功能:写命令
* 入口参数:命令字
* 出口参数:无
***************************************
*/
void lcd1602_WriteCmd(const uchar cmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}
/*
*******************************************
* 函数名称:lcd1602_WriteData()
* 函数功能:写数据
* 入口参数:c--待写数据
* 出口参数:无
*********************************************
*/
void lcd1602_WriteData(const uchar c)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=c;
lcd1602_e=0;
}
/*
***********************************************
* 函数名称:lcd1602_Init()
* 函数功能:初始化LCD
* 入口参数:无
* 出口参数:无
***********************************************
*/
void lcd1602_Init()
{
lcd1602_WriteCmd(0x38); //显示模式为8位2行5*7点阵
lcd1602_WriteCmd(0x0c); //display enable,flag enable,flash enable,
lcd1602_WriteCmd(0x06); //flag move to right,screen don't move
lcd1602_WriteCmd(0x01); //clear screen
}
/*
************************************************
* 函数名称:lcd1602_Display()
* 函数功能: 字符显示
* 入口参数:ptr--字符或字符串指针
* 出口参数:无
* 说 明:用户可通过以下方式来调用:
* 1)lcd1602_Display("Hello,world!");
* 2) INT8U 存储类型 txt[]="要显示的字符串";
* 或者 INT8U 存储类型 txt[]={'t','x','t',..,'