致谢
此次设计是在朱俊老师的悉心指导下完成的。导师为论文课题的研究提出了许多指导性的意见,为论文的撰写、修改提供了许多具体的指导和帮助。通过此次设计,一方面让我认识到自己的不足,发现了学习中的错误之处;另一方面又积累丰富的知识,吸取别人好的方法和经验,增强对复杂问题的解决能力,摸索出一套解决综合问题的方法,为自己以后的工作和学习打下坚实的基础。再一方面也加强了我和老师的交流,认识到知识的渊博度。经过这次的努力,使我顺利的完成了毕业设计。这份毕业设计既是对过去三年所学知识的总结,又是自己知识的积累,也大大加深了对单片机技术的了解。鉴于本人所学知识有限,经验不足,又是初次研究这种复杂的设计,在此过程中难免存在一些错误和不足之处,恳请各位老师给予批评和指正。
21
参考文献
[1] 张永格 何乃味 单片机C语言应用技术与实践 北京交通大学出版社 2009 [2] 谭浩强 C语言程序设计 清华大学出版社2008
[3] 张玉莲 传感器与自动检测技术(第2版) 机械工业出版社2012 [4] 胡宴如 耿苏燕 模拟电子技术基础 (第2版) 高等教育出版社2004 [5] 刘卫国 程序设计与应用(第二版) 高等教育出版社2006
[6] 叶建波 电路设计与制版技术 清华大学出版社 北京大学出版社2011 [7] 钱静 单海宁 电路基础(第五版) 南开大学出版社2010
[8] 廖超平 黄守宁 EDA技术与VHDL实用教程 高等技术教育出版社2007
附录一 程序源代码
#include
typedef unsigned char BYTE; //用BYTE代替unsigned char typedef unsigned int WORD;//WORD代替unsigned int typedef bit BOOL ;//用BOOL代替bit
sbit rs = P3^2; //复位端 sbit rw = P3^1; //写数据端 sbit ep = P3^0; //使能端
sbit LED1=P2^0;
BYTE code dis1[] = {\BYTE code dis2[] = {\
/*******************延时函数********************/ delay(BYTE ms) { BYTE i; while(ms--) { for(i = 0; i< 250; i++)
22
{ _nop_(); _nop_(); //空执行消耗CPU时间达到等待的效果 _nop_(); _nop_(); } } }
/*******************LCD侧忙函数********************/ BOOL lcd_bz() { BOOL result; rs = 0; rw = 1; ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); result = (BOOL)(P0 & 0x80); //检测P0最高位是否为1 ep = 0; return result;//返回侧忙结果 }
lcd_wcmd(BYTE cmd) { // 写入指令数据到LCD while(lcd_bz()); rs = 0; rw = 0; ep = 0; _nop_(); _nop_(); P0 = cmd; //将8位指令通过P0口传给1602 _nop_(); _nop_();//用于产生一个脉冲宽度 _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0;
23
}
lcd_pos(BYTE pos) { //设定显示位置 lcd_wcmd(pos | 0x80); }
lcd_wdat(BYTE dat) { //写入字符显示数据到LCD while(lcd_bz()); rs = 1; rw = 0; ep = 0; P0 = dat;//将8位数据通过P0口传给1602 _nop_(); _nop_(); _nop_(); //用于产生一个脉冲宽度 _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; }
lcd_init() { //LCD初始化设定 lcd_wcmd(0x38); ////16*2显示,5*7点阵,8位数据 delay(1); lcd_wcmd(0x0c); //显示开,关光标 delay(1); lcd_wcmd(0x06); //移动光标 delay(1); lcd_wcmd(0x01); //清除LCD的显示内容 delay(1); }
#define true 1 #define false 0
bit b_tick_flag,b_second_event,b_minute_event,b_tick_flash; unsigned char tick_counter,second_counter;
24
///////////////////定时器初始化及中断、延时函数////////////////////////////////////////////// void Time_Init(void) //定时器初始化及中断、延时函数 {
//Timer_init
//========定时器0作为20MS一次的主循环定时============// //晶振:11.0592 10ms 0xdc 0x00 20ms 0xb8 0x00 //晶振:22.1184 10ms 0xb8 0x00 20ms 0x70 0x00 //========定时器0作为20MS一次的主循环定时============// b_tick_flag = 0; b_second_event = 0; b_minute_event = 0; b_tick_flash = 0; TMOD = 0x21; //time0 is 16bit counter,timer1 is 8 bit,auto reload; TH0 = 0xB8 ; TL0 = 0x00 ; ET0 =1; TR0 = 1; }
void TimerService(void) //timer service function { if(b_tick_flag == true) { b_tick_flag = false; tick_counter++; if(tick_counter==0)b_tick_flash=true;//闪烁的频率控制,大约为100ms if(tick_counter == 50) { tick_counter = 0; b_second_event = true; second_counter++; if(second_counter ==60) { second_counter = 0; b_minute_event = true; } } } }
void Timer0_interrupt() interrupt 1 using 0 {
TF0 = 0; //清除中断标志 TR0 = 0; //暂停计时 TH0 = 0xb8;
25
TL0 = 0x00; b_tick_flag = true; // ET0=1; TR0 = 1; return; }
main() { BYTE i; lcd_init(); //初始化LCD delay(10); Time_Init(); while(1) { TimerService(); lcd_pos(4); //设置显示位置为第一行的第5个字符 i = 0; while(dis1[i] != '\\0') { //显示字符\ lcd_wdat(dis1[i]); i++; } lcd_pos(0x41); //设置显示位置为第二行第二个字符 i = 0; while(dis2[i] != '\\0') { lcd_wdat(dis2[i]); //显示字符\ www.PRECHIN.com \ i++; } // if(b_tick_flash == true) // {
// b_tick_flash = false; LED1=~LED1; // } } }
26