用KEIL编写C语言程序实现:单片机是AT89C51,实现一个计时器,数码管为6为的,有三个按键接在P0上。
很简单,只是电路能用吗?单片机能驱动的了数码管码?
如果纯粹是Protues玩,那就无所谓了。
利用定时计数器的计数功能,取GATE=1,C/T=1
BT2接INT0
BT3接T0
JB BT1,CLEAR
clear程序段中对P2清零
#include#define uchar unsigned charuchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //0到9uchar num;uchar led[]={1,2,3,4};void t0isr() interrupt 1{TH0=(65536-5000)/256;TL0=(65536-5000)%256;switch(num){case 0:P2=0x01;break;case 1:P2=0x02;break;case 2:P2=0x04;break;case 3:P2=0x08;break;default:break;}P0=~tab[led[num]];num++;num&=0x03;}main(){TMOD=0x11;TH0=(65536-5000)/256;TL0=(65536-5000)%256;TR0=1;ET0=1;EA=1;while(1);}
按照你的要求写的程序如下,你拿去测试吧!
#include "REG52.H"
sbit SHUG_01 = P2^0; //数码管1
sbit SHUG_02 = P2^1; //数码管2
sbit SHUG_03 = P2^2; //数码管3
sbit SHUG_04 = P2^3; //数码管4
sbit SHUG_05 = P2^4; //数码管5
sbit SHUG_06 = P2^5; //数码管6
sbit KEY0_01 = P0^0; //按键 启动或停止
sbit KEY0_02 = P0^1; //按键 加
sbit KEY0_03 = P0^2; //按键减
#define LED_DATA P1 //P1数据端口
unsigned char value_temp = 0;
unsigned char value_shio = 23;
unsigned char value_feno = 59;
unsigned char value_miao = 59;
unsigned char code value_tab0[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //共阳极
unsigned char code value_tab1[]={0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; //共阳极
/*
* 延时1ms延时子函数
**/
void Delay_1ms(unsigned int Time)
{
unsigned int x, y;
for(x = Time; x > 0; x--)
for(y = 120; y > 0; y--);
}
/*
* 按键开关【启动和停止】子函数
**/
void Scan_keyoutCmd(void)
{
if(KEY0_01 == 0)
{
Delay_1ms(10);
if(KEY0_01 == 0)
{
TR0 = ~ TR0;
}
while(KEY0_01 == 0);
}
if(KEY0_02 == 0)
{
Delay_1ms(10);
if(KEY0_02 == 0)
{
value_miao--;
if(value_miao == -1)
{
value_feno--;
value_miao = 59;
if(value_feno == 0)
{
value_shio--;
value_feno = 59;
if(value_shio == 0)
{
value_shio = 23;
}
}
}
while(KEY0_02 == 0);
}
}
if(KEY0_03 == 0)
{
Delay_1ms(10);
if(KEY0_03 == 0)
{
value_miao++;
if(value_miao == 60)
{
value_miao = 0;
value_feno++;
if(value_feno == 60)
{
value_feno = 0;
value_shio++;
if(value_shio == 24)
{
value_shio = 0;
}
}
}
while(KEY0_03 == 0); //检测松手
}
}
}
/*
* 程序运行【启动和停止】子函数
**/
void Disp_layledketCmd(void)
{
/***小时***/
SHUG_01 = 1;
LED_DATA = value_tab0[value_shio / 10]; /*******小时的十位数显示***************/
Delay_1ms(5);
SHUG_01 = 0;
SHUG_02 = 1;
LED_DATA = value_tab1[value_shio % 10]; /*******小时的个位数显示***************/
Delay_1ms(5);
SHUG_02 = 0;
/***分钟***/
SHUG_03 = 1;
LED_DATA = value_tab0[value_feno / 10]; /*******分钟的十位数显示***************/
Delay_1ms(5);
SHUG_03 = 0;
SHUG_04 = 1;
LED_DATA = value_tab1[value_feno % 10]; /*******分钟的个位数显示***************/
Delay_1ms(5);
SHUG_04 = 0;
/***秒钟***/
SHUG_05 = 1;
LED_DATA = value_tab0[value_miao / 10]; /*******秒钟的十位数显示***************/
Delay_1ms(5);
SHUG_05 = 0;
SHUG_06 = 1;
LED_DATA = value_tab0[value_miao % 10]; /*******秒钟的个位数显示***************/
Delay_1ms(5);
SHUG_06 = 0;
}
void Tero_Init(void)
{
TMOD = 0x01;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
ET0 = 1;
TR0 = 1;
EA = 1;
}
/*
* 函数主体
**/
int main(void)
{
P1 = P2 = P3 = 0x00;
Tero_Init();
while(1)
{
Scan_keyoutCmd();
Disp_layledketCmd(); //执行应运程序
}
}
/*
* 定时器中断服务程序
**/
void Tmero()interrupt 1
{
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
value_temp++;
if(value_temp == 20)
{
value_temp = 0;
value_miao--;
if(value_miao == 0)
{
value_feno--;
value_miao = 59;
if(value_feno == 0)
{
value_shio--;
value_feno = 59;
if(value_shio == 0)
{
value_shio = 23;
}
}
}
}
}
你可以参考下面这个程序,这个是加计时器.把对应端口改下,计时改减就可以了.
数码管的显示网上大把,移植一下就可以了.
//--------LCD 1601 clock----------------------------------------
//---modified from a LCD1602 program,2012/11/21-----------------
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//----P3: key input for modify timer ---------------------------
#define KEY_IO P3
#define LCD_IO P0
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
//----P1.2: timer speaker output-------------------------------
sbit SPK = P1^2;
//----P2.4: timer LED indicator output------------------------
sbit LED = P2^4;
bit new_s, modify = 0;
char t0, sec = 50, min = 59, hour = 23;
//char code LCD_line1[] = "Designed by ZELD";
char code LCD_line2[] = "Timer: 00:00:00 ";
char Timer_buf[] = "23:59:50";
//---------------------------------------------------
void delay(uint z)
{
uint x, y;
for(x = z; x > 0; x--) for(y = 100; y > 0; y--);
}
//---------------------------------------------------
void W_LCD_Com(uchar com) //写指令
{
LCD_RS = 0; LCD_IO = com; // LCD_RS和R/W都为低电平时,写入指令
LCD_EN = 1; delay(5); LCD_EN = 0; //用EN输入一个高脉冲
}
//---------------------------------------------------
void W_LCD_Dat(uchar dat) //写数据
{
LCD_RS = 1; LCD_IO = dat; // LCD_RS为高、R/W为低时,写入数据
LCD_EN = 1; delay(5); LCD_EN = 0; //用EN输入一个高脉冲
}
//---------------------------------------------------
void W_LCD_STR(uchar *s) //写字符串
{
while(*s) W_LCD_Dat(*s++);
}
//---------------------------------------------------
void W_BUFF(void) //填写显示缓冲区
{
Timer_buf[7] = sec % 10 + 48; Timer_buf[6] = sec / 10 + 48;
Timer_buf[4] = min % 10 + 48; Timer_buf[3] = min / 10 + 48;
Timer_buf[1] = hour % 10 + 48;Timer_buf[0] = hour / 10 + 48;
// W_LCD_Com(0xc0 + 7); W_LCD_STR(Timer_buf);
//1602 start from address C0H(second row),1601 start from 40H-------
W_LCD_Com(0x80 + 7); W_LCD_STR(Timer_buf);
}
//---------------------------------------------------
uchar read_key(void)
{
uchar x1, x2;
KEY_IO = 255;
x1 = KEY_IO;
if (x1 != 255) {
delay(100);
x2 = KEY_IO;
if (x1 != x2) return 255;
while(x2 != 255) x2 = KEY_IO;
if (x1 == 0x7f) return 0;
else if (x1 == 0xbf) return 1;
else if (x1 == 0xdf) return 2;
else if (x1 == 0xef) return 3;
else if (x1 == 0xf7) return 4;
}
return 255;
}
//---------------------------------------------------
void Init()
{
LCD_RW = 0;
W_LCD_Com(0x38); delay(50);
W_LCD_Com(0x0c);
W_LCD_Com(0x06);
W_LCD_Com(0x01);
// W_LCD_Com(0x80); W_LCD_STR(LCD_line1);
// W_LCD_Com(0xC0); W_LCD_STR(LCD_line2);
W_LCD_Com(0x80); W_LCD_STR(LCD_line2);
TMOD = 0x01; //T0定时方式1
TH0 = 0x4c;
TR0 = 1; //启动T0
PT0 = 1; //高优先级, 以保证定时精度
ET0 = 1;
EA = 1;
}
//---------------------------------------------------
void main()
{
uint i, j;
uchar Key;
Init();
while(1) {
//-------------------------------
if (new_s) { //如果出现了新的一秒, 修改时间
new_s = 0; sec++; sec %= 60;
if(!sec) { min++; min %= 60;
if(!min) { hour++; hour %= 24;}
}
W_BUFF(); //写显示
//-------------------------------
if (!sec && !min) { //整点报时
for (i = 0; i < 200; i++) {
SPK = 0; for (j = 0; j < 100; j++);
SPK = 1; for (j = 0; j < 100; j++);
} }
}
//-------------------------------
Key = read_key(); //读出按键
switch(Key) { //分别处理四个按键
case 0: modify = 1; break;
case 1: if(modify) {min++; min %= 60; W_BUFF(); break;}
case 2: if(modify) {hour++; hour %= 24; W_BUFF(); break;}
case 3: modify = 0; break;
} }
}
//---------------------------------------------------
void timer0(void) interrupt 1 //T0中断函数, 50ms执行一次
{
TH0 = 0x4c;
t0++; t0 %= 20; //20, 一秒钟
if(t0 == 0) {new_s = 1; LED = ~LED;}
if(modify) LED = 0;
}
//===================================================
c语言编辑器和keil有什么区别?
独立软件需要安装,网页打开就能用,但相对功能简化。就像其它软件vs和codeslocks也用来编写c语言。而编译是软件里设置选择的编译器处理的,比如GCC,MSC,TurboC。从应用上讲,在线网页编译器使用简单,但功能也少,主要学习或调试一下代码。而专门的软件是用于开发的,比如上面的keil就用于单片机程序的开发 ...
用KEIL编写C语言程序实现:单片机是AT89C51,实现一个计时器,数码管为6...
按照你的要求写的程序如下,你拿去测试吧!include "REG52.H"sbit SHUG_01 = P2^0; \/\/数码管1 sbit SHUG_02 = P2^1; \/\/数码管2 sbit SHUG_03 = P2^2; \/\/数码管3 sbit SHUG_04 = P2^3; \/\/数码管4 sbit SHUG_05 = P2^4; \/\/数码管5 sbit SHUG_06 = P2^5;...
keil uvision4可以用C语言写吗?就是能编译C吗
可以啊,写完代码直接点【build】
我用Keil编写的C语言代码老是提示这个错误,帮我修正一下
Sbit P1_0=p1^0中的p1^0,应改为P1^0,在C51的系统中,I\/O口描述语句必须是大写的,reg51.h程序包中是这样定义的。
在keil中用c语言编写求最值的程序代码?
include <stdio.h>double max(double a,double b){ return a>b?a:b;}double min(double a,double b){ return a
keil uvision4调用C语言
KEIL中要编译C语言,首先肯定要建一个工程,再将C源程序添加到工程中或者新建C源程序。如果导入一个工程,在左边栏中,肯定有包含的源程序及头文件列表,双击源程序就打开显示了。
用keil软件编写C语言程序
1:定义一个变量,指ram80h的内容赋给变量,再把变量的量赋给外部ram2010h,
我在用keilc51编写C语言程序时最左边为什么不显示行数
要keil软件在编写C语言程序时最左边显示行数,设置一下就行了,点主莱单的Edit,见下图,选中设置选项一行,画红圈一行。弹出一个对话框,下图画红圈项打勾即可。
keil 如何生成c语言库函数
在左侧的项目树上,在项目根目录上(默认是target 1)点右键,选择option for target target 1,在选“output”页,再选Create Library,最后点OK就可以了。如果你的程序没有错误,编译通过了,那就会生成一个库文件,在以后的程序中调用了。
用keil软件编写单片机程序的步骤
一路点击确认后回到如下图所示的主界面,并如下图所示点击新建程序输入文本 点击后出现如下第一张图所示界面,并点击保存按钮 点击保存按钮后出现下第一张图所示对话框,在箭头所指的地方输入源文件名称加后缀名(如果你是用C语言编写程序后缀名为*.c;如果你是用汇编语言编写程序则后缀名为*.asm)并...
娄红唯新: 在混合编程中,最常用也是最实用的方法是在C语言中加入部分汇编语言的代码,分为两种方法. 方法1)在Keil C51的函数中直接插入汇编语句 方法2)按照Keil C51接口规则,编写汇编模块方法1是利用编译控制命令#pragma asm(用来标识...
浉河区17682954598: 用KEIL编写C语言程序实现:单片机是AT89C51,实现一个计时器,数码管为6为的,有三个按键接在P0上. - ?
娄红唯新: 按照你的要求写的程序如下,你拿去测试吧!#include "REG52.H" sbit SHUG_01 = P2^0; //数码管1 sbit SHUG_02 = P2^1; //数码管2 sbit SHUG_03 = P2^2; //数码管3 sbit SHUG_04 = P2^3; //数码管4 sbit SHUG_05 = P2^4; //数码管5 ...
浉河区17682954598: 把C语言程序写入单片机 - ?
娄红唯新: 用Keil软件吧,在设置里面的output下选中要生成那种文件,再编译一下只要通过了就有了…
浉河区17682954598: keil软件用单片机控制8个LED流水灯来回点亮(C语言程序) - ?
娄红唯新: #include "reg51.h"main(){unsigned int i,j;while(1){P1=0xfe; //点亮第一个LEDfor(i=200;i>0;i--)for(j=500;j>0;j--);P1=0xfd; //点亮第二个LEDfor(i=200;i>0;i--)for(j=500;j>0;j--);P1=0xfb; //点亮第三个LEDfor(i=200;i>0;i--)for(j=500;j>...
浉河区17682954598: 所有的单片机都能运行用keil软件写的C语言程序吗? - ?
娄红唯新: KEIL是用C语言编写单片机程序的,但是单片机并不认识C语言,KEIL还可以把扩展名为C的文件转换为扩展名为HEX的文件,绝大多数单片机都认识HEX文件.
浉河区17682954598: 在51单片机中用c语言keil写程序实现用一个按键控制6个灯的亮和灭(按下按 - ?
娄红唯新: #include<reg51.h> sbit key=P1^0; sfr LED=P0; main() { while(1) if(key==0)P0=0xc0; else P0=0xff; }
浉河区17682954598: 用KEIL 为89S51单片机写个C语言音乐程序 - ?
娄红唯新: //此程序在硬件上调试通过 //本程序的单片机晶振采用11.0592M #include <reg51.h> sbit speaker=P1^1; unsigned char timer0h,timer0l,time; //世上只有妈妈好数据表 code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1, 6,2,...
浉河区17682954598: keil软件中怎样添加STC系列单片机 - ?
娄红唯新: 用keil软件,不过是两种用途,一是编译C语言程序,纯粹是编译,不用仿真.如果是这种,也不必要添加STC单片机.其实,只是在建工程时,需要选单片机型号.而编写的程序,与型号无关.所以,用实物STC单片机,建工程时,随便选一款51单片机就行.具体程序就应该按STC单片机来编写.对于STC单片机增加的寄存器可以加载STC的头文件即可.二是写程序后仿真.但是,即使是添加了STC单片机,照样不能仿真STC单片机所增加的寄存器,还是按传统51单片机来仿真,这就没有什么实际意义了. 非要添加,就去STC官网下载一个数据文件. 添加后,不论是编译还是仿真,都没有什么实际的用处.
浉河区17682954598: keil和vc++,单片机编程 - ?
娄红唯新: 1、从编程思路的角度说,单片机上用keil编程,和用VC++编程没什么不同;2、二者语言规则不同;3、主要不同在于二者针对的对象不同,所以编译架构也就不同.不一定非要用keil,也有很多别的编译软件,有支持汇编,也有支持C的,也有...
浉河区17682954598: 单片机用keil 编程C语言,控制某I/O口通断 -- 通断的循环,公式怎么编,比如循环通断100次,并编写多种延时 - ?
娄红唯新: 用FOR 循环或 While也可以 for (k=0; k<100; k++){ P1=0; Delay(); // 这里自己加个...