标题: 单片机仿真—时钟,温度计和频率计 [打印本页]
作者: jiujiu 时间: 2014-12-18 00:25
标题: 单片机仿真—时钟,温度计和频率计
这么好的资料当然要发到51hei论坛来 大家一起学习.
1)键盘、显示电路
利用单片机最小系统、6个7段LED数码管、12个按键,设计制作一个键盘、显示电路。可以使用8279键盘显示接口电路,也可以使用单片机的并行接口作为键盘显示接口。
2) 数字时钟
在键盘、显示电路的基础上完成一个数字时钟的设计,完成以下功能:
a. 要求以24小时计时方式显示时、分、秒;
b. 时、分、秒可以通过按键分别调整。
3) 数字温度计
在上题的硬基础上,制作一个数字温度计。完成以下功能:
a. 利用DS18B20可编程1-Wire数字温度传感器芯片,或利用AD590温度传感器芯片和A/D转换器芯片采集温度温度信号;
b. 当按下键盘上的温度显示按键时将实时温度信息显示在LED显示器上,当按下键盘上的时钟显示按键时,恢复时钟的正常显示;
c. 通过串行通信的方式,将采集到的实时温度信息送至第二个单片机系统,并在二个单片机系统显示实时温度。
4) 数字频率计
在上题的硬基础上,制作一个数字频率计。完成以下功能:
a. 利用MCU设计一个数字频率计,用于检测0~500kHz周期信号的频率,输入信号幅度范围:0.1~10V;
b. 当按下键盘上的频率显示按键时将测量的频率信息显示在LED显示器上,当按下键盘上的时钟显示按键时,恢复时钟的正常显示;
时钟显示
温度显示
频率显示
串行通信
实物时钟显示
实物温度显示
实物频率显示(由于程序中晶振为12M,板子上的晶振为11.0592M,故测出的频率有8%左右的误差) ...
实物串行通信
-
-
串行通信.rar
22.06 KB, 下载次数: 17, 下载积分: 黑币 -5
-
-
串行通信接收.rar
653 Bytes, 下载次数: 13, 下载积分: 黑币 -5
-
-
整个程序(包括发送程序).rar
2.1 KB, 下载次数: 31, 下载积分: 黑币 -5
-
-
整个电路.rar
18.38 KB, 下载次数: 25, 下载积分: 黑币 -5
作者: jiujiu 时间: 2014-12-18 00:28
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #define _Nop() _nop_()
- sbit DQ =P2^2; //定义DS18B20通信端口
- sbit DULA=P2^6;
- sbit WELA=P2^7;
- sbit K1=P3^0;
- sbit K2=P3^1;
- sbit K3=P3^2;
- sbit K4=P3^4;
- sbit K5=P3^5;
- sbit K6=P3^6;
- bit settime=0;
- float tt=0;
- uchar ms,h=0,m=0,s=0,change=0,num=0;
- ulong count=0;
- uchar code S_Data[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
- uchar table[6]={0x3F,0x3F,0x3F,0x3F,0x3F,0x3F};//时钟0-5号SLED缓冲值
- uchar table1[]={0x00,0x00,0x00,0x00,0x00,0x00};//频率计0-5号SLED缓冲值
- uchar data sled_data[]={0x00,0x00,0x00,0x00,0x00,0x00}; //温度0-5号SLED缓冲值
- uchar code Line_Value[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
- uchar code Line_Value1[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- void delay(uint i)
- {
- while(i--);
- }
- void delayms(uint x)
- {
- uchar i;
- while(x--) for(i=0;i<120;i++);
- }
- void display(uchar h,m,s)
- { uchar i;
- table[5]= S_Data[h/10];
- table[4]= S_Data[h%10];
- table[3]= S_Data[m/10];
- table[2]= S_Data[m%10];
- table[1]= S_Data[s/10];
- table[0]= S_Data[s%10];
- for (i=0;i<6;i++)
- {
- P0=0xff;
- WELA=1;
- P0=Line_Value1[ i];
- WELA=0;
- DULA=1;
- P0=table[ i];
- DULA=0;
- delayms(1);
- }
- }
- void Change_Time()
- {
- settime=0;
- if(K1==0||K2==0||K3==0)
- {
- TR0=0;
- settime=1;
- }
- while(settime)
- {
- if(K1==0)
- {
- while(K1==0);
- change=(change+1)%3;
- }
- else if(K2==0)
- {
- while(K2==0);
- if(change==0)
- {if(++h==24) h=0;}
- if(change==1)
- {if(++m==60) m=0;}
- if(change==2)
- {if(++s==60) s=0;}
- }
- else if(K3==0)
- {
- while(K3==0);
- if(change==0)
- {if(--h==0xff) h=23;}
- if(change==1)
- {if(--m==0xff) m=59;}
- if(change==2)
- {if(--s==0xff) s=59;}
- }
- else if(K4==0)
- {
- while(K4==0);
- settime=0;
- TR0=1;
- }
- display(h,m,s);
- }
- }
- Init_DS18B20(void)
- {
- uchar x=0;
- DQ = 1; //DQ复位
- delay(8); //稍做延时
- DQ = 0; //单片机将DQ拉低
- delay(80); //精确延时 大于 480us
- DQ = 1; //拉高总线
- delay(14);
- x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
- delay(20);
- }
- //读一个字节
- ReadOneChar(void)
- {
- uchar i=0;
- uchar dat = 0;
- for (i=8;i>0;i--){
- DQ = 0; // 给脉冲信号
- dat>>=1;
- DQ = 1; // 给脉冲信号
- if(DQ) dat|=0x80;
- delay(4);
- }
- return(dat);
- }
- //写一个字节
- WriteOneChar(uchar dat)
- {
- uchar i=0;
- for (i=8; i>0; i--){
- DQ = 0;
- DQ = dat&0x01;
- delay(5);
- DQ = 1;
- dat>>=1;
- }
- }
- //读取温度
- ReadTemperature(void)
- {
- uchar a=0;
- uchar b=0;
- uint t=0;
-
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳过读序号列号的操作
- WriteOneChar(0x44); // 启动温度转换
- Init_DS18B20();
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
- a=ReadOneChar();
- b=ReadOneChar();
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625; //将温度的高位与低位合并
- t= tt*10+0.5; //对结果进行4舍5入
- return(t);
- }
- void Time0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- if(++ms==20)
- {
- ms=0;
- if(++s==60)
- {
- s=0;
- if(++m==60)
- {
- m=0;
- if(++h==24)
- {
- h=0;m=0;s=0;
- }
- }
- }
- }
- }
- void INT_T1() interrupt 3
- {
-
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- if(++num==20)
- {
- TR1=0;
- EX0=0;
- table1[0]=S_Data[count%10];
- table1[1]=S_Data[count%100/10];
- table1[2]=S_Data[count/100%10];
- table1[3]=S_Data[count/1000%10];
- table1[4]=S_Data[count/10000%10];
- table1[5]=S_Data[count/10000/10];
- count=0;
- num=0;
-
- }
- }
- void EX_INT0() interrupt 2
- {
- count++;
-
-
- }
- void main()
- {
- uint temp_buff;
- uchar i,j;#include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #define _Nop() _nop_()
- sbit DQ =P2^2; //定义DS18B20通信端口
- sbit DULA=P2^6;
- sbit WELA=P2^7;
- sbit K1=P3^0;
- sbit K2=P3^1;
- sbit K3=P3^2;
- sbit K4=P3^4;
- sbit K5=P3^5;
- sbit K6=P3^6;
- bit settime=0;
- float tt=0;
- uchar ms,h=0,m=0,s=0,change=0,num=0;
- ulong count=0;
- uchar code S_Data[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
- uchar table[6]={0x3F,0x3F,0x3F,0x3F,0x3F,0x3F};//时钟0-5号SLED缓冲值
- uchar table1[]={0x00,0x00,0x00,0x00,0x00,0x00};//频率计0-5号SLED缓冲值
- uchar data sled_data[]={0x00,0x00,0x00,0x00,0x00,0x00}; //温度0-5号SLED缓冲值
- uchar code Line_Value[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
- uchar code Line_Value1[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- void delay(uint i)
- {
- while(i--);
- }
- void delayms(uint x)
- {
- uchar i;
- while(x--) for(i=0;i<120;i++);
- }
- void display(uchar h,m,s)
- { uchar i;
- table[5]= S_Data[h/10];
- table[4]= S_Data[h%10];
- table[3]= S_Data[m/10];
- table[2]= S_Data[m%10];
- table[1]= S_Data[s/10];
- table[0]= S_Data[s%10];
- for (i=0;i<6;i++)
- {
- P0=0xff;
- WELA=1;
- P0=Line_Value1[ i];
- WELA=0;
- DULA=1;
- P0=table[ i];
- DULA=0;
- delayms(1);
- }
- }
- void Change_Time()
- {
- settime=0;
- if(K1==0||K2==0||K3==0)
- {
- TR0=0;
- settime=1;
- }
- while(settime)
- {
- if(K1==0)
- {
- while(K1==0);
- change=(change+1)%3;
- }
- else if(K2==0)
- {
- while(K2==0);
- if(change==0)
- {if(++h==24) h=0;}
- if(change==1)
- {if(++m==60) m=0;}
- if(change==2)
- {if(++s==60) s=0;}
- }
- else if(K3==0)
- {
- while(K3==0);
- if(change==0)
- {if(--h==0xff) h=23;}
- if(change==1)
- {if(--m==0xff) m=59;}
- if(change==2)
- {if(--s==0xff) s=59;}
- }
- else if(K4==0)
- {
- while(K4==0);
- settime=0;
- TR0=1;
- }
- display(h,m,s);
- }
- }
- Init_DS18B20(void)
- {
- uchar x=0;
- DQ = 1; //DQ复位
- delay(8); //稍做延时
- DQ = 0; //单片机将DQ拉低
- delay(80); //精确延时 大于 480us
- DQ = 1; //拉高总线
- delay(14);
- x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
- delay(20);
- }
- //读一个字节
- ReadOneChar(void)
- {
- uchar i=0;
- uchar dat = 0;
- for (i=8;i>0;i--){
- DQ = 0; // 给脉冲信号
- dat>>=1;
- DQ = 1; // 给脉冲信号
- if(DQ) dat|=0x80;
- delay(4);
- }
- return(dat);
- }
- //写一个字节
- WriteOneChar(uchar dat)
- {
- uchar i=0;
- for (i=8; i>0; i--){
- DQ = 0;
- DQ = dat&0x01;
- delay(5);
- DQ = 1;
- dat>>=1;
- }
- }
- //读取温度
- ReadTemperature(void)
- {
- uchar a=0;
- uchar b=0;
- uint t=0;
-
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳过读序号列号的操作
- WriteOneChar(0x44); // 启动温度转换
- Init_DS18B20();
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
- a=ReadOneChar();
- b=ReadOneChar();
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625; //将温度的高位与低位合并
- t= tt*10+0.5; //对结果进行4舍5入
- return(t);
- }
- void Time0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- if(++ms==20)
- {
- ms=0;
- if(++s==60)
- {
- s=0;
- if(++m==60)
- {
- m=0;
- if(++h==24)
- {
- h=0;m=0;s=0;
- }
- }
- }
- }
- }
- void INT_T1() interrupt 3
- {
-
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- if(++num==20)
- {
- TR1=0;
- EX0=0;
- table1[0]=S_Data[count%10];
- table1[1]=S_Data[count%100/10];
- table1[2]=S_Data[count/100%10];
- table1[3]=S_Data[count/1000%10];
- table1[4]=S_Data[count/10000%10];
- table1[5]=S_Data[count/10000/10];
- count=0;
- num=0;
-
- }
- }
- void EX_INT0() interrupt 2
- {
- count++;
-
-
- }
- void main()
- {
- uint temp_buff;
- uchar i,j,k;
- char *p;
- SCON=0x80; //串口模式2
- PCON=0x00; //波特率不倍增
- TMOD=0x11;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- EA=1;
- ET0=1;
- ET1=1;
- TR0=1;
- IT1=1;
- EX1=1;
- TR1=1;
- P1=0xff;//复位K1-K7键位
- P3=0x7f;
- while(1)
- {
- display(h,m,s);
- delayms(1);
- Change_Time();
- if(K5==0)
- {
- while(1)
- { while(K5==0);
- temp_buff=ReadTemperature(); /*读取当前温度*/
- sled_data[2] = S_Data[temp_buff/100];
- sled_data[1] = S_Data[temp_buff%100/10];
- sled_data[0] = S_Data[temp_buff%10];
- for(j=0;j<30;j++)
- {
- for(i=0;i<6;i++)
- {
-
- _Nop();
- _Nop();
- _Nop();
- P0=0xff;
- WELA=1;
- P0 = Line_Value1[ i]; /*输出位码数据到数码管*/
- WELA=0;
- P0=0xff;
- DULA=1;
- P0 = sled_data[ i]; /*输出段码数据到数码管*/
- if(i==1) P0 = P0|0x80; /*显示小数点*/
- DULA=0;
- delayms(1);
- }
- }
- k++;
- if(k==5)
- {
- k=0;
- p=sled_data;
- for(i=0;i<3;i++)
- {
- SBUF=*p;
- p++;
- while(TI==0);
- TI=0;
- }
- }
- if(K4==0) break;
- }
- }
- if(K6==0)
- { while(K6==0);
- while(1)
- { EX1=1;
- TR1=1;
-
-
- for(j=0;j<30;j++)
- {
- for(i=0;i<6;i++)
- {
- P0=0xff;
- WELA=1;
- P0= Line_Value1[ i];
- WELA=0;
- DULA=1;
- P0= table1[ i];
- DULA=0;
- delayms(1);
- }
- }
- if(K4==0) break;
- }
-
- }
- }
- }
-
-
- TMOD=0x11;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- EA=1;
- ET0=1;
- ET1=1;
- TR0=1;
- IT1=1;
- EX1=1;
- TR1=1;
- P1=0xff;//复位K1-K7键位
- P3=0x7f;
- while(1)
- {
- display(h,m,s);
- delayms(1);
- Change_Time();
- if(K5==0)
- {
- while(1)
- { while(K5==0);
- temp_buff=ReadTemperature(); /*读取当前温度*/
- sled_data[2] = S_Data[temp_buff/100];
- sled_data[1] = S_Data[temp_buff%100/10];
- sled_data[0] = S_Data[temp_buff%10];
- for(j=0;j<30;j++)
- {
- for(i=0;i<6;i++)
- {
-
- _Nop();
- _Nop();
- _Nop();
- P0=0xff;
- WELA=1;
- P0 = Line_Value1[ i]; /*输出位码数据到数码管*/
- WELA=0;
- P0=0xff;
- DULA=1;
- P0 = sled_data[ i]; /*输出段码数据到数码管*/
- if(i==1) P0 = P0|0x80; /*显示小数点*/
- DULA=0;
- delayms(1);
- }
- }
- if(K4==0) break;
- }
- }
- if(K6==0)
- { while(K6==0);
- while(1)
- { EX1=1;
- TR1=1;
-
-
- for(j=0;j<30;j++)
- {
- for(i=0;i<6;i++)
- {
- P0=0xff;
- WELA=1;
- P0= Line_Value1[ i];
- WELA=0;
- DULA=1;
- P0= table1[ i];
- DULA=0;
- delayms(1);
- }
- }
- if(K4==0) break;
- }
-
- }
- }
- }
-
-
复制代码
作者: hq51hei 时间: 2015-4-23 09:03
楼主强大
作者: hq51hei 时间: 2015-4-23 09:03
谢谢楼主
作者: wybzxp 时间: 2015-4-28 10:40
用的吗,试验一下
作者: YOU1988 时间: 2015-9-18 18:42
强大啊
作者: j3922182 时间: 2015-9-21 23:07
好強阿~~
作者: wad。m 时间: 2015-12-22 15:28
能不能用汇编?感谢撸主
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |