导航:首页 > 操作系统 > 51单片机c语言proteus

51单片机c语言proteus

发布时间:2025-05-06 03:35:52

单片机C51 C语言编程问题!!!!

voiddisplay(ucharshi,ucharge)

{

uintledout[1],i;//这里应该是ledout[2]

我在proteus上进行了仿真,但是不知道什么原因,只对共阳极LED数码管好使。我就把程序稍微做了改动,仿真结果可以正确计时。

我把程序贴在下面供参考

#include<reg52.h>

#define禅悔ucharunsignedchar

#defineuintunsignedint

ucharnum=0,count=0,num2=0,shi=0,ge=0;

ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//共阳//段选数据表

//ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

ucharcodewei[2]={0xfe,0xfd};//位选数据表

voiddisplay(uchar,uchar);

voiddelay(uint);

voidmain()

{

TMOD=0x10;//设定定时器1工作在方式1

TH1=(65536-50000)/256;//装载初值

TL1=(65536-50000)%256;//开总中断

//开定时器1中断

ET1=1;//启动定时器1

TR1=1;//程序在此不停对于数码管动态扫描等待中断

EA=1;

while(1)

{

display(shi,ge);//显示函数

}

}

voiddisplay(ucharshi,ucharge)

{

uintledout[2],i;

ledout[0]=table[shi];雹袭锋//段选数据十位

ledout[1]=table[ge];//段选数据各个

for(i=0;i<2;i++)

{//用P0输出位选数据

P0=wei[i];

//这里用查表的方式来赋值

P2=ledout[i];//用P2输出段选数据

delay(1);//扫描间隔

}

}

//1S中断函数

voidT1_time()interrupt3

{

TH0=(65536-50000)/256;源晌//重新装载初值

TL0=(65536-50000)%256;

count++;

if(count==20)//如果到了20次,说明1秒到

{//把COUNT清零重新计数20次

count=0;

num2++;//用NUM2向来数码管显示到60后归零

if(num2==60)

num2=0;

shi=num2/10;//把NUM2分成2个数十位和个位

ge=num2%10;

}

}

voiddelay(uintxms)

{

uinti,j;

for(i=xms;i>0;i--)//延时程序

for(j=110;j>0;j--);

}

⑵ 用c语言编写程序,用于c51单片机四位共阴数码管显示,显示分秒的计时器。

用c语言编写程序,用于c51单片机四位共阴数码管显示,显示分秒的计时器。

用proteus做的时钟
可以显示年月日时分秒
可调整时间
有图
*/
#includereg52.h

⑶ c51单片机c语言交通灯的程序

Proteus仿真原理图:

程序如下:

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

uchar data buf[4];

uchar data sec_dx=20;//东西数默认

uchar data sec_nb=30;//南北默认值

uchar data set_timedx=20;

uchar data set_timenb=30;

int n;

uchar data b;//定时器中断次数

sbit k1=P1^6;//定义5组开关

sbit k2=P1^7;

sbit k3=P2^7;

sbit k4=P3^0;

sbit k5=P3^1;

sbit Yellow_nb=P2^5; //南北黄灯标志

sbit Yellow_dx=P2^2; //东西黄灯标志

sbit Green_nb=P2^4;

sbit Green_dx=P2^1;

sbit Buzz=P3^7;

bit Buzzer_Indicate;

bit time=0;//灯状态循环标志

bit set=1;//调时方向切换键标志

uchar code table[11]={ //共阴极字型码

0x3f, //--0

0x06, //--1

0x5b, //--2

0x4f, //--3

0x66, //--4

0x6d, //--5

0x7d, //--6

0x07, //--7

0x7f, //--8

0x6f, //--9

0x00 //--NULL

};

//函数的声明部分

void delay(int ms);//延时子程序

void key();//按键扫描子程序

void key_to1();//键处理子程序

void key_to2();

void key_to3();

void display();//显示子程序

void logo(); //开机LOGO

void Buzzer();

//主程序

void main()

{

TMOD=0X01;

TH0=0XD8;

TL0=0XF0;

EA=1;

ET0=1;

TR0=1;

EX0=1;

EX1=1;

logo();

P2=0Xc3;// 开始默认状态,东西绿灯,南北黄灯

sec_nb=sec_dx+5;

while(1)

{

key(); //调用按键扫描程序

display(); //调用显示程序

Buzzer();

}

}

//函数的定义部分

void key() //按键扫描子程序

{

if(k1!=1)

{

delay(10);

if(k1!=1)

{

while(k1!=1)

{

key_to1();

for(n=0;n<40;n++)

{ display();}

}

}

}

if(k2!=1)

{

delay(10);

if(k2!=1)

{

while(k2!=1)

{

key_to2();

for(n=0;n<40;n++)

{ display();}

}

}

}

if(k3!=1)

{

TR0=1; //启动定时器

Buzzer_Indicate=0;

sec_nb=set_timenb; //从中断回复,仍显示设置过的数值

sec_dx=set_timedx;

if(time==0)

{ P2=0X99;sec_nb=sec_dx+5; }

else { P2=0xC3;sec_dx=sec_nb+5; }

}

if(k4!=1)

{

delay(5);

if(k4!=1)

{

while(k4!=1);

set=!set;

}

}

if(k5!=1)

{

delay(5);

if(k5!=1)

{

while(k5!=1)

key_to3();

}

}

}

void display() //显示子程序

{

buf[1]=sec_dx/10; //第1位 东西秒十位

buf[2]=sec_dx%10; //第2位 东西秒个位

buf[3]=sec_nb/10; //第3位 南北秒十位

buf[0]=sec_nb%10; //第4位 南北秒个位

P1=0xff; // 初始灯为灭的

P0=0x00;

P1=0xfe; //片选LCD1

P0=table[buf[1]];

delay(1);

P1=0xff;

P0=0x00;

P1=0xfd; //片选LCD2

P0=table[buf[2]];

delay(1);

P1=0xff;

P0=0x00;

P1=0Xfb; //片选LCD3

P0=table[buf[3]];

delay(1);

P1=0xff;

P0=0x00;

P1=0Xf7;

P0=table[buf[0]]; //片选LCD4

delay(1);

}

void time0(void) interrupt 1 using 1 //定时中断子程序

{

b++;

if(b==19) // 定时器中断次数

{ b=0;

sec_dx--;

sec_nb--;

if(sec_nb<=5&&time==0) //东西黄灯闪

{ Green_dx=0;Yellow_dx=!Yellow_dx;}

if(sec_dx<=5&&time==1) //南北黄灯闪

{ Green_nb=0;Yellow_nb=!Yellow_nb;}

if(sec_dx==0&&sec_nb==5)

sec_dx=5;

if(sec_nb==0&&sec_dx==5)

sec_nb=5;

if(time==0&&sec_nb==0)

{ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}

if(time==1&&sec_dx==0)

{P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}

}

}

void key_to1() //键盘处理子程序之+

{

TR0=0; //关定时器

if(set==0)

set_timenb++; //南北加1S

else

set_timedx++; //东西加1S

if(set_timenb==100)

set_timenb=1;

if( set_timedx==100)

set_timedx=1; //加到100置1

sec_nb=set_timenb ; //设置的数值赋给东西南北

sec_dx=set_timedx;

}

void key_to2() //键盘处理子程序之-

{

TR0=0; //关定时器

if(set==0)

set_timenb--; //南北减1S

else

set_timedx--; //东西减1S

if(set_timenb==0)

set_timenb=99;

if( set_timedx==0 )

set_timedx=99; //减到1重置99

sec_nb=set_timenb ; //设置的数值赋给东西南北

sec_dx=set_timedx;

}

void key_to3() //键盘处理之紧急车通行

{

TR0=0;

P2=0Xc9;

sec_dx=00;

sec_nb=00;

Buzzer_Indicate=1;

}

void int0(void) interrupt 0 using 1 //只允许东西通行

{

TR0=0;

P2=0Xc3;

Buzzer_Indicate=0;

sec_dx=00;

sec_nb=00;

}

void int1(void) interrupt 2 using 1 //只允许南北通行

{

TR0=0;

P2=0X99;

Buzzer_Indicate=0;

sec_nb=00;

sec_dx=00;

}

void logo()//开机的Logo "- - - -"

{ for(n=0;n<50;n++)

{

P0=0x40;

P1=0xfe;

delay(1);

P1=0xfd;

delay(1);

P1=0Xfb;

delay(1);

P1=0Xf7;

delay(1);

P1 = 0xff;

}

}

void Buzzer()

{

if(Buzzer_Indicate==1)

Buzz=!Buzz;

else Buzz=0;

}

void delay(int ms) //延时子程序

{

uint j,k;

for(j=0;j<ms;j++)

for(k=0;k<124;k++);

}


阅读全文

与51单片机c语言proteus相关的资料

热点内容
iphone终端命令 浏览:174
visualc教程pdf 浏览:519
ad适合练什么app 浏览:162
基于单片机的温度报警器的设计 浏览:119
androidview复制 浏览:427
东北最简单的挡光算法 浏览:86
为什么app都要获取你位置信息 浏览:156
app维护的人是干什么的 浏览:964
埃及云服务器怎么租 浏览:342
医疗电子凭证是什么app 浏览:16
javanat穿透 浏览:337
java数组索引值 浏览:92
程序员的数学21逻辑 浏览:918
程序员搞足球 浏览:36
发送文件加密了怎么办 浏览:424
程序员帮忙解决问题的有趣图片 浏览:280
大有云算超算服务器是什么 浏览:827
火花思维和编程猫区别 浏览:991
单片机跑马灯汇编 浏览:714
linux替换文本 浏览:12