㈠ 单片机求助C语言编程 实现99秒倒计时到0秒停止! 求好心人哪!
#include<reg51.h> // 包含51单片机寄存器定义的头文件
unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管显示0~9的段码表
unsigned char int_time; //记录中断次数
unsigned char second; //储存秒
/***********************************************************************
函数功能:快速动态扫描延时,延时约0.6毫秒
************************************************************************/
void delay(void)
{
unsigned char i;
for(i=0;i<200;i++) ;
}
/***********************************************************************
函数功能:显示秒
入口参数:k
出口参数:无
************************************************************************/
void DisplaySecond(unsigned char k)
{
P2=Tab[k/10]; //显示十位
P3=0x01; //P3.0引脚输出高电平, 点亮 十位
delay();
P3=0xfc; //关闭所有数码管
P2=Tab[k%10]; //显示个位
P3=0x02; //P3.1引脚输出高电平, 点亮 个位
delay();
P3=0xfc; //关闭所有数码管
}
void main(void) //主函数
{
TMOD=0x01; //使用定时器T0
TH0=(65536-5000)/256; //将定时器计时时间设定为50毫秒
TL0=(65536-5000)%256;
EA=1; //开启总中断
ET0=1; //定时器T0中断允许
TR0=1; //启动定时器T0开始运行
int_time=0; //中断次数初始化
second=99; //秒初始化
while(1)
{
DisplaySecond(second); //调用秒的显示子程序
while(second==0)
DisplaySecond(second);
}
}
//********************************************************
//函数功能:定时器T0的中断服务程序
//*******************************************************
void interserve(void ) interrupt 1 using 1
{
TR0=0; //关闭定时器T0
int_time ++; //每来一次中断,中断次数int_time自加1
if(int_time==20) //够20次中断,即1秒钟进行一次检测结果采样
{
int_time=0; //中断次数清0
second--; //秒减1
}
TH0=(65536-5000)/256; //重新给计数器T0赋初值
TL0=(65536-5000)%256;
TR0=1; //启动定时器T0
if(second==0) //如果 倒计时 0 停止定时器T0
TR0=0;
}
㈡ 基于51单片机的999倒计时C语言程序。
/*************************************
要求是能进行9999秒倒计时
用C语言实现
*************************************/
#include<at89X51.h>
#define uchar unsigned char
#define uint unsigned int
uchar num_qian,num_,num_shi,num_ge;//定义千位,百位,十位,个位。
uint time;//要显示的时间0~9999
uint tcnt;//计时单元
//*****************//
//以下是端口定义
//*****************//
sbit key_qian=P1^0;//按键"千加1"
sbit key_ =P1^2;//按键"百加1"
sbit key_shi =P1^4;//按键"十加1"
sbit key_ge =P1^6;//按键"个加1"
sbit laba =P3^1;//喇叭
void delay(unsigned int z)//1毫秒延时子函数
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//*****************//
//以下是七段数码管驱动程序
//*****************//
/**************************************************
** 功能描述: 中断接受字符串驱动程序
**占用引脚资源 P30
**占用系统资源 串口中断;中断向量4
***************************************************/
#define DUAN P0
#define WEI P2
unsigned char code dispcode[]=
{
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
}; //共阴段码表
//0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,NULL,-
uchar code dispbitcode[]=
{0xef,0xdf,0xbf,0x7f}; //共阴位码表
uchar dispbuf[4],dispcount;//开辟四个显示缓冲区
void ledinit()/***初始化子函数,定时器0刷新显示内容***/
{
TMOD|=0x01; // 定时器0方式1
TH0=(65536-5000)/256; //定时器16位模式
TL0=(65536-5000)%256; //溢出时间:5ms
TR0=1; //开启定时器0
ET0=1; //使能定时器0
EA=1; //系统使能
}
void leddisp()//固定显示某些数字
{
dispbuf[0]=time/1000;
dispbuf[1]=time%1000/100;
dispbuf[2]=time%100/10;
dispbuf[3]=time%10;
}
void keytest()//按键检测程序
{
if(!key_qian)//如果千位按键
{
delay(5);//5毫秒延时去抖
if(!key_qian)//如果千位按键的确按下了
{
num_qian++;//千位数字加一
while(!key_qian);//等待按键松开
}
time+=num_qian*1000;//千位数字加1
}
if(!key_)//如果百位按键
{
delay(5);//5毫秒延时去抖
if(!key_)//如果百位按键的确按下了
{
num_++;//百位数字加一
while(!key_);//等待按键松开
}
time+=num_*100;//百位数字加1
}
if(!key_shi)//如果十位按键
{
delay(5);//5毫秒延时去抖
if(!key_shi)//如果十位按键的确按下了
{
num_shi++;//千位数字加一
while(!key_shi);//等待按键松开
}
time+=num_shi*10;//十位数字加1
}
if(!key_ge)//如果千位按键
{
delay(5);//5毫秒延时去抖
if(!key_ge)//如果个位按键的确按下了
{
num_qian++;//千位数字加一
while(!key_ge);//等待按键松开
}
time+=num_ge;//个位数字加1
}
}
void main()//主程序
{
ledinit();//数码管中断初始化,定时器0刷新显示内容
while(1)//大循环
{
if((!key_qian)||(!key_)||(!key_shi)||(!key_ge))//如果四个按键中的任何一个被按下
keytest();//执行按键检测程序
leddisp();//不断的刷新显示内容
}
}
//*************************************************
//以下是定时器0刷新数码管显示内容驱动程序
//*************************************************
/**************************************************
** 功能描述: 七段数码管驱动程序
**占用引脚资源: 数码管段选,数码管位选
**占用系统资源T0
***************************************************/
void t0(void) interrupt 1 //using 0
{
TH0=(65536-5000)/256; //5ms中断
TL0=(65536-5000)%256; //16位定时器模式
WEI=0xff;//关位选
DUAN=dispcode[dispbuf[dispcount]]; //段选
WEI=dispbitcode[dispcount]; //开位选
dispcount++;
if(dispcount==5)
dispcount=0;
tcnt++; //计数个数加一
if(tcnt==5*200)//满足1S了
{
tcnt=0;//计数个数归零
time--;//时间减一
if(time==0)//时间
while(1);
}
if(time<10)//时间小于10
laba=~laba;//声音报警
}
这是9999秒倒计时的
㈢ 单片机程序问题:用1个按键去控制1个灯,此键每快速地按2下,灯的亮与灭就翻转1次。
假如你使用的是P30这个引脚接按键,P31接灯控制。
sbit ctr = P3^0;
sbit Lamp = P3^1;
void main()
{
char i=0;
bit flag = 0;
while(1)
{
if(ctr==0) //表示第一次按下键了
{
for(i=0;i<30;i++)
{
delayS(10); //延迟10mS
if(ctr==1 || flag ==1) //表示键在0.3S内松开了
{
flag = 1;
if(ctr==0) //表示第二次按下键了
{
delayS(10); //延迟10mS,去除按键抖动
if(ctr==0)
{
flag =0;
Lamp = !Lamp ; //翻转灯
while(ctr==0); //等待放开键
break; // 跳出循环
}
}
}
}
flag =0; //清除标志
}
}
}
㈣ 单片机实验箱的主要特点
(1)USB三核高性能KeilC仿真器(标配):系统标配有USB接口DICE-Keil51仿真器或选配DICE-3000和其它型号仿真器。
★DICE-Keil51仿真器是目前同行业功能完整,性能稳定,技术先进的全USB接口仿真器。兼容KEILC51 UV2 调试环境支持单步、断点、随时可查看寄存器、变量、IO、内存内容。支持夭折功能可仿真各种51指令兼容单片机,ATMEL、WINBOND、INTEL、SST、ST等等。
★不占资源,无限制真实仿真(32个IO、串口、T2可完全单步仿真),真实仿真32条IO脚,包括任意使用P30和P31口。
★USB接口,无需外接电源和串口,即插即用,台式电脑、无串口的笔记本均适用。三CPU设计,采用仿真芯片+监控芯片+USB芯片结构,在仿真状态下仿真芯片被完全冻结,可以100%重现CPU所有特性,即总线I/O口。
★下载仿真通讯急速115200BPS,也是KEIL支持的最高速度,相比以前版本提高一个数量级(10倍以上),单步运行如飞。
(2)支持C8051F 单片机(SOC):选配C8051F扩展板和DICE-EC5仿真器,DICE-EC5型USB高速通讯仿真器,通过4脚的JTAG接口可以进行非侵入式、全速的在线系统调试、仿真;集成开发环境支持Silicon Labs IDE和KEIL C软件。
(3)支持EDA/USB/以太网/CAN开发:通过选配EDA(标配并口JTAG下载线)USB/以太网/CAN扩展卡,实现CPLD/FPGA的实验、学习和开发,并和单片机系统共用硬件资源。
(4)实验开放性:实验电路单元尽可能独立开放,如开放式键盘, 开放式显示器,开放式串口等,为适应多种方式实验提供可能。
(5)二次开发:系统将地址总线、数据总线、控制总线全部引出,主机板留有扩展单元,通过单片机仿真器调试用户系统。
(6)在线下载:实验系统配有ISP在线下载接口,可直接烧录AT89S5X单片机。
(7)二种工作方式:一是联PC机运行,在与上位软件联机的状态下,实现各种调试和行运的操作;二是脱机运行,系统配有管理监控,在无仿真器状态下,系统自动切换到脱机管理状态,用户可轻松调用EPROM中的实验程序完成实验。
(8)革命性的单片机学习方式-DAQ创新实验平台(我公司专利产品,专利号:03221239.9)
通过选配DICE-DAQ数控式创新实验平台,将一些复杂的例如交通灯控制系统、四层电梯控制系统、刀库捷径选择等实验通过当前流行的动画技术制作出来,借助PC要资源,仿真实物的控制系统。通过USB接口电路,实现CPU(单片机)对虚拟被控对象的控制和双向通信。该实验平台形象生动、可操作性强、可实现复杂的闭环控制,大大提高学生的学习兴趣和创新思维。与传统的实物模型相比:性价比极高、无需后续的保养和维修、使用安全方便。目前该创新实验平台有15个典型的系统实验。