600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 基于51单片机的公交站自动播报系统proteus仿真 程序原理图设计

基于51单片机的公交站自动播报系统proteus仿真 程序原理图设计

时间:2023-11-02 08:07:41

相关推荐

基于51单片机的公交站自动播报系统proteus仿真 程序原理图设计

硬件设计

(末尾附文件)

设计1:

该设计具有仿真图,LCD12864作为显示器,4个设置按键,具有led指示灯;

设计2:

该设计不具备仿真图,原理图如下所示:

设计1代码

#include <reg51.h>#define uint unsigned int#define uchar unsigned char#include "value.h"sbit x_key=P1^3;sbit s_key=P1^4;sbit bz_key=P1^5;sbit gb_key=P1^6;sbit x_LED=P2^6;sbit s_LED=P2^7;uchar x_mode,s_mode;uchar x_num,s_num;bit flag_200ms = 1;uchar flag_c_en;bit flag_100ms;sbit dq=P3^2; //18b20 IO口的定义uint temperature ; //温度变量/************ 延时函数 *****************/void delay_uint(uint z){while(z--);}/********************************************************************* 名称 : delay_1ms()* 功能 : 延时1ms函数* 输入 : q* 输出 : 无***********************************************************************/void delay_1ms(uint q){uint i,j;for(i=0;i<q;i++)for(j=0;j<115;j++);}uchar dis_lcd[10];#include "lcd12864bu.h"/******************显示时间函数***************************/void dis_shijian()//显示时间{write_shu16(0,0*8,shi,0);write_shuzi(1,0*2,2*8,fuhao[1],0);write_shu16(0,3*8,fen,0);write_shuzi(1,0*2,5*8,fuhao[1],0);write_shu16(0,6*8,miao,0);write_yhanzi(2,0,5*16,qita[6]); //星期//write_shu16(0,14*8,week,0);if(week==0){write_yhanzi(1,0,7*16,xingqi[6]); }if(week==1){write_yhanzi(1,0,7*16,xingqi[1]); }if(week==2){write_yhanzi(1,0,7*16,xingqi[2]); }if(week==3){write_yhanzi(1,0,7*16,xingqi[3]); }if(week==4){write_yhanzi(1,0,7*16,xingqi[4]); }if(week==5){write_yhanzi(1,0,7*16,xingqi[5]); }if(week==6){write_yhanzi(1,0,7*16,xingqi[6]); }write_shu16(1*2,0*8,0x20,0);write_shu16(1*2,2*8,nian,0);write_shuzi(1,1*2,4*8,fuhao[0],0);write_shu16(1*2,5*8,yue,0);write_shuzi(1,1*2,7*8,fuhao[0],0);write_shu16(1*2,8*8,ri,0);write_shu18b20(1*2,12*8,temperature,0);write_shuzi(1,1*2,14*8,dian,0);}/************初始化显示*****************/void init_12864_dis() //初始化显示{cs1=1; //左屏开显示cs2=0;dis_shijian();//显示时间}/***********************18b20初始化函数*****************************/void init_18b20(){bit q;dq=1;//把总线拿高delay_uint(1); //15usdq=0;//给复位脉冲delay_uint(80);//750usdq=1;//把总线拿高 等待delay_uint(10);//110usq=dq;//读取18b20初始化信号delay_uint(20);//200usdq=1;//把总线拿高 释放总线}/*************写18b20内的数据***************/void write_18b20(uchar dat){uchar i;for(i=0;i<8;i++){ //写数据是低位开始dq=0; //把总线拿低写时间隙开始 dq=dat&0x01; //向18b20总线写数据了delay_uint(5); // 60usdq=1; //释放总线dat>>=1;}}/*************读取18b20内的数据***************/uchar read_18b20(){uchar i,value;for(i=0;i<8;i++){dq=0; //把总线拿低读时间隙开始 value>>= 1; //读数据是低位开始dq=1; //释放总线if(dq==1) //开始读写数据 value|=0x80;delay_uint(5); //60us读一个时间隙最少要保持60us的时间}return value; //返回数据}/*************读取温度的值 读出来的是小数***************/uint read_temp(){uint value;uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序init_18b20(); //初始化18b20write_18b20(0xcc); //跳过64位ROMwrite_18b20(0x44); //启动一次温度转换命令delay_uint(50); //500usinit_18b20(); //初始化18b20write_18b20(0xcc); //跳过64位ROMwrite_18b20(0xbe); //发出读取暂存器命令EA=0;low=read_18b20(); //读温度低字节value=read_18b20(); //读温度高字节EA =1;value<<=8; //把温度的高位左移8位value|=low; //把读出的温度低位放到value的低八位中value*=0.625; //转换到温度值 小数return value; //返回读出的温度 带小数}/******************显示时间函数***************************/void dis_shijian_set()//显示时间{write_shu16(0*2,0*8,0x20,0);write_shu16(1*2,2*8,shi,0);write_shu16(1*2,6*8,fen,0);write_shu16(1*2,10*8,miao,0);write_shu16(0*2,2*8,nian,0);write_shu16(0*2,6*8,yue,0);write_shu16(0*2,10*8,ri,0);write_yhanzi(1,4,5*16,xingqi[week]);}/************初始化设置显示*****************/void init_12864_set1(){write_yhanzi(1,0,2*16,qita[0]); //年write_yhanzi(1,0,4*16,qita[1]); //月write_yhanzi(1,0,6*16,qita[2]); //日write_yhanzi(1,2,2*16,qita[3]); //时write_yhanzi(1,2,4*16,qita[4]); //分 write_yhanzi(1,2,6*16,qita[5]); //秒write_yhanzi(2,4,3*16,qita[6]); //星期dis_shijian_set();//显示时间}/******************时间芯片显示函数**********************/ void ds1302_dis(){uchar miao_1;if(menu_1 == 0){read_time();if(miao_1 != miao){miao_1 = miao;dis_shijian();//显示时间}}}/********************独立按键程序*****************/uchar key_can; //按键值void key() //独立按键程序{static uchar key_new;key_can=20; //按键值还原P3|=0x78; //对应的按键IO口输出为1if((P3&0x78)!=0x78)//按键按下{delay_1ms(1);//按键消抖动if(((P3&0x78)!=0x78)&&(key_new==1)){//确认是按键按下key_new=0;switch(P3&0x78){case 0x70:key_can=1;break; //得到按键值case 0x68:key_can=2;break; //得到按键值case 0x58:key_can=3;break; //得到按键值case 0x38:key_can=4;break; //得到按键值}}}else key_new=1;}/**********************设置函数************************/void key_with(){if(key_can==4) //退出键{qingling();init_12864_dis(); //初始化显示flag_200ms=1;menu_1=0;}if(key_can==1)//设置键{menu_1 ++;flag_200ms=1;if(menu_1==1){x_num=0;s_num=0;x_mode=0;s_mode=0;qingling();init_12864_set1();}if(menu_1>7)menu_1 = 1;}if(menu_1!=0){if(menu_1==1) //设置年{if(key_can==2)//加set_ds1302time(1,&nian,0x99);if(key_can==3)//减 set_ds1302time(0,&nian,0x99);}if(menu_1==2) //设置月{if(key_can==2)//加set_ds1302time(1,&yue,0x13);if(key_can==3)//减 set_ds1302time(0,&yue,0x13);}if(menu_1==3) //设置日{if(key_can==2)//加set_ds1302time(1,&ri,0x32);if(key_can==3)//减 set_ds1302time(0,&ri,0x32);}if(menu_1==4) //设置时{if(key_can==4)//加set_ds1302time(1,&shi,0x24);if(key_can==3)//减 set_ds1302time(0,&shi,0x24);}if(menu_1==5) //设置分

.

文件仅供参考

链接:/s/1c68VZO0oLF70yT05cpLmtQ

提取码:pzx8

.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。