单片机原理及应用课程设计-电子时钟.doc_第1页
单片机原理及应用课程设计-电子时钟.doc_第2页
单片机原理及应用课程设计-电子时钟.doc_第3页
单片机原理及应用课程设计-电子时钟.doc_第4页
单片机原理及应用课程设计-电子时钟.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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、在课程设计过程中,不断调试程序和修改程序,提高了对单片机的应用能力,分析问题和解决问题的能力;6、熟悉日历时钟的编程方法。二、设计方案(包括文字说明,程序框图,加注释的核心源程序清单)1、功能要求1)能在led显示器上实现正常的时分秒计时;2)能通过键盘输入当前时间,并从该时间开始计时;3)有校时 、校分功能;4)有报时功能,通过指示灯表示;5)有闹时功能,闹时时间可以设定,通过指示灯表示。2、文字说明 hd7279是一片具有串行接口的,可用于驱动8位共阴极式数码管(或64只独立led)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成led显示、键盘接口的全部功能。 hd7279内部含有译码器,可直接接受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、核心源程序清单:/*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 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; /置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)unsigned 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); /发消隐指令 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) / 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高电平 /*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;/闹钟时间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) ; / 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 = 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; / master 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) 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 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(disptime,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);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(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;通过程序语句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 = 0x9e; 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)%24;break;case 2:time0=(time0-1+24)%24;break;case 3:tim

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论