单片机课程设计指导

  • b9_453111
    了解作者
  • 770.4KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-15 02:48
    上传日期
单片机课程设计指导,内含各个案例,用c语言,汇编两种方案,极好的课设参考。
单片机课程设计指导.rar
内容介绍
#include <reg52.h> //89C52单片机头文件 #include <LCD_code.h> //液晶LCD的字模文件 #include <intrins.h> //功能引脚定义 sbit A = P0^7; //数据1/命令0选择 sbit RW = P0^6; //读1/写0 sbit E1 = P0^4; //片选1(Master) sbit E2 = P0^5; //片选2(slave) sbit LED= P0^3; //背光 sbit up = P0^0; //向上翻页键 sbit down= P0^1; //向下翻页键 #define data P2 //液晶并行数据 //液晶显示控制命令表 #define disp_on 0xAf //显示关闭 #define disp_off 0xAe //显示打开 #define disp_start_line 0xC0 //显示起始地址(后5位-表示0-31行) #define page_addr_set 0xB8 //页地址设置(0~3) #define col_addr_set 0x00 //列地址设置(0~61) #define status_busy 0x80 //0=ready #define modeRWite 0xEE //写模式 #define dynamic_driver 0xA4 //动态驱动 #define adc_select 0xA0 //clockwise #define clk32 0xA9 //刷新时钟设置1/32 #define clk16 0xA8 //刷新时钟设置1/16 #define reset 0xE2 //软件复位 #define uchar unsigned char #define uint unsigned int //全局变量,及标志位定义 uchar time_counter = 0; //定时器的软件计数器 uchar key = 0; //键盘值 uchar serial_counter; //串行计数器 bit disp_flag = 0; //显示更新标志 uchar bdata serial_byte = 0; //串行口标志位定义字节 sbit Sflag = serial_byte^0; //串行接收头部标志,一下8个都定义在'serial_byte'内 sbit G1flag = serial_byte^1; sbit Pflag = serial_byte^2; sbit G2flag = serial_byte^3; sbit G3flag = serial_byte^4; sbit Aflag = serial_byte^5; sbit DFflag = serial_byte^6; sbit ENflag = serial_byte^7; bit r_flag = 0; unsigned char idata serial_buff[77]; //串行接收缓冲 //uchar code head[] = {'$','G','P','G','G','A',','}; //bit serial_flag = 0; ////液晶操作主要函数//////////////////////////////////////////////////////////// //void lcd_init(void) //引用:lcd_init(); 说明:LCD初始化; //////////////////////////////////////////////////////////////////////////////// //void lcd_clr(void) //引用:lcd_clr(); 说明:LCD清屏; //////////////////////////////////////////////////////////////////////////////// void lcd_init(void); //LCD初始化 void lcd_clr(void); //LCD清屏 void wait_ready(void); //等待ready void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp); //点阵码显示输出 void ASCII2BCD(void); //ASCII码转换为BCD码 void logo(void); //开机画面显示 /*---------------------------------------------------------------------------- 中断程序 -----------------------------------------------------------------------------*/ //////////////////////////////////////////////////////////////////////////////// //定时器0中断函数,用于控制背光灯延时10S熄灭 /////////////////////////////////////////////////////////////////////////////// void int_t0() interrupt 1 using 1 { //定时器0中断函数,用于控制背光灯延时10S熄灭 TH0 = 0x4C; TL0 = 0x00; //重装定时器0,定时50mS time_counter ++; //软件计数器+1; if (time_counter == 200) //软件计数器定时到10S,关背光,定时器0,清软件计数器 { time_counter = 0; LED = 1; TR0 = 0; } } //////////////////////////////////////////////////////////////////////////////// //串行口中断函数,用于语句'$GPGGA'判断和此语句的接收 /////////////////////////////////////////////////////////////////////////////// void serial() interrupt 4 using 2 { uchar pp; RI=0; pp=SBUF; if(ENflag==1) //串口接收完毕,可以用来显示,清标志位重新开始 { disp_flag=1; serial_byte = 0; } else if(DFflag==1) //'$GPGGA'头判断完毕,开始接收$GPGGA,语句的数据 { if(pp==42) ENflag=1; //等待收到'*'结束接收 else { serial_buff[serial_counter]=pp; //没收到'*',继续接收,数据放入串口缓冲 serial_counter++; } } else if(Aflag==1) //第六个为'A',判断第七个是不是',' { if(pp==44) DFflag=1; //第七个个是','开始接收$GPGGA,语句的数据 else serial_byte = 0; //不是',',清标志位 } else if(G3flag==1) //第五个为'G',判断第六个是不是'A' { if(pp==65) Aflag=1; //第六个是'A'判断下一个是不是',' else serial_byte = 0; //不是'A',清标志位 } else if(G2flag==1) //第四个为'G',判断第五个是不是'G' { if(pp==71) G3flag=1; //第五个是'G'判断下一个是不是'A' else serial_byte = 0; //不是'G',清标志位 } else if(Pflag==1) //第三个为'P',判断第四个是不是'G' { if(pp==71) G2flag=1; //第四个是'G'判断下一个是不是'G' else serial_byte = 0; //不是'G',清标志位 } else if(G1flag==1) //第二个为'G',判断第三个是不是'P' { if(pp==80) Pflag=1; //第三个是'P'判断下一个是不是'G' else serial_byte = 0; //不是'P',清标志位 } else if(Sflag==1) //第一个为'$',判断第二个是不是'G' { if(pp==71) G1flag=1; //第二个是'G'判断下一个是不是'P' else serial_byte = 0; //不是'G',清标志位 } else if(pp==0x24) //判断第一个是不是$ { Sflag=1; //第一个为$,判断下一个是不是G serial_counter=0; //串行计数器清零 } } /* void serial() interrupt 4 using 2 { uchar i,buff; RI = 0; buff = SBUF; if(serial_flag == 1) { serial_buff[serial_counter] = buff; serial_counter ++; if(serial_counter > 37) { serial_flag = 0; serial_counter = 0; for(i=0;i>7;i++) { if(head[i] == serial_buff[i]) { disp_flag = 1; } else { disp_flag = 0; i = 8; } } } } else { if(SBUF == '$') { serial_buff[0] = buff; serial_flag = 1; serial_counter ++; } else { serial_flag = 0; serial_counter = 0; } } } */ //////////////////////////////////////////////////////////////////////////////// //调用方式:void send_mi(uchar instuction) //函数说明:发指令instruction到主窗口(内函数,私有,用户不能直接调用) //////////////////////////////////////////////////////////////////////////////// void send_mi(uchar instruction) { E2 = 0; //关Slaver E1 = 1; //开Master wait_ready(); //判断忙 A = 0; //指令 RW = 0; //写触发 data = instruction; //指令码 E1 = 0; //关Master } //////////////////////////////////////////////////////////////////////////////// //调用方式:void OutMD(uchar i) //函数说明:发数据data到主窗口(内函数,私有,用户不能直接调用) //////////////////////////////////////////////////////////////////////////////// void send_md(uchar c) { E2 = 0; //关Slaver E1 = 1; //开Master wait_ready(); //判断忙 A = 1; //数据 RW = 0; //写触发 data = c; //数据 E1 = 0; //关Master } //////////////////////////////////////////////////////////////////////////////// //调用方式:void send_si(uchar instruction) //函数说明:发指令instruction到从窗口(内函数,私有,用户不能直接调用) //////////////////////////////////////////////////////////////////////////////// void send_si(uchar instruction) { E1 = 0; //关Master E2 = 1; //开Slaver wait_ready(); //判断忙 A = 0; //指令 RW = 0; //写触发 data=instruction; //指令码 E2 = 0; //关Slaver } //////////////////////////////////////////////////////////////////////////////// //调用方式:void send_sd(uchar data) //函数说明:发数据data到从窗口(内函数,私有,用户不直接调用) //////////////////////////////////////////////////////////////////////////////// void send_sd(uchar c) { E1 = 0; //关Master E2 = 1; //开Slaver
评论
    相关推荐
    • AVR单片机C语言
      AVR单片机C语言
    • 单片机C语言编程课件
      单片机C语言编程与实践课件,里面有各种程序实现的代码 实现的方法 AD转换器 wire总线 串行通信 按键接口 中断定时 数码管显示等
    • 经典单片机C语言教程
      经典单片机C语言教程,经典不容错过! 经典单片机C语言教程,经典不容错过! 经典单片机C语言教程,经典不容错过! 经典单片机C语言教程,经典不容错过! 经典单片机C语言教程,经典不容错过!
    • 单片机 C语言 课件
      单片机C语言 课件单片机C语言 课件单片机C语言 课件
    • 单片机C语言编程
      这是本单片机开发入门书籍初学者通过这本入门书籍能够熟练掌握单片机的基本编程技能
    • 单片机C语言资料
      该文件为单片机相关资料,里边涉及了与单片机有关的C语言编程,资料分为几个部分,内容较为详细,有意学习单片机编程的同学的以下载学习。
    • 单片机 C语言 教程
      单片机 编程学习指南(很适用于初学者) 含单片机各种应用的源程序及详细讲解
    • 单片机C语言开发
      本文对C语言开发特别是对在汇编语言有一定经验的工作人员想转入潜入式C开发有一定帮助.
    • 单片机c语言教程 单片机c语言教程下
      单片机C语言教程 单片机关于C语言教程 (下) 接单片机关于C语言教程 (上) 教程简单明了 易于上手 可谓速成班
    • 单片机 C语言进阶
      总共7章可使你对单片机有更深入的了解~对单片机C语言有基础想对单片机C语言的朋友可以参考一下