附protel99画的PCB原理图、PCB图、单片机代码
单片机源程序如下:
- /***********************************************************
- 共阴数码管
- ***********************************************************/
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code acLEDCS[]={0x01,0x02,0x04,0x08}; /* 位选地址码,“0”有效,位选接的是P0口低4位 */
- uchar code acLedSegCode[]={0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c};/* 段码 */
- uchar acLED[4]; /* 显示缓冲区 */
- char cScanIndex=0,flag=0; /* 位选指针0~3 */
- uchar bdata cBakP0 = 0xf0;
- uint f=0,nTimer=0,speed=0;
- void display()
- {
- //数据处理
- acLED[0]=acLedSegCode[speed/10/1000]; /* LED显示第1位 */
- acLED[1]=0x80|acLedSegCode[speed/10/100%10]; /* LED显示第2位 */
- acLED[2]=acLedSegCode[speed/10/10%10]; /* LED显示第3位 电机速率*/
- acLED[3]=acLedSegCode[speed/10%10]; /* LED显示第4位 */
- }
- void main()
- {
- TMOD= 0x15;
- TH0 =0;
- TL0 = 0;
- TR0 = 1;
- ET0 = 1;
- TH1 = (65536-49989)/256;
- TL1 = (65536-49989)%256;
- TR1 = 1;
- ET1 = 1;
- EX0 = 1; /* 允许外部中断0 */
- EA = 1; /* 开总中断 */
- while(1)
- {
-
- //*************************显示刷新******************
- display();
- P1 = 0; /* 先清显示再换位选 */
- P0 = cBakP0 | acLEDCS[cScanIndex]; /* 送位选数据 */
- P1 = acLED[cScanIndex++]; /* 送显示数据,位选指针移位 */
- cScanIndex &= 3; /* 位选指针回位 */
- if(flag==1)
- {
- flag=0;
- display();
- f=0;
- nTimer=0;
- TH0=0;
- TL0=0;
- TR0=1;
- }
- }
- }
- void IntT0() interrupt 1
- {
- f++;
- }
- void IntT1() interrupt 3
- {
- TH1 = (65536-50045)/256;
- TL1 = (65536-50045)%256;
- nTimer++;
- if(nTimer == 20)
- {
- speed =f*65536+TH0*256+TL0;
- TR0=0;
- flag=1;
- //nTimer=0;
- }
- }
- /*void Pint0() interrupt 0
- {
- } */
复制代码
所有资料51hei附件下载:
注意程序是Keil2版本的 PCB是protel99的老版本,如果你的电脑没有安装此软件 请勿下载:
信号发生器ILC8038.7z
(559.09 KB, 下载次数: 23)
|