找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1793|回复: 3
打印 上一主题 下一主题
收起左侧

关于51单片机做可调方波发射器一些东西 1602屏

[复制链接]
跳转到指定楼层
楼主
#include<reg51.h>        
#define uint unsigned int   
#ifndef LCD_CHAR_1602_2005_4_9
#define LCD_CHAR_1602_2005_4_9
#include <intrins.h>   
sbit pwm=P1^0;   
sbit LcdRs  = P2^0;
sbit LcdRw  = P2^1;
sbit LcdEn  = P2^2;
sfr  DBPort = 0x80;  //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口  
//内部等待函数************************************************************************** unsigned char LCD_Wait(void)
{  LcdRs=0;  
LcdRw=1; _nop_();  
LcdEn=1; _nop_();  
while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,        //可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80      

LcdEn=0;
return DBPort;
}
//向LCD写入命令或数据************************************************************
#define LCD_COMMAND   0      // Command
#define LCD_DATA   1      // Data
#define LCD_CLEAR_SCREEN 0x01      // 清屏
#define LCD_HOMING    0x02      // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{  
LcdEn=0;  
LcdRs=style;  
LcdRw=0;  _nop_();  
DBPort=input; _nop_();//注意顺序  
LcdEn=1;  _nop_();//注意顺序  
LcdEn=0;  _nop_();

LCD_Wait();  }   
//设置显示模式************************************************************
#define LCD_SHOW   0x04    //显示开
#define LCD_HIDE   0x00    //显示关      
#define LCD_CURSOR   0x02  //显示光标
#define LCD_NO_CURSOR  0x00    //无光标         
#define LCD_FLASH   0x01    //光标闪动
#define LCD_NO_FLASH  0x00    //光标不闪动   
void LCD_SetDisplay(unsigned char DisplayMode)
{  
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);  
}   
//设置输入模式************************************************************
#define LCD_AC_UP   0x02
#define LCD_AC_DOWN   0x00      // default   
#define LCD_MOVE   0x01      // 画面可平移
#define LCD_NO_MOVE   0x00      //default   
void LCD_SetInput(unsigned char InputMode)
{  
LCD_Write(LCD_COMMAND, 0x04|InputMode); }
//移动光标或屏幕************************************************************ /*  
#define LCD_CURSOR  0x02      
#define LCD_SCREEN  0x08
#define LCD_LEFT  0x00
#define LCD_RIGHT  0x04  
void LCD_Move(unsigned char object, unsigned char direction)
{  
if(object==LCD_CURSOR)   
LCD_Write(LCD_COMMAND,0x10|direction);  
if(object==LCD_SCREEN)   
LCD_Write(LCD_COMMAND,0x18|direction);
}
*/

//初始化LCD************************************************************
void LCD_Initial()
{
LcdEn=0;
  LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵  
LCD_Write(LCD_COMMAND,0x38);  
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标  
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏  
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
}   
//************************************************************************
void GotoXY(unsigned char x, unsigned char y)
{  
if(y==0)  
LCD_Write(LCD_COMMAND,0x80|x);  
if(y==1)   
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}  
void Print(unsigned char *str)
{
   while(*str!='\0')  
{   
LCD_Write(LCD_DATA,*str);
   str++;
}
}
/*  
void LCD_LoadChar(unsigned char user[8],
unsigned char place)
{  unsigned char i;  
LCD_Write(LCD_COMMAND,0x40|(place*8));  
for(i=0; i<8; i++)   
LCD_Write(LCD_DATA,user);
} */  
//************************************************************************
#endif      
void fangbo()
{

TMOD=0x10;   //模式设置,000000110,可见采用的是定时器1,工作与模式1
(M1=0,M0=1)。
  TR0=1;    //打开定时器  
TH1=(65536-500)/256;   //定时器设置,每隔100微秒发起一次中断。  
TL1=(65536-500)%256;  
ET1=1;    //开T1溢出中断  
EA=1;     //开总中断   
TR1=1;    //等待T1溢出中断     
for(;;);   }  
void time1() interrupt 3      //T1溢出中断服务程序
{ TH1=(655536-500)/256;     // T1重新赋值  
TL1=(65536-500)%256;     
pwm=!pwm;       //输出取反
}   
unsigned char TempBuffer[10];  
void IntToStr(unsigned int t, unsigned char *str, unsigned char n)  
{  
unsigned char a[5];
char i, j;                                    
a[0]=(t/10000)%10;         //取得整数值到数组            
a[1]=(t/1000)%10;                                       
a[2]=(t/100)%10;                                         
a[3]=(t/10)%10;                                          
a[4]=(t/1)%10;                                                                                                  
for(i=0; i<5; i++)         //转成ASCII码                  
  a=a+'0';                                      
for(i=0; a=='0' && i<=3; i++);                        
for(j=5-n; j<i; j++)       //填充空格                     
{ *str=' ';  str++; }                                
for(; i<5; i++)                                          
{ *str=a; str++; }  //加入有效的数字            
*str='\0';  
}   
void Delay1ms(unsigned int count)
{  unsigned int i,j;  
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}   
main()
{      
unsigned int Count = 0;
  LCD_Initial();  
GotoXY(0,0);  
Print("Frequency 1000Hz");
GotoXY(0,1);  
Print("Period    1000uS");  
while(1)  
{   
  fangbo();   
Delay1ms(100);
}     

程序源码如上。自己第一次网上找的例子。希望能动手DIY一下。重复定义没找出来。对51单片机各个引脚理解不到位。希望能指点一下

FCXAG13B`00{D6O6Y8TP~95.png (6.49 KB, 下载次数: 53)

报错。

报错。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:148598 发表于 2016-11-18 10:14 | 只看该作者
以及后续报错如何解决
回复

使用道具 举报

板凳
ID:138155 发表于 2016-11-18 16:12 | 只看该作者
文本没有定义 所以出错
回复

使用道具 举报

地板
ID:148688 发表于 2016-11-18 17:14 | 只看该作者
有意思!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表