标题: 我怎么仿真不出来,大家来看看 [打印本页]
作者: 五十度灰 时间: 2018-3-26 09:15
标题: 我怎么仿真不出来,大家来看看
#include<reg52.h> //52 系列单片机头文件
#define uchar unsignedchar //宏定义
#define uint unsigned int
sbit key1=P3^4; //申明四个按键的锁存端
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table[]={ //含有 0~9 的数字数组
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7c,0x07,
0x7f,0x67};
uchar code table2[]={ //含有 0~9 的数字数组(带小数点)
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfc,0x87,
0xff,0xe7};
void delayms(uint); //声明延时函数
voiddisplay(uchar,uchar,uchar); //声明显示函数
void keyscan(); //声明按键函数
ucharnum1,num2,bai,shi,ge; //变量声明
uint num;
void main() //主函数入口
{
TMOD=0x11; //设置 TO,T1 定时器
TH0=(65536-45872)/256; //装初值11.05992M晶振50ms数为45872
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开启定时器 T0 中断
ET1=1; //开启定时器 T1 中断
while(1) //程序停在这里等待中断的发生,这个大循环也是实现数据显示的主体
{
keyscan(); //三个数码管要选送的数据
bai=num/100; //百位
shi=(num-100*bai)/10; //十位
ge=num-100*bai-shi*10; //个位
display(bai,shi,ge); //数码管显示
}
}
void display(uchar bai,uchar shi,uchar ge)
{
P1=0xfe; //位选选中第一个数码管
P2=table[bai]; //送段选数据
delayms(10); //延时
P1=0xff; //关闭位选
P1=0xfd; //位选选中第二个数码管
P2=table2[shi]; //送段选数据
delayms(10); //延时
P1=0xff; //关闭位选
P1=0xfb; //位选选中第二个数码管
P2=table[ge]; //送段选数据
delayms(10); //延时
P1=0xff; //关闭位选
}
void delayms(uintxms) //延时子函数
{
uint i,j; for(i=xms;i>0;i--) //i=xms 即延时约 xms 毫秒
for(j=110;j>0;j--);
}
void keyscan()
{
if(key1==0) //清零
{
delayms(10); //延时去抖
if(key1==0)
{ while(!key1) //等待按下
{
TR0=0; //定时器 TR0 关闭
TR1=1; //定时器 TR1 打开
num=0; //送数据 num=0
TR1=0; //定时器 TR1 关闭
}
}
}
if(key2==0) //暂停和开始
{
delayms(10);
if(key2==0)
{
while(!key2);
TR0=0;
TR1=~TR1; //每次按下,TR1 的状态时相反的
}
}
if(key3==0) //使计数器显示为 60.0
{
while(!key3);
TR0=0;
TR1=1;
num=999;
TR1=0;
}
if(key4==0) //实现计数器的倒数功能
{
while(!key4);
TR1=0;
TR0=~TR0;//TR0=1;
}
}
void T0_time()interrupt 1 //定时器 T0,中断序号为 1
{TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
num2++;
if(num2==2) //如果到了2次,说明0.1秒的时间到
{ num2=0; //然后把num2清零重新再计2次
num1++;
}
if(num1==10)
num1=0;
if(num==0) //当 num 自减为0时,重新为 60.0,再开始倒计时
num=999; //num 逐渐自减
num--;
}
void T1_time()interrupt 3
{ TH1=(65536-45872)/256; //重装初值
TL1=(65536-45872)%256;
num2++;
if(num2==2) //如果到了 2 次,说明 0.1 秒的时间到
{ num2=0; //然后把 num2 清零重新再计 2 次
num1++;
if(num1==10)
num1=0;
num++; //num 逐渐自加
if(num==999)
num=0;//这个数十用来送给数码管显示的,到了60.0后归零
}
}
-
秒表.png
(29.28 KB, 下载次数: 30)
照图仿真做不出来!
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |