📄 mnck.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 + -