标题:
这个单片机程序怎么实现用串口代替按键修改当前时间?
[打印本页]
作者:
18856764172
时间:
2018-1-9 13:50
标题:
这个单片机程序怎么实现用串口代替按键修改当前时间?
//我的这个程序怎么实现用串口代替按键修改当前时间???
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^5; //定义1602液晶rs端
sbit rw=P2^6; //定义1602液晶rw端
sbit lcden=P2^7; //定义1602液晶lcden端
sbit s2=P3^2; //定义功能键
sbit s3=P3^3; //定义增大键
sbit s4=P3^4; //定义减小键
uchar count,s1num;
char miao,shi,fen;
uchar code table[]=" 2018-1-7MON "; //定义初始上电时液晶默认显示状态
uchar code table1[]=" 00:00:00 ";
//Read_BursRam(&Read_Flag,1);
//if(Read_Flag!= 1)
//{
// Write_Data(0x90,0xaa);
// Write_BurstClock(Cur_Time);
// Write_BurstRam(&Clock_Flag,1);
// Write_Data(0x8e,0x80);
//}
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--);
for(y=110;y>0;y--);
}
void write_com(uchar com) //液晶写命令函数
{
rs=0;
lcden=0;
P0=com;
delay(20);
lcden=1;
delay(20);
lcden=0;
}
void write_date(uchar date) //液晶写数据函数
{
rs=1;
lcden=0;
P0=date;
delay(20);
lcden=1;
delay(20);
lcden=0;
}
void init() //初始化函数
{
uchar num;
lcden=0;
rw=0;
write_com(0x38); //初始化1602液晶
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80); //设置显示初始坐标
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(20);
}
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay(20);
}
TMOD=0x01; //设置定时器0工作模式1
TH0=(65536-50000)/256; //定时器装初值
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void keyscan() //按键扫描函数
{
if(s2==0)
{
delay(20);
if(s2==0) //确认功能键被按下
{
s1num++; //功能键按下次数记录
while(!s2); //确认释放
if(s1num==1) //第一次被按下时
{
TR0=0; //关闭定时器
write_com(0x80+0x40+10); //功能键作用在秒
write_com(0x0f); //光标闪烁
}
}
if(s1num==2) //第二次被按下时在分
{
write_com(0x80+0x40+7);
}
if(s1num==3) //第三次被按下时在时
{
write_com(0x80+0x40+4);
}
if(s1num==4) //第四次被按下,清零
{
s1num=0;
write_com(0x0c);
TR0=1; //启动定时器时钟开始走
}
}
if(s1num!=0) //当功能键被按下后增大键减小键才可以发挥作用
{
if(s3==0)
{
delay(20);
if(s3==0) //增大键被按下
{
while(!s2); //按键释放
if(s1num==1) //若功能键第一次被按下
{
miao++; //秒加一
if(miao==60) //秒满60后清零
miao=0;
write_sfm(10,miao); //每调节一次液晶显示一次
write_com(0x80+0x40+10); //显示位置重新回到调节处
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
if(s4==0)
{
delay(20);
if(s4==0)
{
while(!s3);
if(s1num==1)
{
miao--; //调整秒减一
if(miao==-1) //减到负数则重新设置为59
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
}
void main()
{
// Ds1302Init();
init();
while(1)
{
keyscan();
}
}
void timer0() interrupt 1 //定时器0中断服务程序
{
TH0=(65536-50000)/256; //再次装定时器初值
TL0=(65536-50000)%256;
count++; //中断次数累加
if(count==18)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}
复制代码
作者:
wulin
时间:
2018-1-9 15:54
本帖最后由 wulin 于 2018-1-9 16:12 编辑
简单的给你改了一下,未经实物验证,只是抛砖引玉。
初始化程序改了定时器设置,增加了定时器1作波特率发生器
main函数里增加了查询接收串口数据功能
按键扫描函数的内容基本不变,把读键改成了读串口收到的数据(只有02/03/04有效)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^5; //定义1602液晶rs端
sbit rw=P2^6; //定义1602液晶rw端
sbit lcden=P2^7; //定义1602液晶lcden端
//sbit s2=P3^2; //定义功能键
//sbit s3=P3^3; //定义增大键
//sbit s4=P3^4; //定义减小键
uchar count,s1num;
char miao,shi,fen;
uchar code table[]=" 2018-1-7MON "; //定义初始上电时液晶默认显示状态
uchar code table1[]=" 00:00:00 ";
uchar key=0;//保存串口收到的数据(键值)
//Read_BursRam(&Read_Flag,1);
//if(Read_Flag!= 1)
//{
// Write_Data(0x90,0xaa);
// Write_BurstClock(Cur_Time);
// Write_BurstRam(&Clock_Flag,1);
// Write_Data(0x8e,0x80);
//}
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--);
for(y=110;y>0;y--);
}
void write_com(uchar com) //液晶写命令函数
{
rs=0;
lcden=0;
P0=com;
delay(20);
lcden=1;
delay(20);
lcden=0;
}
void write_date(uchar date) //液晶写数据函数
{
rs=1;
lcden=0;
P0=date;
delay(20);
lcden=1;
delay(20);
lcden=0;
}
void init() //初始化函数
{
uchar num;
lcden=0;
rw=0;
write_com(0x38); //初始化1602液晶
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80); //设置显示初始坐标
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(20);
}
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay(20);
}
//定时器按晶振频率11.0592MHz设置
TMOD=0x21;//设置定时器0模式1、定时器1模式2
// TH0=(65536-50000)/256;//定时器0装初值
// TL0=(65536-50000)%256;//定时器0装初值
TH0 = 0x4C; //50ms
TL0 = 0x00; //50ms
TH1=0xfd;//定时器1自动装载、波特率9600
TL1=0xfd;//定时器1自动装载
REN=1; //允许串行接收
SM0=0; //设置串口方式1(8位UART波特率可变)
SM1=1; //设置串口方式1(8位UART波特率可变)
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //开定时器0
TR1=1; //开定时器1
}
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void keyscan() //按键扫描函数
{
if(key==2)
{
s1num++; //功能键按下次数记录
if(s1num==1) //第一次被按下时
{
TR0=0; //关闭定时器
write_com(0x80+0x40+10); //功能键作用在秒
write_com(0x0f); //光标闪烁
}
key=0;//响应后及时清0,防止重复响应
}
if(s1num==2) //第二次被按下时在分
{
write_com(0x80+0x40+7);
}
if(s1num==3) //第三次被按下时在时
{
write_com(0x80+0x40+4);
}
if(s1num==4) //第四次被按下,清零
{
s1num=0;
write_com(0x0c);
TR0=1; //启动定时器时钟开始走
}
if(s1num!=0) //当功能键被按下后增大键减小键才可以发挥作用
{
if(key==3)
{
if(s1num==1) //若功能键第一次被按下
{
miao++; //秒加一
if(miao==60) //秒满60后清零
miao=0;
write_sfm(10,miao); //每调节一次液晶显示一次
write_com(0x80+0x40+10); //显示位置重新回到调节处
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
key=0;//响应后及时清0,防止重复响应
}
if(key==4)
{
if(s1num==1)
{
miao--; //调整秒减一
if(miao==-1) //减到负数则重新设置为59
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
key=0;//响应后及时清0,防止重复响应
}
}
}
void main()
{
//Ds1302Init();
init();
while(1)
{
if(RI==1) //查询接收中断请求标志位为1
{
EA=0; //关总中断,防止干扰串口通讯
RI=0; //接收中断请求标志位清0
key=SBUF; //保存接收到的数据
SBUF=key; //将收到的数据发送串口助手验证
while(!TI) //等待发送中断请求标志位为1
TI=0; //发送中断请求标志位清0
EA=1; //开总中断
}
keyscan();
}
}
void timer0() interrupt 1 //定时器0中断服务程序
{
// TH0=(65536-50000)/256; //再次装定时器初值
// TL0=(65536-50000)%256;
TH0 = 0x4C; //50ms
TL0 = 0x00; //50ms
count++; //中断次数累加
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}
作者:
18856764172
时间:
2018-1-9 17:14
wulin 发表于 2018-1-9 15:54
简单的给你改了一下,未经实物验证,只是抛砖引玉。
初始化程序改了定时器设置,增加了定时器1作波特率发 ...
谢谢,可以用了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1