单片机系统课程设计
图5.1
经过一周的资料查找和设计,我已完成了单片机的课程设计。通过这次设计学到了不少东西,动手操作后才知道,理论和实践的差别。就软件部分的程序的编写花费了好长时间,还有画图方面,都是通过自己学习后,才开始做的。
同时,由于设计的时间和能力有限,还有许多功能和技术没有充分研究,可能存在不合理的地方。但是,一个完整的课程设计过程,让我掌握了单片机系统和电子操作软件等方面的知识,尤其是熟悉了用protel画电路原理图和用visio画程序流程图。这使我在动手能力方面有很大的提升,也给今后更成功、完善的设计打下坚实的基础。
参考文献
[1] 张迎新.单片机原理、应用及接口技术.国防工业出版社,1993 [2] 王青林 张伟 赵静波Protel 99se基础教程.人民邮电出版社 2013/12/9 [3] 邓兴成.单片机原理与实践指导.北京:机械工业出版社,2010 [4] 阎石.数字电子技术基础.北京:高等教育出版社,2009.
附录
#include
15
单片机系统课程设计 #include
#define uint unsigned int typedef unsigned char uint8;
sbit RS = P1^0; //定义端口 sbit RW = P1^1; sbit DS = P1^6; sbit KQ = P1^7; sbit EN = P2^5; sbit DU = P2^0; sbit WE = P2^1; sbit BF = P0^7 ;
sbit FM = P2^3;
sbit k1=P3^0; sbit k2=P3^1; sbit k3=P3^2; sbit k4=P3^3; sbit k5=P3^4; sbit k6=P3^5; sbit k7=P3^6; sbit k8=P3^7;
#define RS_CLR RS=0 #define RS_SET RS=1
#define RW_CLR RW=0 #define RW_SET RW=1
#define EN_CLR EN=0 #define EN_SET EN=1
#define DataPort P0
void cmg88()//关数码管,点阵函数 {
DU=1; P0=0X00; DU=0; }
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
16
单片机系统课程设计 unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS
------------------------------------------------*/ void DelayUs2x(unsigned char t) {
while(--t); }
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编 ------------------------------------------------*/ void DelayMs(unsigned char t) {
while(t--) {
//大致延时1mS DelayUs2x(245); DelayUs2x(245); } }
/*------------------------------------------------ 判忙函数
------------------------------------------------*/ bit LCD_Check_Busy(void) {
DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET;
return (bit)(DataPort & 0x80); }
/*------------------------------------------------ 写入命令函数
------------------------------------------------*/ void LCD_Write_Com(unsigned char com) {
while(LCD_Check_Busy()); //忙则等待
17
单片机系统课程设计 RS_CLR; RW_CLR; EN_SET;
DataPort= com; _nop_(); EN_CLR; }
/*------------------------------------------------ 写入数据函数
------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) {
while(LCD_Check_Busy()); //忙则等待 RS_SET; RW_CLR; EN_SET;
DataPort= Data; _nop_(); EN_CLR; }
/*------------------------------------------------ 清屏函数
------------------------------------------------*/ void LCD_Clear(void) {
LCD_Write_Com(0x01); DelayMs(5); }
/*------------------------------------------------ 写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_Write_Com(0x80 + x); //表示第一行 } else
{
LCD_Write_Com(0xC0 + x); //表示第二行 } while (*s)
18
单片机系统课程设计 {
LCD_Write_Data( *s); s ++; } }
/*------------------------------------------------ 初始化函数
------------------------------------------------*/ void LCD_Init(void) {
LCD_Write_Com(0x38); //显示模式设置 DelayMs(5);
LCD_Write_Com(0x38); DelayMs(5);
LCD_Write_Com(0x38); DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/
LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5);
LCD_Write_Com(0x0C); /*显示开及光标设置*/ }
void wait(void) { P0 = 0xFF; do { RS = 0; RW = 1; EN = 0; EN = 1; }while (BF == 1); EN = 0; }
void w_dat(uint8 dat) { wait(); //忙则等待 EN_CLR;
19