⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mnck.c

📁 51单片机模拟串口
💻 C
字号:
//本程序为Franklin/keil  C51源程序,可以在所有51系列(或兼容)单片机中运行。
//完成功能:使用任意1个引脚模拟串行接口,实现对KY系列智能液晶终端进行控制.
//程序中给出了设计方法,通过修改TIMEzq使本程序适用于各种晶振及各种波特率.
//本例为:当通讯波特率=9600Hz,单片机晶振=18.432MHz时,TIMEzq=50
//        使用P1.1模拟串口,使用P1.2检测"忙"信号.
//本程序在Wave For windows ver 2.80仿真软件编译成功。
//在AT89C51(9600Hz,18.432MHz)中运行通过.运行结果是:每隔1秒,显示3个字母.
//=========================================================================================
#include "reg51.h"
#define  uchar     unsigned char
sbit     ZD_DATA   =P1^1; //向液晶终端输出串行数据,使用模拟串口输出数据时,可以使用任一引脚.
sbit     ZD_BUSY   =P1^2; //接收液晶终端发来的"忙"(BUSY)信号,可以连接于任意一位输入引脚上.
//=========================================================================================
#define  TIMEzq    50   //修改TIMEzq可使本程序适用于各种晶振及各种波特率.计算方法见文件尾。
//-------------
//延时函数TIME()
//为了得到精确的延时时间,不要修改本函数的形式,绝对不要修改!
void     TIME(void)
  {
  uchar i;
  for(i=0;i<TIMEzq;i++);
  }
//=========================================================================================
//发送数据
//为了得到精确的延时时间,不要修改本函数的形式,绝对不要修改!
void FSsj(uchar sj)
  {
	 while(ZD_BUSY);
	 ZD_DATA =0;       //起始位=0
	 TIME();
	 ZD_DATA =sj&1;    //D0;12+24+24+24
	 TIME();
	 ZD_DATA =sj&2;    //D1
	 TIME();
	 ZD_DATA =sj&4;    //D2
	 TIME();
	 ZD_DATA =sj&8;    //D3
	 TIME();
	 ZD_DATA =sj&0x10; //D4
	 TIME();
	 ZD_DATA =sj&0x20; //D5
	 TIME();
	 ZD_DATA =sj&0x40; //D6
	 TIME();
	 ZD_DATA =sj&0x80; //D7
	 TIME();
	 ZD_DATA =0;       //奇偶位=0
	 TIME();
	 ZD_DATA =1;       //停止位=1
	 TIME();
  }
//=========================================================================================
void main(void)//运行后每隔1秒,显示3个字母.
  {
        ZD_BUSY=1;
        ZD_DATA=1;
        while(1)
          {
          FSsj('A');    //显示字母A
          FSsj(0x55);   //显示字母U
          FSsj(0xAA);   //显示字母γ
          FSsj(' ');    //空格
          FSsj(0x1B);   //延时1秒
          FSsj('l');
          FSsj(10);
          }
  }
//=========================================================================================
//例1:当通讯波特率F=9.6KHz,单片机晶振Z=18.432MHz时,TIMEzq=50
//计算方法:
//当波特率为9.6KHz时,每个二进制位的宽度为104uS.振荡周期数zq=(1000/9.6)*18.432MHz=1920个振荡周期
//调用本函数的其它指令执行时间为(12+24*3+12*3)=120个振荡周期.
//执行每个循环需要(12+24=36)个振荡周期,则TIMEzq=(zq-120)/36=(1920-120)/36=50
//即:TIMEzq=[((1000/F)*Z)-120]/36=50
//-------------
//例2:当通讯波特率F=4.8KHz,单片机晶振Z=18.432MHz时:
//     TIMEzq=[((1000/F)*Z)-120]/36=103
//-------------
//例3:当通讯波特率F=19.2KHz,单片机晶振Z=18.432MHz时:
//     TIMEzq=[((1000/F)*Z)-120]/36=23
//-------------
//例4:当通讯波特率F=9.6KHz,单片机晶振Z=12.000MHz时:
//     TIMEzq=[((1000/F)*Z)-120]/36=31
//-------------
//例5:当通讯波特率F=4.8KHz,单片机晶振Z=12.000MHz时:
//     TIMEzq=[((1000/F)*Z)-120]/36=66
//-------------
//例6:当通讯波特率F=19.2KHz,单片机晶振Z=12.000MHz时:
//     TIMEzq=[((1000/F)*Z)-120]/36=14
//-------------
//例7:当通讯波特率F=9.6KHz,单片机晶振Z= 6.000MHz时:
//     TIMEzq=[((1000/F)*Z)-120]/36=14
//-------------
//例8:当通讯波特率F=9.6KHz,单片机晶振Z=11.0592MHz时:
//     TIMEzq=[((1000/F)*Z)-120]/36=28
//-------------
//例9:当通讯波特率F=9.6KHz,单片机晶振Z=22.1184MHz时:
//     TIMEzq=[((1000/F)*Z)-120]/36=60
//-------------
//例10:当通讯波特率F=9.6KHz,单片机晶振Z=24.0000MHz时:
//     TIMEzq=[((1000/F)*Z)-120]/36=66
//------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -