单片机课程设计自己做的,main.c是自己写的,LCD模块是用的商家的,买LCD显示屏送的。因为板子焊的太好被老师说买的,只给了及格分。下面是main.c文件的内容,注释一般都有说明,在此用作学习交流,有刚接触的同学如果有问题请私聊;如果对各位有帮助可以点赞收藏加关注。
下面都是程序了,注释算比较详细,有看不明白的可以直接提问。
#include<reg51.h>
#include"lcd.h"
#define uchar unsigned char
#define uint unsigned int
uchar code ASCII[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
uchar disbuff[4]={ 0,0,0,0,};
uint time=0;
uint t;
uint S=0;
bit flag =0;
sbit TX = P2^0;
sbit K1 = P2^2;
sbit K2 = P2^3;
void Conut(void);
void StartModule();
void delayms(uint ms);
void main()
{
LCD1602_Init();
while(1)
{
TMOD=0x09; //设T0为方式1,GATE=1;
TH0=0X00;
TL0=0X00;
TR0=1;
IT0=1;//外部中断0下降沿触发中断
EX0=1;
ET0=1; //允许T0中断
EA=1; //开启总中断
while(1)
{
if(!K1)
{
delayms(10);
if(!K1)
{
StartModule();
TH0=0X00;
TL0=0X00;
}
while(!K1);
}
if(!K2)
{
delayms(10);
if(!K2)
{
S=0;
TH0=0X00;
TL0=0X00;
}
while(!K2);
}
LCD1602_WriteCom(0x80); //当RX为零时等待
// TR0=RX; //开启计数
Conut(); //计算
delayms(10); //10MS
}
}
}
void Conut(void)
{
time=TH0*256+TL0;
S=(time*1.7)/100; //算出来是CM
if(flag==1) //超出测量范围显示“-”(S>=700)||
{
flag=0;
LCD1602_WriteData(ASCII[11]);
LCD1602_WriteData(ASCII[10]);//显示小数点
LCD1602_WriteData(ASCII[11]);
LCD1602_WriteData(ASCII[11]);
LCD1602_WriteData(ASCII[12]);//显示单位
}
else
{
disbuff[0]=(S/100)%10;
disbuff[1]=(S/10)%10;
disbuff[2]=S%10;
LCD1602_WriteData(ASCII[disbuff[0]]);
LCD1602_WriteData(ASCII[10]); //显示点
LCD1602_WriteData(ASCII[disbuff[1]]);
LCD1602_WriteData(ASCII[disbuff[2]]);
LCD1602_WriteData(ASCII[12]); //显示M
}
}
void StartModule() //启动模块
{
TX=1; //启动一次模块
delayms(1);
TX=0;
}
void delayms(uint ms)
{
unsigned char i=100;
for(;ms;ms--)
{
while(--i);
}
}
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}