文档库 最新最全的文档下载
当前位置:文档库 › 单片机C语言程序方案实训例——+Proteus仿真(前题)

单片机C语言程序方案实训例——+Proteus仿真(前题)

单片机C语言程序方案实训例——+Proteus仿真(前题)
单片机C语言程序方案实训例——+Proteus仿真(前题)

单片机C语言程序设计实训100例

——基于8051+Proteus仿真01 闪烁的LED

/*名称:闪烁的LED

说明:LED按设定的时间间隔闪烁*/

#include

#define uchar unsigned char

#define uint unsigned int

sbit LED=P10。

//延时

void DelayMS(uint x>

{

uchar i。

while(x-->

{

for(i=0。i<120。i++>。

}

}

//主程序

void main(>

{

while(1>

{

LED=~LED。

DelayMS(150>。

}

}

02从左到右的流水灯

/*名称:从左到右的流水灯

说明:接在P0口的8个LED

从左到右循环依次点亮,产生走

马灯效果*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

//延时

void DelayMS(uint x>

{

uchar i。

while(x-->

{

for(i=0。i<120。i++>。

}

}

//主程序

void main(>

{

P0=0xfe。

while(1>

{

P0=_crol_(P0,1>。 //P0的值向左循环移动

DelayMS(150>。

}

}

038只LED左右来回点亮

/*名称:8只LED左右来回点亮

说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/ #include

#include

#define uchar unsigned char

#define uint unsigned int

//延时

void DelayMS(uint x>

{

uchar i。

while(x-->

{

for(i=0。i<120。i++>。

}

}

//主程序

void main(>

{

uchar i。

P2=0x01。

while(1>

{

for(i=0。i<7。i++>

{

P2=_crol_(P2,1>。 //P2的值向左循环移动

DelayMS(150>。

}

for(i=0。i<7。i++>

{

P2=_cror_(P2,1>。 //P2的值向右循环移动

DelayMS(150>。

}

}

}

04花样流水灯

/*名称:花样流水灯

说明:16只LED分两组

按预设的多种花样变换显示*/

#include

#define uchar unsigned char

#define uint unsigned int

uchar code Pattern_P0[]=

{

0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,

0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,

0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,

0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff

}。

uchar code Pattern_P2[]=

{

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,

0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,

0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,

0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,

0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff

}。

//延时

void DelayMS(uint x>

{

uchar i。

while(x-->

{

for(i=0。i<120。i++>。

}

}

//主程序

void main(>

{

uchar i。

while(1>

{ //从数组中读取数据送至P0和P2口显示

for(i=0。i<136。i++>

{

P0=Pattern_P0[i]。

P2=Pattern_P2[i]。

DelayMS(100>。

}

}

}

05LED模拟交通灯

/* 名称:LED模拟交通灯

说明:东西向绿灯亮若干秒,黄

灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。*/

#include

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P00。//东西向灯

sbit YELLOW_A=P01。

sbit GREEN_A=P02。

sbit RED_B=P03。//南北向灯

sbit YELLOW_B=P04。

sbit GREEN_B=P05。

uchar Flash_Count=0,Operation_Type=1。 //闪烁次数,操作类型变量

//延时

void DelayMS(uint x>

{

uchar i。

while(x--> for(i=0。i<120。i++>。

}

//交通灯切换

void Traffic_Light(>

{

switch(Operation_Type>

{

case 1: //东西向绿灯与南北向红灯亮

RED_A=1。YELLOW_A=1。GREEN_A=0。

RED_B=0。YELLOW_B=1。GREEN_B=1。

DelayMS(2000>。

Operation_Type=2。

break。

case 2: //东西向黄灯闪烁,绿灯关闭

DelayMS(300>。

YELLOW_A=~YELLOW_A。GREEN_A=1。

if(++Flash_Count!=10> return。 //闪烁5次

Flash_Count=0。

Operation_Type=3。

break。

case 3: //东西向红灯,南北向绿灯亮

RED_A=0。YELLOW_A=1。GREEN_A=1。

RED_B=1。YELLOW_B=1。GREEN_B=0。

DelayMS(2000>。

Operation_Type=4。

break。

case 4: //南北向黄灯闪烁5次

DelayMS(300>。

YELLOW_B=~YELLOW_B。GREEN_B=1。

if(++Flash_Count!=10> return。

Flash_Count=0。

Operation_Type=1。

}

}

//主程序

void main(>

{

while(1> Traffic_Light(>。

}

06单只数码管循环显示0~9

/* 名称:单只数码管循环显示0~9

说明:主程序中的循环语句反复将0~9的段码送至P0口,使数字0~9循环显示*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}。//延时

void DelayMS(uint x>

{

uchar t。

while(x--> for(t=0。t<120。t++>。

}

//主程序

void main(>

{

uchar i=0。

P0=0x00。

while(1>

{

P0=~DSY_CODE[i]。

i=(i+1>%10。

DelayMS(300>。

}

}

078只数码管滚动显示单个数字

/* 名称:8只数码管滚动显示单个数字

说明:数码管从左到右依次滚动显示0~7,程序通过每次仅循环选通一只数码管*/ #include

#include

#define uchar unsigned char

#define uint unsigned int

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}。

//延时

void DelayMS(uint x>

{

uchar t。

while(x--> for(t=0。t<120。t++>。

}

//主程序

void main(>

{

uchar i,wei=0x80。

while(1>

{

for(i=0。i<8。i++>

{

P2=0xff。//关闭显示

wei=_crol_(wei,1>。

P0=DSY_CODE[i]。//发送数字段码

P2=wei。//发送位码

DelayMS(300>。

}

}

}

8只数码管动态显示多个不同字符(电路如上图 >

/* 名称:8只数码管动态显示多个不同字符

说明:数码管动态扫描显示0~7。*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}。//延时

void DelayMS(uint x>

{

uchar t。

while(x--> for(t=0。t<120。t++>。

}

//主程序

void main(>

{

uchar i,wei=0x80。

while(1>

{

for(i=0。i<8。i++>

{

P0=0xff。

P0=DSY_CODE[i]。//发送段码

wei=_crol_(wei,1>。

P2=wei。//发送位码

DelayMS(2>。

}

}

}

098只数码管闪烁显示数字串(电路如上图>

/* 名称:8只数码管闪烁显示数字串

说明:数码管闪烁显示由0~7构成的一串数字

本例用动态刷新法显示一串数字,在停止刷新时所有数字显示消失。*/

#include

#define uchar unsigned char

#define uint unsigned int

//段码表

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}。//位码表

uchar code DSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}。

//延时

void DelayMS(uint x>

{

uchar t。

while(x--> for(t=0。t<120。t++>。

}

//主程序

void main(>

{

uchar i,j。

while(1>

{

for(i=0。i<30。i++>

{

for(j=0。j<8。j++>

{

P0=0xff。

P0=DSY_CODE[j]。//发送段码

P2=DSY_IDX[j]。 //发送位码

DelayMS(2>。

}

}

P2=0x00。//关闭所有数码管并延时

DelayMS(1000>。

}

}

108只数码管滚动显示数字串(电路如上图>

/* 名称:8只数码管滚动显示数字串

说明:数码管向左滚动显示3个字符构成的数字串*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

//段码表

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}。//下面数组看作环形队列,显示从某个数开始的8个数<10表示黑屏)

uchar Num[]={10,10,10,10,10,10,10,10,2,9,8}。

//延时

void DelayMS(uint x>

{

uchar t。

while(x--> for(t=0。t<120。t++>。

}

//主程序

void main(>

{

uchar i,j,k=0,m=0x80。

while(1>

{ //刷新若干次,保持一段时间的稳定显示

for(i=0。i<15。i++>

{

for(j=0。j<8。j++>

{ //发送段码,采用环形取法,从第k个开始取第j个

P0=0xff。

P0=DSY_CODE[Num[(k+j>%11]]。

m=_crol_(m,1>。

P2=m。 //发送位码

DelayMS(2>。

}

}

k=(k+1>%11。 //环形队列首支针k递增,Num下标范围0~10,故对11取余}

}

11K1-K4 控制LED移位

/* 名称:K1-K4 控制LED移位

说明:按下K1时,P0口LED上移一位;

按下K2时,P0口LED下移一位;

按下K3时,P2口LED上移一位;

按下K4时,P2口LED下移一位;*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

//延时

void DelayMS(uint x>

{

uchar i。

while(x-->

for(i=0。i<120。i++>。

}

//根据P1口的按键移动LED

void Move_LED(>

{

if((P1&0x10>==0> P0=_cror_(P0,1>。//K1

else if((P1&0x20>==0> P0=_crol_(P0,1>。 //K2

else if((P1&0x40>==0> P2=_cror_(P2,1>。//K3

else if((P1&0x80>==0> P2=_crol_(P2,1>。 //K4

}

//主程序

void main(>

{

uchar Recent_Key。 //最近按键

P0=0xfe。

P2=0xfe。

P1=0xff。

Recent_Key=0xff。

while(1>

{

if(Recent_Key!=P1>

{

Recent_Key=P1。 //保存最近按键

Move_LED(>。

DelayMS(10>。

}

}

}

12K1-K4 按键状态显示

/*名称:K1-K4 按键状态显示

说明:K1、K2按下时LED点亮,松开时熄灭,

K3、K4按下并释放时LED点亮,再次按下并释放时熄灭;*/ #include

#define uchar unsigned char

#define uint unsigned int

sbit LED1=P00。

sbit LED2=P01。

sbit LED3=P02。

sbit LED4=P03。

sbit K1=P10。

sbit K2=P11。

sbit K3=P12。

sbit K4=P13。

//延时

void DelayMS(uint x>

{

uchar i。

while(x--> for(i=0。i<120。i++>。

}

//主程序

void main(>

{

P0=0xff。

P1=0xff。

while(1>

{

LED1=K1。

LED2=K2。

if(K3==0>

while(K3==0>。

LED3=~LED3。

}

if(K4==0>

{

while(K4==0>。

LED4=~LED4。

}

DelayMS(10>。

}

}

13K1-K4 分组控制LED

/* 名称:K1-K4 分组控制LED

说明:每次按下K1时递增点亮一只LED,全亮时再次按下则再次循环开始,

K2按下后点亮上面4只LED,K3按下后点亮下面4只LED,K4按下后关闭所有LED*/ #include

#define uchar unsigned char

#define uint unsigned int

//延时

void DelayMS(uint x>

{

uchar i。

while(x--> for(i=0。i<120。i++>。

}

//主程序

void main(>

{

uchar k,t,Key_State。

P0=0xff。

P1=0xff。

while(1>

{

t=P1。

if(t!=0xff>

{

DelayMS(10>。

if(t!=P1> continue。

//取得4位按键值,由模式XXXX1111(X中有一位为0,其他均为1>

//变为模式0000XXXX(X中有一位为1,其他均为0>

Key_State=~t>>4。

k=0。

//检查1所在位置,累加获取按键号k

while(Key_State!=0>

k++。

Key_State>>=1。

}

//根据按键号k进行4种处理

switch(k>

{

case 1: if(P0==0x00> P0=0xff。

P0<<=1。

DelayMS(200>。

break。

case 2: P0=0xf0。break。

case 3: P0=0x0f。break。

case 4: P0=0xff。

}

}

}

}

14K1-K4 控制数码管移位显示

/* 名称:K1-K4 控制数码管移位显示

说明:按下K1时加1计数并增加显示位,

按下K2时减1计数并减少显示位,K3时清零。*/

#include

#define uchar unsigned char

#define uint unsigned int

//段码

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}。//位码

uchar code DSY_Index[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}。

//待显示到各数码管的数字缓冲<开始仅在0位显示0,其他黑屏)

uchar Display_Buffer[]={0,10,10,10,10,10,10,10}。

//延时

void DelayMS(uint x>

{

uchar i。

while(x--> for(i=0。i<120。i++>。

}

void Show_Count_ON_DSY(>

{

uchar i。

for(i=0。i<8。i++>

{

P0=0xff。

P0=DSY_CODE[Display_Buffer[i]]。

P2=DSY_Index[i]。

DelayMS(2>。

}

}

//主程序

void main(>

{

uchar i,Key_NO,Key_Counts=0。

P0=0xff。

P1=0xff。

P2=0x00。

while(1>

{

Show_Count_ON_DSY(>。

P1=0xff。

Key_NO=P1。

//P1口按键状态分别为K1-0xfe,K2-0xfd,K3-0xfb

switch(Key_NO>

{

case 0xfe: Key_Counts++。

if(Key_Counts>8> Key_Counts=8。

Display_Buffer[Key_Counts-1]=Key_Counts。

break。

case 0xfd: if(Key_Counts>0>Display_Buffer[--Key_Counts]=10。

break。

case 0xfb: Display_Buffer[0]=0。

for(i=1。i<8。i++> Display_Buffer[i]=10。

Key_Counts=0。

}

//若键未释放则仅刷新显示,不进行键扫描

while(P1!=0xff> Show_Count_ON_DSY(>。

}

}

15K1-K4 控制数码管加减演示

/* 名称:K1-K4 控制数码管加减演示

说明:按下K1后加1计数,按下K2

后减1计数,按下K3后清零。*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

//段码

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}。//待显示的3位缓冲

uchar Num_Buffer[]={0,0,0}。

//按键代码,按键计数

uchar Key_Code,Key_Counts=0。

//延时

void DelayMS(uint x>

{

uchar i。

while(x--> for(i=0。i<120。i++>。

}

//显示函数

void Show_Counts_ON_DSY(>

{

uchar i,j=0x01。

Num_Buffer[2]=Key_Counts/100。

Num_Buffer[1]=Key_Counts/10%10。

Num_Buffer[0]=Key_Counts%10。

for(i=0。i<3。i++>

{

j=_cror_(j,1>。

P0=0xff。

P0=DSY_CODE[Num_Buffer[i]]。

P2=j。

DelayMS(1>。

}

}

//主程序

void main(>

{

uchar i。

P0=0xff。

P1=0xff。

P2=0x00。

Key_Code=0xff。

while(1>

{

Show_Counts_ON_DSY(>。

P1=0xff。

Key_Code=P1。

//有键按下时,数码管刷新显示30次,该行代码同时起到延时作用

if(Key_Code!=0xff>

for(i=0。i<30。i++> Show_Counts_ON_DSY(>。

switch(Key_Code>

{

case 0xfe: if(Key_Counts<255> Key_Counts++。

break。

case 0xfd: if(Key_Counts>0> Key_Counts--。

break。

case 0xfb: Key_Counts=0。

}

Key_Code=0xff。

}

}

164X4矩阵键盘控制条形LED显示

/* 名称:4X4矩阵键盘控制条形LED显示

说明:运行本例时,

按下的按键值越大

点亮的LED越多。*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

//矩阵键盘按键特征码表

uchar code KeyCodeTable[]={0x11,0x12,0x14,0x18,0x21,

0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88}。

//延时

void DelayMS(uint x>

{

uchar i。

while(x--> for(i=0。i<120。i++>。

}

//键盘扫描

uchar Keys_Scan(>

{

uchar sCode,kCode,i,k。

//低4位置0,放入4行

P1=0xf0。

//若高4位出现0,则有键按下

if((P1&0xf0>!=0xf0>

{

DelayMS(2>。

if((P1&0xf0>!=0xf0>

{

sCode=0xfe。 //行扫描码初值

for(k=0。k<4。k++> //对4行分别进行扫描

{

P1=sCode。

if((P1&0xf0>!=0xf0>

{

kCode=~P1。

for(i=0。i<16。i++> //查表得到按键序号并返回

if(kCode==KeyCodeTable[i]>

}

return(i>。

}

}

else

sCode=_crol_(sCode,1>。

}

return(-1>。

//主程序

void main(>

{

uchar i,P2_LED,P3_LED。

uchar KeyNo=-1。 //按键序号,-1表示无按键

while(1>

{

KeyNo=Keys_Scan(>。 //扫描键盘获取按键序号KeyNo

if(KeyNo!=-1>

{

P2_LED=0xff。

P3_LED=0xff。

for(i=0。i<=KeyNo。i++> //键值越大,点亮的LED越多

{

if(i<8>

P3_LED>>=1。

else

P2_LED>>=1。

}

P3=P3_LED。//点亮条形LED

P2=P2_LED。

}

}

}

17数码管显示4X4矩阵键盘按键号

/* 名称:数码管显示4X4矩阵键盘按键号

说明:按下任意键时,数码

管都会显示其键的序号,扫描程

序首先判断按键发生在哪一列,

然后根据所发生的行附加不同的

值,从而得到按键的序号。

*/

#include

#define uchar unsigned char

#define uint unsigned int

//段码

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,

0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00}。

sbit BEEP=P37。

//上次按键和当前按键的序号,该矩阵中序号范围0~15,16表示无按键

uchar Pre_KeyNo=16,KeyNo=16。

//延时

void DelayMS(uint x>

{

uchar i。

while(x--> for(i=0。i<120。i++>。

}

//矩阵键盘扫描

void Keys_Scan(>

{

uchar Tmp。

P1=0x0f。 //高4位置0,放入4行

DelayMS(1>。

Tmp=P10x0f。/*按键后0f变成0000XXXX,X中一个为0,3个仍为1,通过异或把3个1变为0,唯一的0变为1*/

switch(Tmp> //判断按键发生于0~3列的哪一列

{

case 1: KeyNo=0。break。

case 2: KeyNo=1。break。

case 4: KeyNo=2。break。

case 8: KeyNo=3。break。

default:KeyNo=16。 //无键按下

}

P1=0xf0。//低4位置0,放入4列

DelayMS(1>。

Tmp=P1>>40x0f。/*按键后f0变成XXXX0000,X中有1个为0,三个仍为1;

高4位转移到低4位并异或得到改变的值*/

switch(Tmp> //对0~3行分别附加起始值0,4,8,12

{

case 1: KeyNo+=0。break。

case 2: KeyNo+=4。break。

case 4: KeyNo+=8。break。

case 8: KeyNo+=12。

}

}

//蜂鸣器

void Beep(>

{

uchar i。

}

for(i=0。i<100。i++>

{

DelayMS(1>。

BEEP=~BEEP。

}

BEEP=0。

//主程序

void main(>

{

P0=0x00。

BEEP=0。

while(1>

{

P1=0xf0。

if(P1!=0xf0> Keys_Scan(>。//获取键序号

if(Pre_KeyNo!=KeyNo>

{

P0=~DSY_CODE[KeyNo]。

Beep(>。

Pre_KeyNo=KeyNo。

}

DelayMS(100>。

}

}

18开关控制LED

/* 名称:开关控制LED

说明:开关S1和S2分别控制LED1和LED2。*/ #include

sbit S1=P10。

sbit S2=P11。

sbit LED1=P00。

sbit LED2=P01。

//主程序

void main(>

{

while(1>

{

LED1=S1。

LED2=S2。

}

}

19继电器控制照明设备

/* 名称:继电器控制照明设备

说明:按下K1灯点亮,再次按下时灯熄灭*/

#include

#define uchar unsigned char

#define uint unsigned int

sbit K1=P10。

sbit RELAY=P24。

//延时

void DelayMS(uint ms>

{

uchar t。

while(ms-->for(t=0。t<120。t++>。

}

//主程序

void main(>

{

P1=0xff。

RELAY=1。

while(1>

{

if(K1==0>

{

while(K1==0>。

RELAY=~RELAY。

DelayMS(20>。

}

}

}

20数码管显示拨码开关编码

/*名称:数码管显示拨码开关编码

说明:系统显示拨码开关所设置的编码000~255*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

//各数字的数码管段码<共阴)

uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}。//显示缓冲

uchar DSY_Buffer[3]={0,0,0}。

//延时

void DelayMS(uint ms>

{

uchar t。

while(ms-->for(t=0。t<120。t++>。

}

//主程序

void main(>

{

uchar i,m,Num。

P0=0xff。

P2=0xff。

while(1>

{

m=0xfe。

Num=P1。 //读取拨码开关的值

DSY_Buffer[0]=Num/100。

DSY_Buffer[1]=Num/10%10。

DSY_Buffer[2]=Num%10。

for(i=0。i<3。i++> //刷新显示在数码管上

{

m=_crol_(m,1>。

P2=m。

P0=DSY_CODE[DSY_Buffer[i]]。

DelayMS(10>。

}

}

}

21开关控制报警器

/*名称:开关控制报警器

说明:用K1开关控制报警器,程序控制P1.0输出两种不同频率的声音,

模拟很逼真的报警效果*/

#include

#define uchar unsigned char

#define uint unsigned int

sbit SPK=P1^0。

sbit K1=P1^7。

//发声函数

void Alarm(uchar t>

{

uchar i,j。

for(i=0。i<200。i++>

{

SPK=~SPK。

for(j=0。j。 //由参数t行成不同的频率

}

}

void main(>

Proteus仿真单片机实例

引言 单片机体积小,重量轻,具有很强的灵活性而且价格便宜,具有逻辑判断,定时计数等多种功能,广泛应用于仪器仪表,家用电器,医用设备的智能化管理和过程控制等领域。以单片机为核心的嵌入式系统已经成为目前电子设计最活跃的领域之一。在嵌入式系统的中,开发板成本高,特别是对于大量的初学者而言,还可能由于设计的错误导致开发板损坏。利用Proteus我们可以很好地解决这个问题,由此我们可以快速地建立一个仿真系统。 2.Proteus介绍 Proteus是英国Labcenter Electro-nics公司开发的一款电路仿真软件,软件由两部分组成:一部分是智能原理图输入系统ISIS(Intelligent Schematic Input System)和虚拟系统模型VSM(Virtual Model System);另一部分是高级布线及编辑软件ARES(Adv-Ancd Routing And Editing Software)也就是PCB. 2.1 Proteus VSM的仿真 Proteus可以仿真模拟电路及数字电路,也可以仿真模拟数字混合电路。 Proteus可提供30多种元件库,超过8000种模拟、数字元器件。可以按照设计的要求选择不同生产厂家的元器件。此外,对于元器件库中没有的元件,设计者也可以通过软件自己创建。 除拥有丰富的元器件外,Proteus还提供了各种虚拟仪器,如常用的电流表,电压表,示波器,计数/定时/频率计,SPI调试器等虚拟终端。支持图形化的分析功能等。 Proteus特别适合对嵌入式系统进行软硬件协同设计与仿真,其最大的特点是可以仿真8051,PIA,A VR,ARM等多种系列的处理器。Protues包含强大的调试工具,具有对寄存器和存储器、断点和单步模式IAR C-SPY,Keil、MPLAB等开发工具的源程序进行调试的功能;能够观察代码在仿真硬件上的实时运行效果;对显示,按钮,键盘等外设的交互可视化进行仿真。 2.2 Proteus PCB Proteus 的PCB设计除了有自动布线仿真功能外,还集成了PCB设计,支持多达16个布线层,可以任意角度放置元件和焊接连线;集成了高智能的布线算法,可以方便地进行PCB设计。 3. 基于Protesus的简单数据采集系统。 3.1 软件的编写 本例题采用可调电阻调节电压值作为模拟信号的输入量,通过A/D转换芯片AD0808把模拟信号转换为数字量传送到单片机的P1口,并在P0口把转换的结果显示出来。 软件的编写可以在Keil C51 环境下进行,芯片的型号选择AT89C51,编写data.c文件,利用Keil C51进行编译,编译成功后生成data.hex文件。 3.2 绘制电路图 运行Proteus的ISIS,进入仿真软件的主界面,如图1所示。主界面分为菜单栏,工具栏,模型显示窗口,模型选择区,元件列表区等。

基于51单片机的乒乓游戏机设计附Proteus仿真_毕业设计

基于51单片机的乒乓游戏机设计附Proteus仿真 基于51单片机的乒乓游戏机设计附Proteus仿真 目录 1 绪论 (1) 1.1 本设计的研究背景和研究目的 (1) 1.2 国内外研究现状 (1) 1.3 本设计的任务和设计方法 (2) 1.3.1 设计任务 (2) 1.3.2 设计方法 (2) 2 乒乓游戏机设计方案 (3) 2.1 基于单片机的乒乓游戏机设计 (3) 2.1.1 硬件设计 (3) 2.1.2 软件设计 (4) 2.2 基于FPGA的乒乓游戏机设计 (4) 2.3 方案比较与选择 (5) 3硬件电路的设计 (6) 3.1 硬件核心电路选择 (6) 3.1.1 单片机STC89C51简介 (6) 3.1.2 单片机端口分配 (7) 3.2 电源电路的设计 (8) 3.3 时钟电路的设计 (9) 3.4 复位电路的设计 (10) 3.5 按键电路的设计 (10) 3.6 模拟球台电路的设计 (12) 3.6.1 译码器简介 (12) 3.6.2发光二极管简介 (14) 3.6.3 模拟球拍电路的设计 (15) 3.7 显示电路的设计 (15) 3.7.1 LCD1602简介 (15) 3.7.2 显示电路的设计 (16)

3.8 乒乓游戏机总电路的设计 (17) 4 乒乓游戏机的软件设计及编程 (18) 4.1 主程序的设计及功能实现 (19) 4.2 按键组的设计及功能实现 (20) 4.2.1 球拍模拟子程序 (20) 4.2.2 暂停/开始子程序 (20) 4.3 发球程序的设计及功能实现 (21) 4.4 线路程序的设计及功能实现 (21) 4.4.1 线路选择子程序 (21) 4.4.2 LED点阵子程序 (22) 4.5 回球程序的设计及功能实现 (22) 4.6 LCD显示程序设计及功能实现 (23) 4.7 设计源程序 (24) 5 系统调试及分析 (24) 5.1 仿真调试及分析 (24) 5.1.1 Proteus软件简介 (24) 5.1.2 Keil uVision4软件简介 (25) 5.1.3 仿真调试 (25) 5.1.4 仿真调试的结果分析 (28) 5.2 实物调试及分析 (28) 5.2.1 制作实物的过程 (28) 5.2.2 进行实物调试 (28) 5.2.3 实物调试的结果分析 (31) 6 结论与展望 (32) 谢辞(Acknowledge) (33) 参考文献 (34) 附录1:程序 (36) 附录2:元件清单 (51)

(整理)较为全面的基于PROTEUS仿真51单片机动态数码管课程设计(WORD版)

单片机课程设计 题目动态数码管显示 学院机电工程学院 专业班级电子信息工程12-1班 姓名 组员 指导教师张、王老师 2015 年 5 月30 日

课程设计量化评分标准

目录 一、概述 (1) 1. 单片机简介 (1) 2. Proteus简介 (2) 3. 设计任务与要求 (3) 二、硬件设计 (3) 1. 单片机最小系统设计 (1) 2. 数码管显示部分 (4) 3. 数码管驱动部分 (5) 三、软件设计 (6) 1. 仿真原理图 (6) 2. 仿真参数设置 (6) 3. 仿真结果 (7) 4. 程序流程图 (8) 5. 程序代码.................................................... .9 四、心得体会............................................... (11) 五、参考文献 (12)

精品文档 一、概述 1. 单片机简介 如图1.1和图1.2分别为PDI P封装的AT89C52引脚图和实物图 图1.1 引脚图图1.2 实物图 AT89C52是一个低电压,高性能CMOS8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。 AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。 AT89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。本课程设计中使用的是PDIP封装的AT89C52单片机。 2.Proteus简介 如图1.3为Proteus7.0的工作界面图

AVR proteus课程设计全套答案

A VR proteus课程设计题目具体要求 所有项目都有完整的代码和报告,有意者联系dyss@https://www.wendangku.net/doc/2a11188987.html, 一、总体要求: 每组学生根据分配的题目认真进行硬件和软件的仿真设计,其中基本要求属于必做项,发挥部分作为提高要求。 本次A VR软件设计主要为下学期A VR课程设计(使用A Tmega128开发板)作准备。二、分类要求: 1、函数信号发生器类 基本要求: 1 用存储器或算法得到信号源,将获得的信号源存储在程序存储器中。 2 将程序存储器中的信号源全部取出存放在A Tmega128的内部存储器中,并用 DA转换器输出一函数信号(正弦、方波、三角、锯齿等,频率1000Hz),可 以用示波器进行波形观察。 3 用数码管或LCD或虚拟终端显示输出参数。 4 用功能键切换各信号的输出。 发挥部分: 1通过键盘,可改变波形的频率。每按一次键,频率值前进进或后退1倍,频率范围不限。 2通过按键可以修改输出波形的幅度。 3数码管或LCD或虚拟终端显示的内容可以用频率值和周期值切换表示。 4同时用两种不同方式显示输出参数 动态显示格式: 自定 2、频率计类 基本要求: 1频率的测量范围为250hz-10khz。 2使用proteus模拟信号激励源直接产生待测方波信号,用一组数码管或LCD或虚拟终端显示该信号的频率、周期以及脉宽等参数,并用示波器或定时/计数器观察 输入信号。 3将待测信号接至A Tmega128定时/计数器的外部信号输入端,测量此方波信号的频率、周期和脉宽,在另一组数码管或LCD上或虚拟终端上将参数值显示出来。 4信号源的参数可任选LED 、LCD或虚拟终端显示,测量得到的参数按题目要求选择显示方式。 发挥部分: 1放宽频率测量范围,并根据频率的不同智能选择不同的测量方法,以提高测量精度。 2可选用定时器/计数器的输入捕捉功能,以提高周期测量精度。 动态显示格式: 自定

PROTEUS 课程设计

课程设计任务书 学生姓名:专业班级:电子1102班 指导教师:工作单位:信息工程学院 题目:方波发生电路 初始条件: 计算机、Proteus软件、Cadence软件 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写 等具体要求) 1、课程设计工作量:1.5周 2、技术要求: (1)学习Proteus软件和Cadence软件。 (2)设计一个方波发生电路。 (3)利用Cadence软件对该电路设计原理图并进行PCB制版,用Proteus软件对该电路进行仿真。 3、查阅至少5篇参考文献。按要求撰写设计报告书。全文用A4纸打印,图纸应符合绘图规范。 时间安排: 2015.1.12做课设具体实施安排和课设报告格式要求说明。 2015.1.12-1.15学习Proteus软件和Cadence软件,查阅相关资料,复习所设计内容的基本理论知识。 2015.1.16-1.20对方波发生电路进行设计仿真工作,完成课设报告的撰写。 2015.1.21提交课程设计报告,进行答辩。 指导教师签名:年月日 系主任(或责任教师)签名:年月日

目录 摘要.....................................................................................................I Abstract................................................................................................II 1绪论.. (1) 2方案论证 (2) 3利用Proteus软件进行电路设计及仿真 (5) 4利用Cadence软件进行电路设计及PCB绘制 (9) 4.1电路原理图设计 (9) 4.2PCB设计 (10) 5心得体会 (13) 参考文献 (14)

proteus闹钟课程设计

题目:闹钟的设计 学生姓名:黄书林 学生学号: 1114010110 系别:电气信息工程学院 专业:自动化 年级: 11 级 任课教师:张水锋 电气信息工程学院制 2013年10月

目录 摘要 (2) 课程任务与要求 (2) 方案论证 (2) 闹钟流程图 (3) 单元电路: (6) 单片机芯片 (6) 八位数码管显示电路 (7) 闹钟调节按键电路 (9) 晶振电路 (10) 复位电路 (10) 蜂鸣器体相电路 (11) 总图: (12) 心得体会 (13) 参考文献 (13) 附录 (13)

闹钟的设计 学生:黄书林 指导教师:张水锋 电气信息工程学院自动化 摘要 通过学习《基于Proteus的51系列单片机设计与仿真》让我知道我们不仅需要有过硬的理论知识,还应该有动手实践的能力。并且是将理论结合实际, 提升到应用层面。以后走上社会,还是会有很多新的知识是需要我们学习的,届时需要我们有比较强的自学能力。此次《基于Proteus的51系列单片机设计与仿真》课程设计。对理论结合实际的动手能力和自学能力有很强的体现。本次设计是基于 AT89C51 单片机的数字闹钟的设计。 关键词:数字闹钟 AT89C51 Proteus。 课程任务与要求 本次课程的任务就是要以51系列单片机为核心设计一个闹钟,它能通过单片机实现秒、分、小时的进位24 小时制,将当前时分秒在七段 LED 显示器上显示。可设置闹钟的时间当前值对准一时间,设置闹铃时间,闹铃功能的关闭和开放。 要求:通过Proteus软件来实现设计的仿真,提高自己的编程水平,增加设计兴趣。通过做自己喜欢的设计,提高自学能力。为以后毕业走上工作岗位打下坚实的基础。 二方案论证 经分析,计算器电路包括三个部分:显示部分八位数码管、闹钟时钟按键、 单片机电路。具体分析如下: 1 显示部分 1.1 LCD显示 LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,价格大概15块钱左右。 1.2数码管显示 数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七

51单片机+proteus仿真PWM

#include unsigned char flag; unsigned int x; unsigned int y; #define time 800 void main() { EA=1; //开总中断 ET0=1; //定时器T0中断允许 TMOD=0x02; //使用定时器T0的模式2 TH0=0; //定时器T0的高8位赋初值 TL0=0; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 x=time; y=0; while(1)//无限循环等待中断 ; } /************************************************************** 函数功能:定时器T0的中断服务程序 **************************************************************/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数 //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{ if(flag==0) { TH0=256-y; //定时器T0的高8位重新赋初值 TL0=256-y; //定时器T0的高8位重新赋初

P1=1; if((--x)==0) { flag=1; x=time; if((--y)==0) { y=100; } } } if(flag==1) { TH0=y; //定时器T0的高8位重新赋初值 TL0=y; //定时器T0的高8位重新赋初 P1=0; if((--x)==0) { flag=0; x=time; if((--y)==0) { y=100; } } } }

基于proteus的数字电子钟的仿真设计

题目:基于Proteus的数字电子钟的设计 与仿真 课程名称:单片机系统设计与Proteus仿真 学生姓名:马珂 学生学号: 1305010323 系别:电子工程学院 专业:通信工程 年级: 13级 任课教师:徐锋 电子工程学院 2015年5月

目录 一、设计目的与要求 (3) 二、设计内容与方案制定 (3) 三、设计步骤 (3) 1.硬件电路设计 (3) 1.1.硬件电路组成框图 (3) 1.2.各单元电路及工作原理 (4) 1.3.绘制原理图 (5) 1.4.元件清单列表 (6) 2.程序设计 (6) 2.1程序流程 (6) 2.2汇编程序 (7) 四、调试与仿真 (12) 五、心得体会 (14) 六、参考文献: (14)

基于Proteus的数字电子钟的设计与仿真 一、设计目的与要求 设计目的:通过课程设计,培养学生运用已学知识解决实际问题的能力、查阅资料的能力、自学能力和独立分析问题、解决问题的能力和能通过独立思考。 设计要求:设计一个时、分可调的数字电子钟、开机显示“9-58-00”。 二、设计内容与方案制定 具有校时功能,按键控制电路其中时键、分键两个键分别控制时、分时间的调整。按分键分加1;按时键时加1。 以AT89C51单片机进行实现秒、分、时上的正常显示和进位,其中显示功能由单片机控制共阴极数码管来实现,数码管进行动态显示。 三、设计步骤 1、硬件电路设计 1.1.硬件电路组成框图 1.2.各单元电路及工作原理 (1)晶振电路 单片机的时钟产生方法有两种:内部时钟方式和外部时钟方式。本系统中

AT89C51单片机采用内部时钟方式。采用外接晶体和电容组成的并联谐振回路。其电路图如下: (2)键盘控制电路 键盘可实现对时间的校对,用两个按键来实现。按时键来调节小时的时间,按分键来调节分针的时间。其电路连接图如下: (3)显示电路 LED显示器是现在最常用的显示器之一发光二极管(LED)分段式显示器由7条线段围成8字型,每一段包含一个发光二极管。外加正向电压时二极管导通,发出清晰的光。只要按规律控制各发光段亮、灭,就可以显示各种字形或符号。显示电路显示模块需要实时显示当前的时间,即时、分、秒,因此需要6个数码管,采用动态显示方式显示时间,其硬件连接方式如下图所示。

基于8086与Proteus仿真的44键盘计算器的设计

基于8086与Proteus仿真的4*4键盘计算器的设计 一、设计目的 本次课程设计的实验目的是通过该实验掌握较复杂程序的设计。能够独立完成用程序对8086、8255控制键盘和LED显示的控制,完成计算器加减法的应用。独立编写程序,明白和掌握程序的原理和实现方式。为以后的设计提供经验。学习和掌握计算机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。 二、设计内容 设计计算器,要求至少能完成多位数的加减乘除运算。独立完成用程序对8086、8255控制键盘和LED显示的控制,完成计算器加减乘除的应用。 三、设计原理与硬件电路 设计的思路是:首先利用程序不断扫描键盘是不是有输入,如果没有就一直扫描,如果有就停止扫描,完成输入,利用汇编的程序核对输入键的数值,通过调用子程序完成数据的储存或者是加减的运算。运算完成后将运算的结果储存并显示到LED显示器上。 各部分硬件功能:

可编程并行通信接口芯片8255A 8255A内部结构:1. 并行输入/输出端口A,B,C 8255A内部包括三个8位的输入输出端口,分别是端口A、端口B、端口C,相应信号线是PA7~PA0、PB7~PB0、PC7~PC0。端口都是8位,都可以作为输入或输出。通常将端口A和端口B定义为输入/输出的数据端口,而端口C则既可以作数据端口,又可以作为端口A和端口B的状态和控制信息的传送端口。 2.A组和B组控制部件 端口A和端口C的高4位(PC7~PC4)构成A组;由A组控制部件实现控制功能。端口B和端口C的低4位(PC3~PC0)构成B组;由B组控制部件实现控制功能。 A组和B组利用各自的控制单元来接收读写控制部件的命令和CPU通过数据总线(D0~D7)送来的控制字,并根据他们来定义各个端口的操作方式。 3. 数据总线缓冲存储器 三态双向8位缓冲器,是8255A与8086CPU之间的数据接口。

Proteus软件的单片机仿真(ATM)

摘要 基于Proteus软件的单片机自动取款机(ATM)仿真系统设计,硬件电路需要单片机开发板和12864液晶显示器,能够实现自动取款的全部功能。通过在在计算机上用C语言编程来将生成文件下载到单片机控制其它外围器件工作。但是在EDA新技术的引入使得系统的开发成本降低而且灵活性增强,在Proteus软件中都可以找到上述硬件元件,通过电路图连接完全可以实现仿真功能。在Keil软件环境下通过C语言编程,编译调试后生成单片机下载的HEX(十六进制)文件,硬件电路图是在Proteus 软件中进行建模。通过Proteus和Keil结合建立的虚拟系统实现联合仿真,单片机实时控制12864LCD实现汉字的显示,扫描键盘从而达到用户与ATM的信息交换,使得ATM系统设计变为现实。 ATM系统,是一个有数据库组成的应用系统。用户的初始信息通过E2PROM存放,这样免去了掉电丢失数据的弊端。系统功能有用户在ATM上提取现金、查询账户余额、修改密码、账户冻结、密码保护、自动存款及转账功能。可以仿真实现最基本的银行服务。 关键词:ATM;51单片机;Proteus;Keil;12864LCD;E2PROM;虚拟仿真

Abstract Automatic Teller Machine system is based on Proteus 51-microcontroller.Hardware circuit includes microcontroller developer board and 12864LCD display. All features of ATM can be well worked on it. Programming on PC then download created file to 51-microcontroller to control outer circuit. However, with the introduction of EDA, new technology, which lower the cost of system exploration and enhance flexibility. Programing with C language, compiling and debugging under the environment of Keil software,creating a HEX file which will be downloaded by microcontroller later. Hardware schematic diagrams are established with Proteus software. According to the combination of Proteus and Keil , making a virtual system , successfully achieve united simulation. Microcontroller controls 12864LCD to display Chinese words, scans keyboard to exchange information between customer and ATM, which makes virtual ATM system becoming reality. ATM system includes databases, which are used for the storage of customers’ initial information, leading to emerge from the disadvantage of data lost when power cuts. The functions of ATM are as follows: withdraw cash, search client and remaining modify password, client freezed, password protection, automatic deposit and transfer client. This system simulates to realize the bank’s fundamental services. Keywords:ATM;51microcontroller;Proteus;Keil;12864LCD;E2PROM;virtual simulation

51单片机行列式键盘的应用proteus仿真+源程序

51单片机行列式键盘的应用proteus仿真本人喜好单片机设计,精通单片机编程和硬件电路设计,在空余之际编一些小程序与大家分享,有哪位路过,请多多指教,希望大家在一起能互相学习,互相进步。这里的程序已经测试通过。发表出来,一来可以帮助同样爱好单片机的朋友们,二来,希望能结交一些同道中人,共同学习。 源程序: #include #include void delayms(unsigned char ms); unsigned char data dis_digit; unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xff}; unsigned char data dis_index; void main() { P2=0xff; P1=0x00; dis_index=0; dis_digit=0x01; while(1) { P2=dis_code[dis_index]; P1=dis_digit; delayms(1); P1=0x00; dis_digit=_crol_(dis_digit,1); dis_index++; dis_index &=0x07; } } void delayms(unsigned char ms) { unsigned char i; while (ms--) {

for(i=0;i<120;i++); } } 仿真图:

如果您想做项目开发,或者是做课题,或者您只是有一个想法,亲联系我们,我们会尽最大努力帮您完成,您的需要就是我们奋斗的方向! 本人有给学生做课程设计的经验,欢迎亲们来本店咨询哦 淘宝店铺地址:https://www.wendangku.net/doc/2a11188987.html, ; https://www.wendangku.net/doc/2a11188987.html, QQ:1203026348;496617571 邮箱:1203026348@https://www.wendangku.net/doc/2a11188987.html, ;496617571@https://www.wendangku.net/doc/2a11188987.html, 电话:小陈:152******** 小张:158******** 阿里旺旺:tb3569_1968 ;zwjyln 我们拥有40G!!超大容量!!!是单片机入门者的首选经典资料!!! 您在单片机方面有任何问题,请及时和我们联系,我们会竭诚为您服务!! 承接单片机项目开发,同时包括软件开发和硬件开发。我们是一组拥有扎实的单片机基础知识的大学生,我们可以给您提供从项目开始到项目的完成整个过程的技术支持,其中包括原理图的设计、电路图的proteus软件仿真、程序的编写以及相关软件的使用等

proteus课程设计

沈阳航空航天大学电子信息工程学院 电子设计应用软件训练 总结报告 学生姓名: 专业: 班级: 学号: 指导教师: 训练时间:2013年7月8日至2013年7月12日 电子信息工程学院电子设计应用软件训练任务 【训练任务】:

1、熟练掌握PROTEUS软件的使用; 2、按照设计要求绘制电路原理图; 3、能够按要求对所设计的电路进行仿真; 【基本要求及说明】: 1、按照设计要求自行定义电路图纸尺寸; 2、设计任务如下: 51单片机内部定时计数器T0,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数,将其数值P1口驱动LED灯上显示出来,由按键产生计数脉冲,LED 分别显示脉冲个数(10个以内)。 3、按照设计任务在Proteus 6 Professional中绘制电路原理图; 4、根据设计任务的要求编写程序,在Proteus下进行仿真,实现相应功能。 成绩: 一、任务说明 51单片机内部定时计数器T0,按计数器模式和方式1工作,对P3.4(T0)引脚

进行计数,将其数值P1口驱动LED灯上显示出来,由按键产生计数脉冲,LED分别显示脉冲个数(10个以内)。按照设计任务在Proteus 6 Professional中绘制电路原理图。 根据设计任务的要求编写程序,在Proteus下进行仿真,实现相应功能。 二、PROTEUS软件的使用 1、软件概述: Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:①实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。②支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。④具有强大的原理图绘制功能。总之,该软件是一款集单机和SPICE分析于一身的仿真软件,功能极其强大。 图1 proteus工作界面 2、对象的添加和放置 点击工具箱的元器件按钮,使其选中,再点击IsIs对象选择器左边中间的置P 按钮,出现“Pick Devices”对话框。在这个对话框里我们可以选择元器件和一些

单片机温度传感器proteus仿真

仿真程序仿真: LED_0 EQU 30H LED_1 EQU 31H LED_2 EQU 32H ADC EQU 35H TCNTA EQU 36H TCNTB EQU 37H H_TEMP EQU 38H L_TEMP EQU 39H FLAG BIT 00H H_ALM BIT P3.0 L_ALM BIT P3.1 SOUND BIT P3.7 CLOCK BIT P2.4 ST BIT P2.5 EOC BIT P2.6 OE BIT P2.7 ORG 00H SJMP START ORG 0BH LJMP INT_T0 ORG 1BH LJMP INT_T1 START:MOV LED_0,#00H

MOV LED_1,#00H MOV LED_2,#00H MOV DPTR,#TABLE MOV H_TEMP,#153 MOV L_TEMP,#77 MOV TMOD,#12H MOV TH0,#245 MOV TL0,#0 MOV TH1,#(65536-1000)/256 MOV TL1,#(65536-1000)/256 MOV IE,#8AH CLR C SETB TR0 WAIT:SETB H_ALM SETB L_ALM CLR ST SETB ST CLR ST JNB EOC,$ SETB OE MOV ADC,P1 CLR OE MOV A,ADC SUBB A,L_TEMP JC LALM MOV A,H_TEMP MOV R0,ADC SUBB A,R0 JC HALM CLR TR1 LJMP PROC1 LALM:CLR L_ALM SETB TR1 CLR FLAG LJMP PROC1 HALM:CLR H_ALM SETB TR1 SETB FLAG LJMP PROC1 PROC1:MOV A,ADC MOV B,#100 DIV AB MOV LED_2,A MOV A,B

基于51单片机的计算器(附Proteus仿真图且程序有详细注释)

#include #define uint unsigned int #define uchar unsigned char #define lint unsigned long int uchar SMG[10]={0x3f,0x06,0x5b,0x4f, //数码管取模 0x66,0x6d,0x7d,0x07, 0x7f,0x6f }; uchar DA TA1[8]={0,0,0,0,0,0,0,0}; //第一个数 uchar DA TA2[8]={0,0,0,0,0,0,0,0}; //第二个数 uchar RESUIT[8]={0,0,0,0,0,0,0,0}; //结果 uchar px1=0,px2=0,px3=0,flag=0,flag1=0,flag2=0,flag3=0,f1=0,f2=0,f3=0,f4=0; //各全局变量uchar temp,key; lint x1=0,x2=0,y=0; //输入的数及其结果 void Init(); //系统初始化 void keyscan(); //键盘检测 void delay(uint); //延时 void DataOper(); //数据运算 void DataHandle(); //数据接收 void DisplayHandle(); //显示处理 void display(uchar,uchar); //数码管显示函数 void main() { P2=0x00; while(1) { keyscan(); DataHandle(); DisplayHandle(); } } void Init() //初始化,所有数据归零 { uchar i; px1=0;px2=0;px3=0; flag=0;flag1=0;flag2=0;flag3=0; f1=0;f2=0;f3=0;f4=0; x1=0;x2=0;y=0; for(i=0;i<8;i++) {DA TA1[i]=0;DATA2[i]=0;RESUIT[i]=0;} } void delay(msx) //msx为延时毫秒数 { uint i,j;

Proteus花样流水灯课程设计

Proteus花样流水灯课程设计

课程论文 题目:基于51单片机LED流水灯设计 课程名称: 学生姓名: 学生学号: 系别: 专业: 年级: 任课教师: 电气信息工程学院制 1月 基于51单片机的LED流水灯设计

1 单片机AT89C51芯片简介 MCS-51兼容4K字节,可编程闪烁存储器,寿命:1000写/擦循环,数据保留时间:。全静态工作:0Hz—24Hz,三级程序存储器锁定。128*8位内部RAM,32可编程I/O线,两个16位定时器/计数器,5个中断源可编程串行通道,低功耗的闲置和掉电模式,片内震荡器和时钟电路。 图1 AT89C51芯片

1.1电源引脚 Vcc(40脚):典型值+5V。 Vss(20脚):接低电平。 1.2外部晶振 XTAL1、XTAL2分别与晶振两端相连接。 1.3输入输出口引脚 P0口:I/O双向口。作输入口时,应先软件置“1”. P0口:是一个8位漏极开路输出型双向I/O端口。作为输出端口时,每位能以吸收电流的方式驱动8 个TTL输入,对端口写1时,又可作高阻抗输入端用。在访问外部程序或数据存储器时,它是时分多路转换的地址(低8位)/数据总线,在访问期间将激活内部的上拉电阻。 1.4控制引脚 RST、ALE/-PROG、-PSEN、-EA/Vpp组成了MSC-51的控制总线。 RST (9脚):复位信号输入端(高电平有效)。ALE/-PROG(30脚):地址锁存信号输出端.第一功能:编程脉冲输入。-PSEN(29脚):外部程序存储器读选通信号。-EA/Vpp(31脚):外部程序存储器使能端。第二功能:编程电压输入端(+21V)。 2硬件电路 2.1晶振电路 单片机晶振的作用是为系统提供基本的时钟信号。一般一个系统共用一个晶振,便于各部分保持同步。有些通讯系统的基频和射频使

基于proteus和keil的单片机课程设计

2008年10fl 第5期(总第70期) 济南职业学院学报 JournalnfJinanVocationalCoRege Om.2008 No.5(SerialⅣ仉70) 基于Proteus和Keilfl匀单片机课程设计 宫亚梅 (常州信息职业技术学院机电工程系,江苏常州213164) 摘要:本文介.绍TProteus和Keil的功能特点,结合步进电机正反转实例,详细给出了两种软件在单片机课程设计中的具体应用。 关键词:Proteus;Keil;单片机;设计 中图分类号:TP391文献标识码:A文章编号:1673—4270(2008J05—0112—02 单片机应用技术是电类专业的一门重要课程,也是理论和实践结合性很强的一门课程,所以课程设计环节尤为萤要。课程设计环节的任务和目的是让每个学生亲自参与到其中的设计细节,提高单片机开发的能力。考虑到目前实验器材允设计过程中容易造成器件和仪器仪表的损坏,以及离开实验室学生得不到充分的锻炼,从而借助于Proteus和Keil进行课程设讯实践证明,这样可以很好地解决上述问题,节省设计成本,提高设计速度。 1Proteus和Keil简介 1.1Proteus简介 Proteus是一个完整的嵌入式系统软、硬件设计仿真平台,它包括原理图输入系统ISIS、带扩展的Prospice混合模型仿真器、动态器件库、高级图形分析模块和处理器虚拟系统仿真模型VSM。ISIS是Proteus系统的中心,具有超强的控制原理图设计环境。ProteusVSM最重要的特点是,它能把微处理器软件作用在处理器上,并和该处理器的任何模拟和数字器件协同仿真。仿真执行目标码就像在真正的单片机系统上运行,VSMCPU模型能完整仿真I/Ol=i、中断、定时器、通用外设口和其他与CPU有关的外设,甚至能仿真多个处理器。 1.2Keil简介 Keil是一个功能强大的开发平台,它包括项目管理器、CX51编译器、AX51宏汇编器、BL51/Lx51连接定位器、RTX51实时操作系统、Simulator软件模拟器以及Monitor51硬件目标调试器。它是一种集成化的文件管理编译环境,主要的功能特点为:编译C源程序、汇编源程序或混合语言源程序,链接和定位目标文件和库,创建HEX文件、调试目标程序等,是目前最好的5l单片机开发工具之一。Keil支持软件模拟仿真(Simulator)和用户目标板调试(Monitor51)两种工作模式,前者不需要任何单片机硬件即可完成用户程序仿真调试,后者利用硬件目标板中的监控程序可以直接调试目标硬件系统。 2应用举例 下面结合课程设计中四项八拍步进电机正反转电路的单片机实现,具体说明如何基于Proteus和Keil进行单片机仿真。电路的功能是,通过点击正反转按钮,让步进电机自如进行正反转的切换。 2.1硬件的实现 打开ProteusISIS编辑环境,通过对象选择按 收稿日期:2008—09一08 作者简介:宫亚梅(1979一),女,江苏姜堰人。常州信息职业技术学院机电工程系助教。 ?112? 万方数据

基于Proteus的单片机串口通信仿真

— Proteus 班级:电信13-2 姓名:段学亮 邓成智 崔俊杰 邓石磊 陈亮 高金玉 成绩: 电子与信息工程学院 信息与通信工程系

1.设计要求 1.1甲单片机向乙单片机机发送控制命令字符,甲单片机同时接收乙单片机机发送的数字,并显示在数码管上。 1.2乙机程序接收甲机发送字符并完成相应动作乙机接收到甲机发送的信号后,根据相应信号控制LED完成不同闪烁动作。 2. 仿真电路图 串口通信仿真电路图如图一 图1:串口通信仿真电路图 3.串口通信C51程序 /* 名称:甲机串口程序 说明:甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管上。 */

#include #define uchar unsigned char #define uint unsigned int sbit LED1=P1^0; sbit LED2=P1^3; sbit K1=P1^7; uchar Operation_No=0; //操作代码 //数码管代码 uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //延时 void DelayMS(uint ms) { uchar i; while(ms--) for(i=0;i<120;i++); } //向串口发送字符 void Putc_to_SerialPort(uchar c) { SBUF=c; while(TI==0); TI=0; } //主程序 void main() { LED1=LED2=1; P0=0x00; SCON=0x50; //串口模式1,允许接收 TMOD=0x20; //T1工作模式2 PCON=0x00; //波特率不倍增 TH1=0xfd; TL1=0xfd; TI=RI=0; TR1=1; IE=0x90; //允许串口中断 while(1) { DelayMS(100); if(K1==0) //按下K1时选择操作代码0,1,2,3 { while(K1==0); Operation_No=(Operation_No+1)%4; switch(Operation_No) //根据操作代码发送A/B/C或停止发送

基于proteus的51单片机仿真

基于proteus的51单片机仿真实例七十八、使用BCD译码器实现8位数码管显示应用实例 标签: proteus译码器单片机BCD数码管2010-02-24 16:57 1、在此前有关数码管显示的例子中,单片机必须要发送段码才能够让数码管显示正确的数字。 本例使用7段数码管显示译码器4511,单片机可以直接输出BCD码,4511能够自动将BCD 码转换为数码管的段码。 2、在keil c51中新建工程ex66,编写如下程序代码,编译并生成ex66.hex文件 //使用BCD码译码器控制数码管显示 #include //位码表 unsigned char code bit_buff[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //需要显示的数字 unsigned char code bcd_buff[] = {2,0,1,0,10,2,10,9}; //延时函数 void delayms(unsigned int x) { unsigned char i; while(x--) { for(i = 0;i < 120;i++); } } void main(void) { unsigned char i; while(1) { for(i = 0;i < 8;i++) //显示8位 { P2 = bit_buff[i]; // 位码 P1 = bcd_buff[i]; //需要显示的数字,这里的数字不再是段码,而是BCD码 3、在proteus中新建仿真文件ex66.dsn,电路原理图如下所示

4、将ex66.hex文件载入at89c51中,启动仿真,按动拨码开关,观察运行结果。下图是某一时刻程序运行结果

相关文档
相关文档 最新文档