//注意,如您使用的MCU没有那那么大的扩展SRAM,就不要 *** 作超过范围的SRAM
#include<reg51.h>
#include<则神中intrins.h>瞎则
sfr S2CON= 0x9A
//孙山S2SM0,S2SM1,S2SM2,S2REN,S2TB8,SRB8,S2TI,S2RI
sfr IE2= 0xAF
//X,X,X,X,X,X,ESPI,ES2
sfr S2BUF= 0x9B
sfr AUXR= 0x8e
sfr BRT = 0x9c
sfr IAP_CONTR = 0xC7
sfr CCON= 0xD8
sfr CMOD= 0xD9
sfr CL = 0xE9
sfr CH = 0xF9
sfr CCAP0L = 0xEA
sfr CCAP0H = 0xFA
sfr CCAPM0 = 0xDA
sfr CCAPM1 = 0xDB
sbit CR = 0xDE
sbit MCU_Start_Led = P1^7
sbit S2_Interrupt_Receive_Led = P1^4
//unsigned char self_command_array[4] = {0x22,0x33,0x44,0x55}
#define Self_Define_ISP_Download_Command 0x22
#define RELOAD_COUNT 0xfb //18.432MHz,12T,SMOD=0,9600bps
void serial_port_one_initial()
void send_UART_one(unsigned char)
void UART_one_Interrupt_Receive(void)
void serial_port_two_initial()
void send_UART_two(unsigned char)
void UART_two_Interrupt_Receive(void)
void soft_reset_to_ISP_Monitor(void)
void delay(void)
void display_MCU_Start_Led(void)
void send_PWM(void)
void main(void)
{
unsigned int array_point = 0
unsigned char xdata Test_array_one[512]=
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
0xef, 0xee, 0xed, 0xec, 0xeb, 0xea, 0xe9, 0xe8,
0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xe0,
0xdf, 0xde, 0xdd, 0xdc, 0xdb, 0xda, 0xd9, 0xd8,
0xd7, 0xd6, 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xd0,
0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xc9, 0xc8,
0xc7, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, 0xc1, 0xc0,
0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0,
0xaf, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9, 0xa8,
0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, 0xa0,
0x9f, 0x9e, 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98,
0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90,
0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88,
0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80,
0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78,
0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70,
0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x68,
0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60,
0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a, 0x59, 0x58,
0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50,
0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48,
0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40,
0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38,
0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30,
0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28,
0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20,
0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18,
0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08,
0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00
}
unsigned char i = 0
serial_port_one_initial() //串口1初始化
//serial_port_two_initial() //串口2初始化
display_MCU_Start_Led() //点亮发光二极管表示单片机开始工作
// send_UART_two(0x55) //串口2发送数据表示单片机串口正常工作
// send_UART_two(0xaa) //串口2发送数据表示单片机串口正常工作
/*
for(array_point=0array_point<512array_point++)
{
send_UART_two(Test_array_one[array_point])
}
*/
send_UART_one(0x34) //串口1发送数据表示单片机串口正常工作
send_UART_one(0xa7) //串口1发送数据表示单片机串口正常工作
for(array_point=0array_point<512array_point++)
{
send_UART_one(Test_array_one[array_point])
}
//send_PWM()//6kHz PWM, 50% duty
while(1)
}
void serial_port_one_initial()
{
SCON= 0x50 //0101,0000 8位可变波特率,无奇偶校验位
// TMOD= 0x21 //0011,0001 设置顶时器1为8位自动重装计数器
//TH1 = RELOAD_COUNT //设置定时器1自动重装数
//TL1 = RELOAD_COUNT
//TR1 = 1 //开定时器1
BRT = RELOAD_COUNT
// BRTR = 1, S1BRS = 1, EXTRAM = 1 ENABLE EXTRAM
AUXR = 0x11// T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRS
ES = 1 //允许串口中断
EA = 1 //开总中断
}
void serial_port_two_initial()
{
//sfr SCON= 0x98
//SM0,SM1,SM2,REN,TB8,RB8,TI,RI
//sfr S2CON= 0x9A
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI
//sfr S2BUF= 0x9B
//sfr IE2= 0xAF
//X,X,X,X,X,X,ESPI,ES2
S2CON= 0x50 //0101,0000 8位可变波特率,无奇偶校验位,允许接收
BRT = RELOAD_COUNT
// BRTR = 1, S1BRS = 1, EXTRAM = 0 ENABLE EXTRAM
AUXR = 0x11// T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRS
//ES = 1 //允许串口1中断
// ES2 = 1
IE2 = 0x01//允许串口2中断,ES2=1
EA = 1 //开总中断
}
void send_UART_one(unsigned char i)
{
ES = 0 //关串口中断
TI = 0 //清零串口发送完成中断请求标志
SBUF = i
while(TI ==0)//等待发送完成
TI = 0 //清零串口发送完成中断请求标志
ES = 1 //允许串口中断
}
void send_UART_two(unsigned char i)
{
//sfr SCON= 0x98
//SM0,SM1,SM2,REN,TB8,RB8,TI,RI
//sfr S2CON= 0x9A
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI
//sfr S2BUF= 0x9B
//sfr IE2= 0xAF
//X,X,X,X,X,X,ESPI,ES2
unsigned char temp = 0
//ES = 0 //关串口1中断
IE2 = 0x00//关串口2中断,es2=0
//TI = 0 //清零串口1发送完成中断请求标志
S2CON = S2CON &0xFD//B'11111101,清零串口2发送完成中断请求标志
//SBUF = i
S2BUF = i
//while(TI ==0)//等待发送完成
do
{
temp = S2CON
temp = temp &0x02
}while(temp==0)
// TI = 0 //清零串口发送完成中断请求标志
S2CON = S2CON &0xFD//B'11111101,清零串口2发送完成中断请求标志
//ES = 1 //允许串口1中断
// ES2 = 1
IE2 = 0x01//允许串口2中断,ES2=1
}
void UART_one_Interrupt_Receive(void) interrupt 4
{
unsigned char k = 0
if(RI==1)
{
RI = 0
k = SBUF
if(k==Self_Define_ISP_Download_Command) //是自定义下载命令
{
delay() //延时1秒就足够了
delay() //延时1秒就足够了
soft_reset_to_ISP_Monitor() //软复位到系统ISP监控区
}
send_UART_one(k+1)
}
else
{
TI = 0
}
}
void UART_two_Interrupt_Receive(void) interrupt 8
{
//sfr SCON= 0x98
//SM0,SM1,SM2,REN,TB8,RB8,TI,RI
//sfr S2CON= 0x9A
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI
//sfr S2BUF= 0x9B
//sfr IE2= 0xAF
//X,X,X,X,X,X,ESPI,ES2
unsigned char k = 0
k = S2CON
k = k &0x01
//if(S2RI==1)
if(k==1)
{
//RI = 0
S2CON = S2CON &0xFE//1111,1110
S2_Interrupt_Receive_Led = 0
k = S2BUF
if(k==Self_Define_ISP_Download_Command) //是自定义下载命令
{
delay() //延时1秒就足够了
delay() //延时1秒就足够了
soft_reset_to_ISP_Monitor() //软复位到系统ISP监控区
}
send_UART_two(k+1)
}
else
{
//TI = 0
S2CON = S2CON &0xFD//1111,1101
}
}
void soft_reset_to_ISP_Monitor(void)
{
IAP_CONTR =0x60 //0110,0000 软复位到系统ISP监控区
}
void delay(void)
{
unsigned int j = 0
unsigned int g = 0
for(j=0j<5j++)
{
for(g=0g<60000g++)
{
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
}
}
}
void display_MCU_Start_Led(void)
{
//sbit MCU_Start_Led = P1^7
unsigned char i = 0
for(i=0i<1i++)
{
MCU_Start_Led = 0 //顶亮MCU开始工作指示灯
delay()
MCU_Start_Led = 1 //熄灭MCU开始工作指示灯
delay()
MCU_Start_Led = 0 //顶亮MCU开始工作指示灯
}
}
void send_PWM(void)
{
CMOD= 0x00 // CIDL - - - - CPS1 CPS0 ECF Setup PCA Timer
// CPS1 CPS0 = 00, Fosc/12 is PCA/PWM clock
// 18432000/12/256 = 6000
CL = 0x00
CH = 0x00
CCAP0L = 0x80 //Set the initial value same as CCAP0H
CCAP0H = 0x80 //50% Duty Cycle
CCAPM0 = 0x42 //0100,0010 Setup PCA module 0 in 8BIT PWM, P3.7
CR = 1 //启动 PCA/PWM 定时器
}
《基于8051+Proteus仿真》案例
第01 篇基础程序设计
01 闪烁的LED
/* 名称:闪烁的LED
说明:LED按设定的时间间隔闪烁
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED=P1^0
//延孝友时
void DelayMS(uint x)
{
uchari
while(x--)
{
for(i=0i<120i++)
}
}
//主程序
void main()
{
while(1)
{
LED=~LED
DelayMS(150)
}
}
02 从左到右的流水灯
/* 名称:从左到右的流水灯
说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//延时
void DelayMS(uint x)
{
uchari
while(x--)
{
for(i=0i<120i++)
}
}
//主程序
void main()
{
P0=0xfe
while(1)
{
P0=_crol_(P0,1)//P0的值向左循环移动
DelayMS(150)
}
}
03 8只LED左右来回点亮
/* 名称:8只LED左右来回点亮
说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//延时
void DelayMS(uint x)
{
uchari
while(x--)
{
for(i=0i<薯帆120i++)
}
}
//主程序
void main()
{
uchari
P2=0x01
while(1)
{
for(i=0i<7i++)
{
P2=_crol_(P2,1)//P2的值向左循环移动
DelayMS(150)
}
for(i=0i<7i++)
{
P2=_cror_(P2,1)//P2的值向右循环移动
DelayMS(150)
}
}
}
04 花样流水灯
/* 名称:巧手槐花样流水灯
说明:16只LED分两组按预设的多种花样变换显示
*/
#include<reg51.h>
#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)
{
uchari
while(x--)
{
for(i=0i<120i++)
}
}
//主程序
void main()
{
uchari
while(1)
{ //从数组中读取数据送至P0和P2口显示
for(i=0i<136i++)
{
P0=Pattern_P0[i]
P2=Pattern_P2[i]
DelayMS(100)
}
}
}
05 LED模拟交通灯
/* 名称:LED模拟交通灯
说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮, 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RED_A=P0^0 //东西向灯
sbit YELLOW_A=P0^1
sbit GREEN_A=P0^2
sbit RED_B=P0^3 //南北向灯
sbit YELLOW_B=P0^4
sbit GREEN_B=P0^5
uchar Flash_Count=0,Operation_Type=1//闪烁次数, *** 作类型变量
//延时
void DelayMS(uint x)
{
uchari
while(x--)for(i=0i<120i++)
}
//交通灯切换
void Traffic_Light()
{
switch(Operation_Type)
{
case1: //东西向绿灯与南北向红灯亮
RED_A=1YELLOW_A=1GREEN_A=0
RED_B=0YELLOW_B=1GREEN_B=1
DelayMS(2000)
Operation_Type=2
break
case2: //东西向黄灯闪烁,绿灯关闭
DelayMS(300)
YELLOW_A=~YELLOW_AGREEN_A=1
if(++Flash_Count!=10)return//闪烁5次
Flash_Count=0
Operation_Type=3
break
case3: //东西向红灯,南北向绿灯亮
RED_A=0YELLOW_A=1GREEN_A=1
RED_B=1YELLOW_B=1GREEN_B=0
DelayMS(2000)
Operation_Type=4
break
case4: //南北向黄灯闪烁5次
DelayMS(300)
YELLOW_B=~YELLOW_BGREEN_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<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}
//延时
void DelayMS(uint x)
{
uchart
while(x--)for(t=0t<120t++)
}
//主程序
void main()
{
uchari=0
P0=0x00
while(1)
{/* for(i<11i++){ P0=~DSY_CODE[i]DelayMS(300)} //注:另一方案 */
P0=~DSY_CODE[i]
i=(i+1)%10
DelayMS(300)
}
}
07 8只数码管滚动显示单个数字
/* 名称:8只数码管滚动显示单个数字
说明:数码管从左到右依次滚动显示0~7,程序通过每次仅循环选通一只数码管
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}
//延时
void DelayMS(uint x)
{
uchart
while(x--)for(t=0t<120t++)
}
//主程序
void main()
{
uchari,wei=0x80
while(1)
{
for(i=0i<8i++)
{
P2=0xff //关闭显示
wei=_crol_(wei,1)
P0=DSY_CODE[i] //发送数字段码
P2=wei //发送位码
DelayMS(300)
}
}
}
08 8只数码管动态显示多个不同字符
电路如上图
/* 名称:8只数码管动态显示多个不同字符
说明:数码管动态扫描显示0~7。
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}
//延时
void DelayMS(uint x)
{
uchart
while(x--)for(t=0t<120t++)
}
//主程序
void main()
{
uchari,wei=0x80
while(1)
{
for(i=0i<8i++)
{
P2=0xff
P0=DSY_CODE[i] //发送段码
wei=_crol_(wei,1)
P2=wei //发送位码
DelayMS(2)
}
}
}
09 8只数码管闪烁显示数字串
电路如上图
/* 名称:8只数码管闪烁显示数字串
说明:数码管闪烁显示由0~7构成的一串数字
本例用动态刷新法显示一串数字,在停止刷新时所有数字显示消失。
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//段码表
uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}
//位码表
uchar codeDSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}
//延时
void DelayMS(uint x)
{
uchart
while(x--)for(t=0t<120t++)
}
//主程序
void main()
{
uchari,j
while(1)
{
for(i=0i<30i++)
{
for(j=0j<8j++)
{
P0=0xff
P0=DSY_CODE[j] //发送段码
P2=DSY_IDX[j] //发送位码
DelayMS(2)
}
}
P2=0x00 //关闭所有数码管并延时
DelayMS(1000)
}
}
10 8只数码管滚动显示数字串
电路如上图
/* 名称:8只数码管滚动显示数字串
说明:数码管向左滚动显示3个字符构成的数字串
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//段码表
uchar codeDSY_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)
{
uchart
while(x--)for(t=0t<120t++)
}
//主程序
void main()
{
uchari,j,k=0,m=0x80
while(1)
{ //刷新若干次,保持一段时间的稳定显示
for(i=0i<15i++)
{
for(j=0j<8j++)
{ //发送段码,采用环形取法,从第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取余
}
}
11 K1-K4 控制LED移位
/* 名称:K1-K4 控制LED移位
说明:按下K1时,P0口LED上移一位;
按下K2时,P0口LED下移一位;
按下K3时,P2口LED上移一位;
按下K4时,P2口LED下移一位;
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//延时
void DelayMS(uint x)
{
uchari
while(x--)for(i=0i<120i++)
}
//根据P1口的按键移动LED
void Move_LED()
{
if ((P1&0x10)==0) P0=_cror_(P0,1) //K1
elseif((P1&0x20)==0) P0=_crol_(P0,1) //K2
elseif((P1&0x40)==0) P2=_cror_(P2,1) //K3
elseif((P1&0x80)==0) P2=_crol_(P2,1) //K4
}
//主程序
void main()
{
ucharRecent_Key//最近按键
P0=0xfe
P2=0xfe
P1=0xff
Recent_Key=0xff
while(1)
{
if(Recent_Key!=P1)
{
Recent_Key=P1 //保存最近按键
Move_LED()
DelayMS(10)
}
}
}
内容太多了,你就说哪些你不会吧,减少下工作量吧。/***********************************************************/
#define LCD XBYTE[0xffff] // 定义LCD显示的数组,这边用0xffff浪费
// 只要32就可以了
#define uint unsigned int // 宏定义“短表示”,方便书写
#define uchar unsigned char// 同上
void lcd_mwc(uchar i) // 这个函数是用来写命令的:如启动液晶
// 锁定液晶等,可以查看液晶控制字就知道
// 0xb8和0x40是什么命令了,估计是启动
/*********************************************/
// 属于函数void lcd_clear(void) 要查看液晶的规格书
uchar i // 定义液晶每页的地址个数,用来清0
uchar page // 定义液晶的Page地址(page=0xb8page<0xc0page++) // 循环清零
/*********************************************/
uchar i // 定义仿猜老传送数据的个数
for (i=16i<32i++) lcd_mwd(*(hz+i))// lcd_mwd函数的作用是通过给LCD
// 数组初始化地址,然后根兆盯据地址
// 递增将数组QING[32]等的对备升应地
// 数据传送到液晶数据口;这边是
// 循环传送后面16个数据
for (i=0i<16i++) lcd_mwd(*(hz+i)) // 同上,传送前面的16个数据
/*****************************************************************/
从你的程序上看,液晶应该由上下两块显示Page组成,然后上面的Page显示4个汉字的上半段,下面显示4个汉字的下半段,所以有8个Page,和你的void lcd_clear(void) 函数也就对应了。
void dispm_hz_down(uchar code * hz)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)