单片机原理及应用课程设计-电子时钟.doc

上传人:哈尼dd 文档编号:5019050 上传时间:2020-01-29 格式:DOC 页数:18 大小:1.23MB
返回 下载 相关 举报
单片机原理及应用课程设计-电子时钟.doc_第1页
第1页 / 共18页
单片机原理及应用课程设计-电子时钟.doc_第2页
第2页 / 共18页
单片机原理及应用课程设计-电子时钟.doc_第3页
第3页 / 共18页
单片机原理及应用课程设计-电子时钟.doc_第4页
第4页 / 共18页
单片机原理及应用课程设计-电子时钟.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《单片机原理及应用课程设计-电子时钟.doc》由会员分享,可在线阅读,更多相关《单片机原理及应用课程设计-电子时钟.doc(18页珍藏版)》请在三一文库上搜索。

1、J I A N G S U U N I V E R S I T Y单片机原理及应用课程设计 学院名称:计算机科学与通信工程学院专业班级:通信工程0901学生姓名:学生学号:指导教师:熊 书 明 2012年01月 11日一、设计目的1、熟悉键盘的工作原理,掌握HD7279A芯片实现键盘扫描程序设计及调试方法;2、了解掌握定时器的选择和编程方法,了解定时器中断服务程序设计方法;内部功能模块如定时器/计数器、中断、片内外存储器、I/O口、串行口通讯等;3、进一步熟悉和掌握单片机的结构和工作原理;4、通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术;5、在课程设计过程中,不断调试程序和修改

2、程序,提高了对单片机的应用能力,分析问题和解决问题的能力;6、熟悉日历时钟的编程方法。二、设计方案(包括文字说明,程序框图,加注释的核心源程序清单)1、功能要求1)能在LED显示器上实现正常的时分秒计时;2)能通过键盘输入当前时间,并从该时间开始计时;3)有校时 、校分功能;4)有报时功能,通过指示灯表示;5)有闹时功能,闹时时间可以设定,通过指示灯表示。2、文字说明 HD7279是一片具有串行接口的,可用于驱动8位共阴极式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示、键盘接口的全部功能。 HD7279内部含有译码器,可直接接受

3、BCD码或者16进制码,并同时具有两种译码方式,此外还有消隐、闪烁、左移、右移、段寻址等多种控制指令。 HD7279具有片选信号,可方便地实现多于8位的显示或多于64键的键盘接口。 3、程序框图: NoYesNoYesNoYesYesNoYesNoYesNoYes开始关看门狗初始化时钟初始化定时器初始化I/O口初始化SPI0使能比较器1使能片内参考电压使能DAC0显示时间并开始正常的时分秒计时按键为F?停止计时按键为E?无反应,依然时分秒计时设置时间按键为Dd?设置闹铃KeyValue%16=1?校时加12?校时减13?校分加14?校分减1D?FlashLED(8)结 束 4、核心源程序清单:

4、/*test7279*#include c8051f020.h #include /和通信10届的同学一起上电路分析很愉快。如果你在文库里找到了另外一份/08届一班学号12号上传、财富值为5分的,最好不要下载,很让人抓狂。如/果已经下载我也无话可说。sbitHD7279_DAT=P17; sbitHD7279_CLK=P16;#define NOSELECT7279 P5 |= 0x80/片选置1,未选中#define SELECT7279 P5 &= (0x80) /片选清零,选中#define Set7279DAT HD7279_DAT=1 /数据线置1#define Clr7279DAT

5、 HD7279_DAT=0 /数据线置0#define Set7279CLK HD7279_CLK=1 /时钟高电平#define Clr7279CLK HD7279_CLK=0 /时钟低电平/ HD7279测试/演示程序 /I/O口初始化 void Delay1ms(unsigned char T); /延时T毫秒void Delay1s(unsigned char T); / 延时T秒void Delay1us(unsigned char T); /延时T微秒/仿真总线时序发送一个字节void Send7279Byte(unsigned char ch)char i;SELECT7279;

6、 /置CS低电平 Delay1us(50); /延时50for (i=0;i8;i+) if (ch&0x80) /输出7位到HD7279A的DATA端 1000 0000Set7279DAT; /数据线置1elseClr7279DAT; /数据线置0Set7279CLK; /置CLK高电平 ch=ch1; /待发数据左移 Delay1us(8); /延时8Clr7279CLK; /置CLK低电平 Delay1us(8); /延时50Clr7279DAT; /发送完毕,DATA端置低,返回 /总线时序接收一个字节unsigned char Receive7279Byte(void)unsign

7、ed char i,ch;ch=0;Set7279DAT; /DATA端置为高电平,输入状态Delay1us(50); /延时50for (i=0;i8;i+)Set7279CLK; /置CLK高电平Delay1us(8); /延时8ch=ch1; /接收数据左移1位if (HD7279_DAT)ch+=1; /接收1位数据Clr7279CLK; /置CLK低电平Delay1us(8); /延时8Clr7279DAT; /接收完毕,DATA端重新置成低电平(输出状态)return ch;void BlankLED(unsigned char ch)Send7279Byte(0x98); /发消

8、隐指令 Send7279Byte(ch); /1-显示 0-消隐NOSELECT7279; /置CS高电平 unsigned char code BdSeg= 0x7e,0x30,0x6d,0x79, / 0 1 2 3 0x33,0x5b,0x5f,0x70, / 4 5 6 7 0x7f,0x7b,0x77,0x1f, / 8 9 a b 0x4e,0x3d,0x4f,0x47, / c d e f 0x00,0x01; /* b6 - b1| b0 |b5 - small b2| b3 |b4 - .b7*/void DispLED(char *DispBuf,char ShowDot)

9、 / ShowDot显示小数点位 char i,ch;ShowDot-;for (i=0;i=a) & (ch=A) & (ch=F) ch-=A;ch+=0xa;Send7279Byte(0x90+5-i); /用不译码方式显示第i位if (ch= )Send7279Byte(0x00); elseif (ch=-)Send7279Byte(0x01); else if (ShowDot=i) /查表显示,同时点亮小数点Send7279Byte(0x80|BdSegch&0x0f); elseSend7279Byte(BdSegch&0x0f); NOSELECT7279; / /置CS高电

10、平 /*S-3530A*#include c8051f020.h #include #include test7279.hUnsigned char Count1ms,set,set1,set2;/set用于标识是否停止计时,set1用于标识/是否设置时间,set 2用于标识是否设置闹钟 /按1校时加1,按2校时减1,按3校分加1,按4校分减1 static int time3=23,59,50;/当前时间static char disptime6=2,3,5,9,5,0;/初始时间int dertime3=00,00,01;/存放时间的中间变量 int nowtime3=00,01,00;/

11、闹钟时间void Delay1us(unsigned char us)while (us) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); /占用一个指令周期 -us;void SYSCLK_Init (void) int i; / delay counter OSCXCN = 0x67; / start external oscillator with / 22.1184MHz crystal for (i=0; i 256; i+) ; / Wait for osc. to start up while (!(OSCXCN & 0x80) ; /

12、Wait for crystal osc. to settle OSCICN = 0x88; / select external oscillator as SYSCLK / source and enable missing clock / detector/OSCICN = 0x07; /interal 16MHZ#define PRT0CF P0MDOUT#define PRT1CF P1MDOUT#define PRT2CF P2MDOUTvoid PORT_Init (void) XBR0 = 0x07; / Enable SMBus, SPI0, and UART0 XBR1 =

13、0x00; XBR2 = 0x44; / Enable crossbar and weak pull-ups EMI0TC = 0x21; P74OUT = 0xFF; P0MDOUT = 0x15; P1MDOUT |= 0x3C; /P1.2-P1.5推挽输出 P1 &= 0xc3; /P1.2-P1.5=0void SPI0_Init (void) SPI0CFG = 0x07; / data sampled on 1st SCK rising edge / 8-bit data words SPI0CFG|=0xC0; /CKPOL =1; SPI0CN = 0x03; / Maste

14、r mode; SPI enabled; flags / cleared SPI0CKR = SYSCLK/2/8000000-1; / SPI clock =0) & (KeyValue%16)=9) /i=5 4 3 2 1 0 disptime5-i=KeyValue;if(disptime0=1) | (disptime0=2) & (disptime14) & (disptime26) & (disptime46) ) /符合数字时钟的实际意义 Send7279Byte(0xC8+i); Send7279Byte(KeyValue); NOSELECT7279; i-; if(i0)

15、 break; for (j=0;j3;j+) /将显示的时间赋值给存放时间的变量 dertimej=disptime2*j*10+disptime2*j+1; if(set1) set1=!set1;/ 设置时间后复位if(set2) set2=!set2;/ 设置闹钟后复位void FlashLED(unsigned char No)char i;Send7279Byte(0x88);/发闪烁指令 i=0x1;while (No)i=i1;No-;Send7279Byte(i); /1闪烁NOSELECT7279; /置CS高电平 /*main函数*void main(void)char

16、j,KeyValue; WDTCN = 0xde;WDTCN = 0xad; /关看门狗SYSCLK_Init (); /初始化时钟Timer0_Init();/初始化定时器PORT_Init (); /初始化IO口SPI0_Init (); /初始化SPI0CPT1CN|=0x80;/使能比较器1REF0CN = 0x03; /使能片内参考电压DAC0CN |= 0x80;/使能DAC0DAC0H=0;DAC0L=0;EA=1;/开中断Delay1us(25000);/等待25ms复位时间 Send7279Byte(0xA4); /发复位指令 NOSELECT7279; DispLED(di

17、sptime,0); /显示初始时间while(1) /见流程图 KeyValue=GetKeyValue(); WaitKeyOff(); if(KeyValue%16)=0x0f) set=!set; if(set) /启停* if(KeyValue%16)=0x0e)set1=!set1;/ 设置时间if(KeyValue%16)=0x0d)set2=!set2;/ 设置闹钟if(set1)/设置时间* DispLED(-,0);inputnum();for (j=0;j3;j+) /int-char timej=dertimej; if(set2)/ 设置闹钟* DispLED(-,0

18、);inputnum();for (j=0;j10)&(time0=nowtime0)FlashLED(8);if (time2=60) /分time2=0;time1=time1+1;if (time1=60) / 时time1=0;time0=time0+1;if(time1=00) & (time2=00) FlashLED(8);if (time0=24) time0=0; if (set!=1) for (i=0;i3;i+) /将time里面的数字拆开放在disptime里 disptime2*i=timei/10; disptime2*i+1=timei%10; DispLED(

19、disptime,0); /显示时间* 三、调试过程(调试中出现的问题、解决的方法)问题1:只能通过修改程序里面的int nowtime3=00,01,01;改变闹钟时间。 通过添加程序模块if(set2)/ 设置闹钟* DispLED(-,0);inputnum();for (j=0;j3;j+) /int-char nowtimej=dertimej;/nowtimej闹钟时间 可以通过键盘修改闹钟时间。问题2:数组类型不匹配问题static int time3=23,59,50;static char disptime6=2,3,5,9,5,0;int dertime3=00,00,01

20、;通过程序语句disptime2*i=timei/10; disptime2*i+1=timei%10;拆分 for (j=0;j3;j+) /int-char dertimej=disptime2*j*10+disptime2*j+1; 整合解决。问题3:如何实现数字时钟1s跳一次首先选定定时器T0,工作在方式1 ,12分频。计算初值9e58H,使LED闪烁周期为25000s,循环40次,达到工作频率为1Hz。CKCON&=0xf7;/12分频 TMOD=0x01; /定时器0 工作在方式1 TR0 = 0; /启动定时器Count1ms=40; / STOP Timer0TH0 = 0x9

21、e; TL0 = 0x58;问题4:不能反复定时或设定闹铃,只能设置一次。要对set1,set2进行复位操作。if(set1) set1=!set1;/ 设置时间后复位if(set2) set2=!set2;/ 设置闹钟后复位问题5:对键盘按键输入的数值进行软件限定解决方案:if(disptime0=1) | (disptime0=2) & (disptime14) & (disptime26) & (disptime46) ) /符合数字时钟的实际意义问题6:如何实现在校时功能中,小时位置00与23、分钟位置00与59的互相转换。解决方案:case 1:time0=(time0+1+24)%

22、24;break;case 2:time0=(time0-1+24)%24;break;case 3:time1=(time1+1+60)%60;break;case 4:time1=(time1-1+60)%60;break;四、调试结论(有无达到设计要求等) 1、程序从23:59:50开始运行,23:59:55开始闪烁,00:00:00时刻结束。设置初始定时时间为00:01:01,到这个时刻闪烁10秒后停止闪烁。 2、按f键,可控制时钟的停止和开始; 3、先按f键然后按e键,可调整时钟的时间; 4、先按f键然后按d键,可调整闹钟的时间; 5、按1键可使时钟+1;按2键可使时钟-1; 6、按

23、3键可使分钟+1;按4键可使分钟-1;五、经验总结我在课程设计一开始就很快地定下了第四个课题日历时钟与键盘显示程序设计,以为会很简单。但第一次课设我就意识到了这种想法有多么可笑。这个课题比想象中要难很多。绝大多数人选择选择点阵式液晶显示屏的显示程序设计,身为少数派的自己几乎没有可以一起探讨一起研究的同伴。也曾经想过要不要换大众课题。最终还是放弃了这种想法。路漫漫其修远兮,吾将上下而求索。虽然这次的课程设计算起来在实验室的时间只有四天,但在这四天学到了不少东西。平时上课很多含糊的知识通过这次课程设计中有点明白了。一开始对代码修改几乎毫无头绪,通过几次实验的努力与思考,最终能比较熟练的在实验平台上进行操作了。要自己熟练地掌握一个软件,唯有将更多的功夫得花在课下。只有不停的探索,不住的磨练,才能使我们掌握一门技术,单片机技术即是如此。再次感 谢老师的辅导以及同学的帮助,是他们让我有了一个更好的认识,无论是学习还是生活,生活是实在的,要踏实走路。课程设计时间虽然很短,但我学习了很多的东西,使我眼界打开,感受颇深。

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

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1