;假设单片机晶振fosc=6mhz,则t=2us;定时器计数器T0,方式1;60分钟之后干什么没有描述,故设定60分钟之后由p10口输出一高电平,并延时一段时间
org 0000h ljmp main org 000bh ljmp serve org 0100hmain:mov sp,#60h mov r0,#10 ;定时100ms10=1s mov r7,#60 ;1s60=1min,设1分钟计数初值 mov r6,#60 ;1min60=60min,设1小时计数初值 mov tmod,#01h mov th0,#3ch mov tl0,#0b0h clr p10 setb ea setb et0 setb tr0 sjmp $serve:mov th0,#3ch mov tl0,#0b0h djnz r0,loop mov r0,#10 djnz r7,loop mov r7,#60 djnz r6,loop mov r6,#60 setb p10 acall delay clr p10loop: retidelay:mov r1,#10lp1:mov r2,#0ffhlp2:nop nop djnz r2,lp2 djnz r1,lp1 retend
#include <reg52h>
#define uchar unsigned char
#define uint unsigned int
sbit duan=P2^6;
sbit wei=P2^7;
uchar disp=0;
uchar time=10;
int miao=0;
uchar code dispcode[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //段码表
void Timer0Init(void) //1毫秒@12000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void main()
{
Timer0Init()
ET0=1; //开启定时器0中断
EA=1;
while(1);//等待中断
}
void time0(void)interrupt 1
{
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
if(disp&1=0)
{
duan=1;
P0=dispcode[time%10];
duan=0;
wei=1;
P0=0xdf;
wei=0;
}
else
{
duan=1;
P0=dispcode[time/10];
duan=0;
wei=1;
P0=0xef;
wei=0;
}
disp++;
miao++;
if(miao==1000)
{
miao=0;
if(miao!=0)time--;
}
}
#include<reg52h>
#include <intrinsh> //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uint unsigned int sbit d1=P2^0; sbit key1=P0^4;
sbit SDATA_595=P0^0; //串行数据输入 ----接板卡上的SPI 数据信号输入端
sbit SCLK_595=P0^1; //移位时钟脉冲(输入口) ---接板卡上的SPO----串行时钟线----SHcp移位时钟信号输入端
sbit RCK_595=P0^2; //输出锁存器控制脉冲 ----接板卡上SPK STcp锁存信号输入端
uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar num=60;
void delay(uint z);
void aa595_in(uchar Data) {
uchar i;
for(i=0;i<8;i++)
{SCLK_595=0; Data<<=1; SDATA_595=CY;
SCLK_595=1; SCLK_595=0;
}
}
void a595_in(uchar Data) {
uchar i;
for(i=0;i<8;i++) {
SCLK_595=0; Data<<=1; SDATA_595=CY;
SCLK_595=1; SCLK_595=0;
}
}
void aa595_out(void) {
RCK_595=0;
_nop_(); _nop_();
RCK_595=1;
_nop_(); _nop_();
RCK_595=0;
}
void main() {
uchar ge,shi;
while(1) {
if(key1==0) {
delay(10);
if(key1==0)
{d1=0; num--;
if(num==0)
num=60;}
while(!key1);//松手检测
delay(10);//延时10ms
while(!key1);//再松手检测
}
else d1=1;
// aa595_in(duan[num]);
// aa595_in(wei[3]);
shi=num/10;
ge=num%10;
a595_in(duan[shi]);
aa595_in(wei[3]);
aa595_out();
delay(10);
aa595_in(duan[ge]);
aa595_in(wei[2]);
aa595_out();
delay(10);}
}
void delay(uint z) {
uint x,y;
for(x=100;x>0;x--) for(y=z;y>0;y--);
}//延时子程序,延时Zms
#include <reg52h>
#include <mathh>
#define uint unsigned int
#define uchar unsigned char
sbit fm=P1^7;//蜂鸣器
uint aa=0,c;
void Delay1ms(unsigned int i) //1ms延时程序
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void init()//初始化设置
{
TMOD=0x01;//定时器0作为定时器用
TH0=965536-5000)/256;//定时50ms
TL0=965536-5000)%256;
EA=1;//开总中断
ET0=1;//允许定时器1中断
TR0=1;//启动定时器
}
void main()//主程序很简单
{
init();//初始化
c=36008;
while(1)//循环程序
{
while(c!=0);
c=36008;
fm=1;//报警
Delay1ms(5000) ;
fm=0;//报警停止
}
}
void timer0()interrupt 1//定时器0的中断序号为1
{
aa++;
TH0=965536-5000)/256;//定时50ms
TL0=965536-5000)%256;
if(aa==20)//中断10次,共1S
{
aa=0;
c--;
}
}
int sec=60;
int cnt=0;
char Buzzer=1;//关闭蜂鸣器
void Timer0Init(void) //5毫秒@110592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xEE; //设置定时初值
TF0 = 0; //清除TF0标志
ET0 = 1;//开T0中断
EA = 1;//开总中断
TR0 = 1; //定时器0开始计时
}
void Timer0Interrupt(void) interrupt 1
{
cnt++;
if(cnt>=200)
{
cnt=0;sec--;
if(sec==0)EA=0;
}
}
其它就自己写了。
if(sec==0)Buzzer=0;
//两位数码管显示倒计数99~00,51单片机。
#include<reg52h> // 倒计数
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar bai,shi;
uint a1,a2;
sbit D1=P3^0; // 位选1 P1口段码输出
sbit D2=P3^1; // 位选2
sbit key=P3^7; // 启动/停止
bit y ;
void main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
bai=0;
shi=0;
while(1)
{
if(key==0)
{
}
}
}
void timer0()interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
a1++;
y = ~y;
if(a1==100)
{
a1=0;
if(key==1) a2--;
if(a2>=100) a2=99;
}
D1 = 1; D2 = 1;
if(y==1)
{
P1=table[a2/10];
D1=0;
}
else
{
P1=table[a2%10];
D2=0;
}
}
你是不是用2了锁存器啊。
P2=led_table[ten];
led_ten=1;//打开锁存器
led_ten=0;//关闭锁存期
存储10位
P2=led_table[single];
led_single=1;//打开锁存器
led_single=0;//关闭锁存器
存储个位
另外led_ten,led_single 你要先定义一下吧
错误好多哦
错误一、数码管编码声明部分,缺了个 char
错误二、定时器中断里面,各个变量的值运行不对
错误三、程序整体的结构不够合理
另外你的数码管显示部分太过于繁琐,且在主循环内不方便程序的调试
不多说了,还是上程序吧,已经为你改了,且经过硬件测试的
我测试的时候,使用的端口和你的不一样,测试结束后又改为你使用的端口
更改完端口后,未实测,如果有错误请联系我
//
#include <reg51h> //51单片机通用头文件
char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned int i,t,h;
sbit a=P1^0; sbit led=P3^7; sbit lad=P3^6;
//char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
//
void YS(char hs){char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}//延时函数
//
void XS(int xs) //数码管显示
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10; d3=(xs/100)%10; d4=(xs/1000)%10;
P0=table[d1]; P2=0xfe; YS(10); P2=0xff;//个位显示
P0=table[d2]; P2=0xfd; YS(10); P2=0xff;//十位显示
P0=table[d3]; P2=0xfb; YS(10); P2=0xff;//百位显示
P0=table[d4]; P2=0xf7; YS(10); P2=0xff;//千位显示
}
//
void main()
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TMOD=0x01; TR0=1; ET0=1; EA=1;
led=0;lad=1;
while(1)
{
XS(h);//调用数码管显示函数
if(a==0){h=10;}//如果按键被按下,则把变量赋值
}
}
//
void t0()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++; t++;
if(h>0){t=0;}//如果按键按下,屏蔽 t 计数,
if(t>=10){t=0;led=~led; lad=~lad;}//t计数,用于两个LED闪烁
if(i>=20){i=0;if(h>0){h--;led=0;lad=0;}}//如果数值不为0,则一秒减一,并点亮两个LED
if(h==0&&led==0&&lad==0){led=1;lad=0;}//此句是防止数码管倒计时后两个LED继续同时点亮
}
//
以上就是关于求单片机60分倒计时程序全部的内容,包括:求单片机60分倒计时程序、51单片机试题,写一个用单个数码管显示10秒倒计时的程序,急!!!!!、求单片机数码管倒计时程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)